运行深度学习语音项目
You:
- 我在运行一个基于深度学习的语音唤醒项目,这是他的项目地址:https://github.com/ObscurusGrassator/openWakeWord-cpp
我使用的设备是m1的mac,我现在想问问运行报错的原因是什么?
➜ openWakeWord-cpp git:(AndroidImplementation) ✗ make
mkdir -p build
g++ -o build/openwakeword -Ilib/arm64/include -Llib/arm64/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
src/main.cpp:12:10: fatal error: 'onnxruntime_cxx_api.h' file not found
#include <onnxruntime_cxx_api.h>
^~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make: *** [release] Error 1
➜ openWakeWord-cpp git:(AndroidImplementation) ✗
ChatGPT:
- 我在运行一个基于深度学习的语音唤醒项目,这是他的项目地址:https://github.com/ObscurusGrassator/openWakeWord-cpp
我使用的设备是m1的mac,我现在想问问运行报错的原因是什么?
➜ openWakeWord-cpp git:(AndroidImplementation) ✗ make
mkdir -p build
g++ -o build/openwakeword -Ilib/arm64/include -Llib/arm64/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
src/main.cpp:12:10: fatal error: 'onnxruntime_cxx_api.h' file not found
#include <onnxruntime_cxx_api.h>
^~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
make: *** [release] Error 1
➜ openWakeWord-cpp git:(AndroidImplementation) ✗
You:
- 你的问题是由于编译器找不到
onnxruntime_cxx_api.h头文件。这个文件是ONNX Runtime的C++ API头文件,应该位于你指定的lib/arm64/include目录下。请按照以下步骤检查和解决这个问题:
- 检查文件路径 :
确认lib/arm64/include目录下是否存在onnxruntime_cxx_api.h文件。如果没有,你可能需要从ONNX Runtime的官方发布中获取并放置到正确的目录下。 - 下载ONNX Runtime :
如果你没有安装ONNX Runtime,可以通过以下步骤下载和安装:
- 前往ONNX Runtime的官方GitHub仓库 。
- 下载适合你平台的预编译库,或者自行编译。
- 设置正确的路径 :
确认你的路径设置是正确的。如果你已经有了ONNX Runtime的头文件和库文件,请确认这些文件在正确的路径中。例如:
mkdir -p lib/arm64/include
cp /path/to/onnxruntime_cxx_api.h lib/arm64/include/
mkdir -p lib/arm64/lib
cp /path/to/libonnxruntime.dylib lib/arm64/lib/- 更新Makefile :
确认你的Makefile中的路径和库文件是正确的。你的Makefile可能需要一些修改来适应你的环境:
CXX = g++
CXXFLAGS = -Ilib/arm64/include -O2 -std=c++20 -Wall -Wextra
LDFLAGS = -Llib/arm64/lib -Wl,-rpath,'$ORIGIN'
LIBS = -lpthread -lonnxruntime
TARGET = build/openwakeword
SOURCES = src/main.cpp
all: $(TARGET)
$(TARGET): $(SOURCES)
mkdir -p build
$(CXX) -o $@ $(CXXFLAGS) $(SOURCES) $(LDFLAGS) $(LIBS)
clean:
rm -rf build- 重新编译 :
完成上述步骤后,重新运行make命令进行编译。
希望这些步骤能帮你解决问题。如果问题依然存在,请检查是否有任何额外的错误信息,并确保所有依赖库和头文件路径正确设置。
4o
ChatGPT:
- 你的问题是由于编译器找不到
onnxruntime_cxx_api.h头文件。这个文件是ONNX Runtime的C++ API头文件,应该位于你指定的lib/arm64/include目录下。请按照以下步骤检查和解决这个问题:
- 检查文件路径 :
确认lib/arm64/include目录下是否存在onnxruntime_cxx_api.h文件。如果没有,你可能需要从ONNX Runtime的官方发布中获取并放置到正确的目录下。 - 下载ONNX Runtime :
如果你没有安装ONNX Runtime,可以通过以下步骤下载和安装:
- 前往ONNX Runtime的官方GitHub仓库 。
- 下载适合你平台的预编译库,或者自行编译。
- 设置正确的路径 :
确认你的路径设置是正确的。如果你已经有了ONNX Runtime的头文件和库文件,请确认这些文件在正确的路径中。例如:
mkdir -p lib/arm64/include
cp /path/to/onnxruntime_cxx_api.h lib/arm64/include/
mkdir -p lib/arm64/lib
cp /path/to/libonnxruntime.dylib lib/arm64/lib/- 更新Makefile :
确认你的Makefile中的路径和库文件是正确的。你的Makefile可能需要一些修改来适应你的环境:
CXX = g++
CXXFLAGS = -Ilib/arm64/include -O2 -std=c++20 -Wall -Wextra
LDFLAGS = -Llib/arm64/lib -Wl,-rpath,'$ORIGIN'
LIBS = -lpthread -lonnxruntime
TARGET = build/openwakeword
SOURCES = src/main.cpp
all: $(TARGET)
$(TARGET): $(SOURCES)
mkdir -p build
$(CXX) -o $@ $(CXXFLAGS) $(SOURCES) $(LDFLAGS) $(LIBS)
clean:
rm -rf build- 重新编译 :
完成上述步骤后,重新运行make命令进行编译。
希望这些步骤能帮你解决问题。如果问题依然存在,请检查是否有任何额外的错误信息,并确保所有依赖库和头文件路径正确设置。
You:
- 这是我的项目目录结构,请问这下面的onnx文件是干嘛的?怎么使用
➜ openWakeWord-cpp git:(AndroidImplementation) ✗ tree -L 2
openWakeWord-cpp
├── LICENSE.md
├── Makefile
├── README.md
├── build
├── models
│ ├── alexa_v0.1.onnx
│ ├── embedding_model.onnx
│ ├── hey_jarvis_v0.1.onnx
│ ├── hey_marvin_v0.1.onnx
│ ├── hey_mycroft_v0.1.onnx
│ └── melspectrogram.onnx
├── openWakeWord-cpp.iml
└── src
├── CMakeLists.txt
├── android
├── main.cpp
└── main.h
ChatGPT:
- 这是我的项目目录结构,请问这下面的onnx文件是干嘛的?怎么使用
➜ openWakeWord-cpp git:(AndroidImplementation) ✗ tree -L 2
openWakeWord-cpp
├── LICENSE.md
├── Makefile
├── README.md
├── build
├── models
│ ├── alexa_v0.1.onnx
│ ├── embedding_model.onnx
│ ├── hey_jarvis_v0.1.onnx
│ ├── hey_marvin_v0.1.onnx
│ ├── hey_mycroft_v0.1.onnx
│ └── melspectrogram.onnx
├── openWakeWord-cpp.iml
└── src
├── CMakeLists.txt
├── android
├── main.cpp
└── main.h
You:
- 在你的项目目录结构中,
models文件夹下的.onnx文件是模型文件,具体如下: alexa_v0.1.onnxembedding_model.onnxhey_jarvis_v0.1.onnxhey_marvin_v0.1.onnxhey_mycroft_v0.1.onnxmelspectrogram.onnx
这些模型文件通常用于语音识别和特征提取。它们在不同的阶段被加载和执行,以实现语音唤醒的功能。
使用ONNX模型的步骤
- 加载ONNX模型 :
使用ONNX Runtime库加载模型文件。ONNX Runtime提供了C++ API,可以方便地加载和运行ONNX模型。 - 处理输入数据 :
根据模型的要求,预处理输入数据。对于语音唤醒系统,输入数据通常是音频信号。你可能需要将音频信号转换为特征表示(例如梅尔频谱图),这可能是melspectrogram.onnx模型的用途。 - 运行推理 :
将预处理后的数据输入到加载的ONNX模型中,运行推理,获取输出结果。不同的模型会有不同的输出,比如特征向量或唤醒词的概率。 - 处理输出数据 :
根据输出结果执行相应的操作。例如,如果唤醒词被正确识别,可以触发后续的应用逻辑。
具体代码示例
以下是一个示例代码,展示如何加载和运行一个ONNX模型。这个示例假设你已经正确配置了ONNX Runtime库和头文件:
#include <onnxruntime_cxx_api.h>
#include <iostream>
#include <vector>
int main() {
// Initialize ONNX Runtime environment
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
// Create an ONNX Runtime session options object
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
// Load the model
const char* model_path = "models/hey_jarvis_v0.1.onnx";
Ort::Session session(env, model_path, session_options);
// Print input node names and shapes
Ort::AllocatorWithDefaultOptions allocator;
size_t num_input_nodes = session.GetInputCount();
std::vector<const char*> input_node_names(num_input_nodes);
std::vector<std::vector<int64_t>> input_node_dims(num_input_nodes);
for (size_t i = 0; i < num_input_nodes; i++) {
// Get input node names
input_node_names[i] = session.GetInputName(i, allocator);
std::cout << "Input " << i << ": name=" << input_node_names[i] << std::endl;
// Get input node types and shapes
Ort::TypeInfo type_info = session.GetInputTypeInfo(i);
auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
input_node_dims[i] = tensor_info.GetShape();
}
// Example input data
std::vector<float> input_tensor_values = {/* your input data here */};
std::vector<int64_t> input_shape = {/* your input shape here */};
// Create input tensor
Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_values.size(), input_shape.data(), input_shape.size());
// Run the model
auto output_tensors = session.Run(Ort::RunOptions{nullptr}, input_node_names.data(), &input_tensor, 1, nullptr, 0);
// Process output
float* floatarr = output_tensors.front().GetTensorMutableData<float>();
for (size_t i = 0; i < output_tensors.front().GetTensorTypeAndShapeInfo().GetElementCount(); i++) {
std::cout << "Output value " << i << ": " << floatarr[i] << std::endl;
}
return 0;
}解决当前报错的方法
根据之前的问题描述,你的编译器找不到onnxruntime_cxx_api.h头文件。请确保以下几点:
- 确认路径正确 :
确认lib/arm64/include目录下确实存在onnxruntime_cxx_api.h头文件。 - 更新路径 :
如果文件不在正确的位置,请将其放置到正确的目录中。你可以通过以下命令检查和复制文件:
cp /path/to/onnxruntime/include/onnxruntime/core/session/onnxruntime_cxx_api.h lib/arm64/include/- 编译项目 :
确认路径无误后,重新运行make命令进行编译:
make希望这些信息能帮助你解决问题。如果你需要更多帮助,请提供更多的错误信息或上下文。
4o
ChatGPT:
- 在你的项目目录结构中,
models文件夹下的.onnx文件是模型文件,具体如下: alexa_v0.1.onnxembedding_model.onnxhey_jarvis_v0.1.onnxhey_marvin_v0.1.onnxhey_mycroft_v0.1.onnxmelspectrogram.onnx
这些模型文件通常用于语音识别和特征提取。它们在不同的阶段被加载和执行,以实现语音唤醒的功能。
使用ONNX模型的步骤
- 加载ONNX模型 :
使用ONNX Runtime库加载模型文件。ONNX Runtime提供了C++ API,可以方便地加载和运行ONNX模型。 - 处理输入数据 :
根据模型的要求,预处理输入数据。对于语音唤醒系统,输入数据通常是音频信号。你可能需要将音频信号转换为特征表示(例如梅尔频谱图),这可能是melspectrogram.onnx模型的用途。 - 运行推理 :
将预处理后的数据输入到加载的ONNX模型中,运行推理,获取输出结果。不同的模型会有不同的输出,比如特征向量或唤醒词的概率。 - 处理输出数据 :
根据输出结果执行相应的操作。例如,如果唤醒词被正确识别,可以触发后续的应用逻辑。
具体代码示例
以下是一个示例代码,展示如何加载和运行一个ONNX模型。这个示例假设你已经正确配置了ONNX Runtime库和头文件:
#include <onnxruntime_cxx_api.h>
#include <iostream>
#include <vector>
int main() {
// Initialize ONNX Runtime environment
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
// Create an ONNX Runtime session options object
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
// Load the model
const char* model_path = "models/hey_jarvis_v0.1.onnx";
Ort::Session session(env, model_path, session_options);
// Print input node names and shapes
Ort::AllocatorWithDefaultOptions allocator;
size_t num_input_nodes = session.GetInputCount();
std::vector<const char*> input_node_names(num_input_nodes);
std::vector<std::vector<int64_t>> input_node_dims(num_input_nodes);
for (size_t i = 0; i < num_input_nodes; i++) {
// Get input node names
input_node_names[i] = session.GetInputName(i, allocator);
std::cout << "Input " << i << ": name=" << input_node_names[i] << std::endl;
// Get input node types and shapes
Ort::TypeInfo type_info = session.GetInputTypeInfo(i);
auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
input_node_dims[i] = tensor_info.GetShape();
}
// Example input data
std::vector<float> input_tensor_values = {/* your input data here */};
std::vector<int64_t> input_shape = {/* your input shape here */};
// Create input tensor
Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_values.size(), input_shape.data(), input_shape.size());
// Run the model
auto output_tensors = session.Run(Ort::RunOptions{nullptr}, input_node_names.data(), &input_tensor, 1, nullptr, 0);
// Process output
float* floatarr = output_tensors.front().GetTensorMutableData<float>();
for (size_t i = 0; i < output_tensors.front().GetTensorTypeAndShapeInfo().GetElementCount(); i++) {
std::cout << "Output value " << i << ": " << floatarr[i] << std::endl;
}
return 0;
}解决当前报错的方法
根据之前的问题描述,你的编译器找不到onnxruntime_cxx_api.h头文件。请确保以下几点:
- 确认路径正确 :
确认lib/arm64/include目录下确实存在onnxruntime_cxx_api.h头文件。 - 更新路径 :
如果文件不在正确的位置,请将其放置到正确的目录中。你可以通过以下命令检查和复制文件:
cp /path/to/onnxruntime/include/onnxruntime/core/session/onnxruntime_cxx_api.h lib/arm64/include/- 编译项目 :
确认路径无误后,重新运行make命令进行编译:
make希望这些信息能帮助你解决问题。如果你需要更多帮助,请提供更多的错误信息或上下文。
You:
- lib/arm64是linux的写法,我是m1的mac,我不清楚我的c++包位于哪个文件,你应该针对我的设备给我提出相应的意见
2/2
ChatGPT:
- lib/arm64是linux的写法,我是m1的mac,我不清楚我的c++包位于哪个文件,你应该针对我的设备给我提出相应的意见
You:
- 针对你的M1 Mac设备,请参考以下步骤来解决编译问题:
- 安装ONNX Runtime :
在M1 Mac上,你可以使用Homebrew来安装ONNX Runtime。首先,确保你已经安装了Homebrew,然后执行以下命令:
brew install onnxruntime- 查找头文件和库文件 :
Homebrew通常会将头文件和库文件安装在/opt/homebrew/目录下。安装完成后,头文件和库文件的路径可能类似于以下路径:
- 头文件:
/opt/homebrew/include/onnxruntime/core/session/onnxruntime_cxx_api.h - 库文件:
/opt/homebrew/lib/libonnxruntime.dylib
- 更新Makefile :
修改你的Makefile,将头文件和库文件的路径指向Homebrew安装的位置。假设上述路径正确,你的Makefile应类似如下:
CXX = g++
CXXFLAGS = -I/opt/homebrew/include -O2 -std=c++20 -Wall -Wextra
LDFLAGS = -L/opt/homebrew/lib -Wl,-rpath,'$ORIGIN'
LIBS = -lpthread -lonnxruntime
TARGET = build/openwakeword
SOURCES = src/main.cpp
all: $(TARGET)
$(TARGET): $(SOURCES)
mkdir -p build
$(CXX) -o $@ $(CXXFLAGS) $(SOURCES) $(LDFLAGS) $(LIBS)
clean:
rm -rf build- 编译项目 :
完成上述修改后,尝试重新运行make命令进行编译:
make验证路径
确保路径正确,验证安装后的文件路径,例如:
ls /opt/homebrew/include/onnxruntime/core/session/onnxruntime_cxx_api.h
ls /opt/homebrew/lib/libonnxruntime.dylib如果这些文件存在并且路径正确,make命令应该能成功编译。
示例代码调整
根据上述Makefile,以下是简化后的代码示例,演示如何在你的项目中使用ONNX Runtime:
#include <onnxruntime_cxx_api.h>
#include <iostream>
#include <vector>
int main() {
// Initialize ONNX Runtime environment
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
// Create an ONNX Runtime session options object
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
// Load the model
const char* model_path = "models/hey_jarvis_v0.1.onnx";
Ort::Session session(env, model_path, session_options);
// Print input node names and shapes
Ort::AllocatorWithDefaultOptions allocator;
size_t num_input_nodes = session.GetInputCount();
std::vector<const char*> input_node_names(num_input_nodes);
std::vector<std::vector<int64_t>> input_node_dims(num_input_nodes);
for (size_t i = 0; i < num_input_nodes; i++) {
// Get input node names
input_node_names[i] = session.GetInputName(i, allocator);
std::cout << "Input " << i << ": name=" << input_node_names[i] << std::endl;
// Get input node types and shapes
Ort::TypeInfo type_info = session.GetInputTypeInfo(i);
auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
input_node_dims[i] = tensor_info.GetShape();
}
// Example input data
std::vector<float> input_tensor_values = {/* your input data here */};
std::vector<int64_t> input_shape = {/* your input shape here */};
// Create input tensor
Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_values.size(), input_shape.data(), input_shape.size());
// Run the model
auto output_tensors = session.Run(Ort::RunOptions{nullptr}, input_node_names.data(), &input_tensor, 1, nullptr, 0);
// Process output
float* floatarr = output_tensors.front().GetTensorMutableData<float>();
for (size_t i = 0; i < output_tensors.front().GetTensorTypeAndShapeInfo().GetElementCount(); i++) {
std::cout << "Output value " << i << ": " << floatarr[i] << std::endl;
}
return 0;
}希望这些步骤能够帮助你在M1 Mac上正确编译和运行你的项目。如果你遇到任何问题,请随时反馈具体的错误信息,以便进一步协助你解决问题。
4o
ChatGPT:
- 针对你的M1 Mac设备,请参考以下步骤来解决编译问题:
- 安装ONNX Runtime :
在M1 Mac上,你可以使用Homebrew来安装ONNX Runtime。首先,确保你已经安装了Homebrew,然后执行以下命令:
brew install onnxruntime- 查找头文件和库文件 :
Homebrew通常会将头文件和库文件安装在/opt/homebrew/目录下。安装完成后,头文件和库文件的路径可能类似于以下路径:
- 头文件:
/opt/homebrew/include/onnxruntime/core/session/onnxruntime_cxx_api.h - 库文件:
/opt/homebrew/lib/libonnxruntime.dylib
- 更新Makefile :
修改你的Makefile,将头文件和库文件的路径指向Homebrew安装的位置。假设上述路径正确,你的Makefile应类似如下:
CXX = g++
CXXFLAGS = -I/opt/homebrew/include -O2 -std=c++20 -Wall -Wextra
LDFLAGS = -L/opt/homebrew/lib -Wl,-rpath,'$ORIGIN'
LIBS = -lpthread -lonnxruntime
TARGET = build/openwakeword
SOURCES = src/main.cpp
all: $(TARGET)
$(TARGET): $(SOURCES)
mkdir -p build
$(CXX) -o $@ $(CXXFLAGS) $(SOURCES) $(LDFLAGS) $(LIBS)
clean:
rm -rf build- 编译项目 :
完成上述修改后,尝试重新运行make命令进行编译:
make验证路径
确保路径正确,验证安装后的文件路径,例如:
ls /opt/homebrew/include/onnxruntime/core/session/onnxruntime_cxx_api.h
ls /opt/homebrew/lib/libonnxruntime.dylib如果这些文件存在并且路径正确,make命令应该能成功编译。
示例代码调整
根据上述Makefile,以下是简化后的代码示例,演示如何在你的项目中使用ONNX Runtime:
#include <onnxruntime_cxx_api.h>
#include <iostream>
#include <vector>
int main() {
// Initialize ONNX Runtime environment
Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");
// Create an ONNX Runtime session options object
Ort::SessionOptions session_options;
session_options.SetIntraOpNumThreads(1);
// Load the model
const char* model_path = "models/hey_jarvis_v0.1.onnx";
Ort::Session session(env, model_path, session_options);
// Print input node names and shapes
Ort::AllocatorWithDefaultOptions allocator;
size_t num_input_nodes = session.GetInputCount();
std::vector<const char*> input_node_names(num_input_nodes);
std::vector<std::vector<int64_t>> input_node_dims(num_input_nodes);
for (size_t i = 0; i < num_input_nodes; i++) {
// Get input node names
input_node_names[i] = session.GetInputName(i, allocator);
std::cout << "Input " << i << ": name=" << input_node_names[i] << std::endl;
// Get input node types and shapes
Ort::TypeInfo type_info = session.GetInputTypeInfo(i);
auto tensor_info = type_info.GetTensorTypeAndShapeInfo();
input_node_dims[i] = tensor_info.GetShape();
}
// Example input data
std::vector<float> input_tensor_values = {/* your input data here */};
std::vector<int64_t> input_shape = {/* your input shape here */};
// Create input tensor
Ort::MemoryInfo memory_info = Ort::MemoryInfo::CreateCpu(OrtArenaAllocator, OrtMemTypeDefault);
Ort::Value input_tensor = Ort::Value::CreateTensor<float>(memory_info, input_tensor_values.data(), input_tensor_values.size(), input_shape.data(), input_shape.size());
// Run the model
auto output_tensors = session.Run(Ort::RunOptions{nullptr}, input_node_names.data(), &input_tensor, 1, nullptr, 0);
// Process output
float* floatarr = output_tensors.front().GetTensorMutableData<float>();
for (size_t i = 0; i < output_tensors.front().GetTensorTypeAndShapeInfo().GetElementCount(); i++) {
std::cout << "Output value " << i << ": " << floatarr[i] << std::endl;
}
return 0;
}希望这些步骤能够帮助你在M1 Mac上正确编译和运行你的项目。如果你遇到任何问题,请随时反馈具体的错误信息,以便进一步协助你解决问题。
You:

已上传的图片
我这样安装的onnxruntime_cxx_api包并没有被正确的识别,应该看一下我项目引用的其他的c++头文件在电脑上什么位置吧,至于我brew安装的onnxruntime_cxx_api包并没有被正确的识别,那我c++该怎么下载这个包呢?
ChatGPT:

已上传的图片
我这样安装的onnxruntime_cxx_api包并没有被正确的识别,应该看一下我项目引用的其他的c++头文件在电脑上什么位置吧,至于我brew安装的onnxruntime_cxx_api包并没有被正确的识别,那我c++该怎么下载这个包呢?
You:
- 你所提供的截图显示了系统上的C++头文件路径。你需要确保ONNX Runtime的头文件和库文件路径与这些系统路径匹配。
检查ONNX Runtime安装路径
首先,确认ONNX Runtime是否正确安装。你可以通过以下命令来查找ONNX Runtime头文件和库文件的路径:
brew list onnxruntime这个命令将列出所有与ONNX Runtime相关的文件和路径。确保你可以看到头文件(例如onnxruntime_cxx_api.h)和库文件(例如libonnxruntime.dylib)的路径。
设置正确的头文件和库文件路径
根据Homebrew的默认安装路径,头文件和库文件应该位于/opt/homebrew/目录下。你可以使用以下步骤来确保你的项目能够正确引用这些文件。
- 查找头文件和库文件路径 :
确认这些文件的实际路径,例如:
/opt/homebrew/include/onnxruntime/core/session/onnxruntime_cxx_api.h
/opt/homebrew/lib/libonnxruntime.dylib- 更新Makefile :
修改你的Makefile,以确保编译器可以找到这些文件。假设上述路径正确,Makefile应如下所示:
CXX = g++
CXXFLAGS = -I/opt/homebrew/include -O2 -std=c++20 -Wall -Wextra
LDFLAGS = -L/opt/homebrew/lib -Wl,-rpath,'$ORIGIN'
LIBS = -lpthread -lonnxruntime
TARGET = build/openwakeword
SOURCES = src/main.cpp
all: $(TARGET)
$(TARGET): $(SOURCES)
mkdir -p build
$(CXX) -o $@ $(CXXFLAGS) $(SOURCES) $(LDFLAGS) $(LIBS)
clean:
rm -rf build- 验证头文件路径 :
确认头文件路径正确。例如,检查头文件是否存在:
ls /opt/homebrew/include/onnxruntime/core/session/onnxruntime_cxx_api.h如果文件存在且路径正确,编译器应该能够找到它。
手动下载和配置ONNX Runtime
如果Homebrew无法正确安装ONNX Runtime,你也可以手动下载并配置:
- 下载ONNX Runtime :
前往ONNX Runtime的GitHub仓库 并下载适合macOS的预编译库,或自行编译。
2. 解压并设置路径 :
将下载的文件解压到一个合适的位置,例如~/onnxruntime.
tar -xzvf onnxruntime-osx.tar.gz -C ~/onnxruntime- 更新Makefile :
修改Makefile,以引用手动安装的ONNX Runtime路径:
CXX = g++
CXXFLAGS = -I~/onnxruntime/include -O2 -std=c++20 -Wall -Wextra
LDFLAGS = -L~/onnxruntime/lib -Wl,-rpath,'$ORIGIN'
LIBS = -lpthread -lonnxruntime
TARGET = build/openwakeword
SOURCES = src/main.cpp
all: $(TARGET)
$(TARGET): $(SOURCES)
mkdir -p build
$(CXX) -o $@ $(CXXFLAGS) $(SOURCES) $(LDFLAGS) $(LIBS)
clean:
rm -rf build- 编译项目 :
确认路径无误后,重新运行make命令进行编译:
make验证安装
确认你能成功编译并链接ONNX Runtime库。如果仍然有问题,提供具体的错误信息可以帮助进一步诊断问题。
4o
ChatGPT:
- 你所提供的截图显示了系统上的C++头文件路径。你需要确保ONNX Runtime的头文件和库文件路径与这些系统路径匹配。
检查ONNX Runtime安装路径
首先,确认ONNX Runtime是否正确安装。你可以通过以下命令来查找ONNX Runtime头文件和库文件的路径:
brew list onnxruntime这个命令将列出所有与ONNX Runtime相关的文件和路径。确保你可以看到头文件(例如onnxruntime_cxx_api.h)和库文件(例如libonnxruntime.dylib)的路径。
设置正确的头文件和库文件路径
根据Homebrew的默认安装路径,头文件和库文件应该位于/opt/homebrew/目录下。你可以使用以下步骤来确保你的项目能够正确引用这些文件。
- 查找头文件和库文件路径 :
确认这些文件的实际路径,例如:
/opt/homebrew/include/onnxruntime/core/session/onnxruntime_cxx_api.h
/opt/homebrew/lib/libonnxruntime.dylib- 更新Makefile :
修改你的Makefile,以确保编译器可以找到这些文件。假设上述路径正确,Makefile应如下所示:
CXX = g++
CXXFLAGS = -I/opt/homebrew/include -O2 -std=c++20 -Wall -Wextra
LDFLAGS = -L/opt/homebrew/lib -Wl,-rpath,'$ORIGIN'
LIBS = -lpthread -lonnxruntime
TARGET = build/openwakeword
SOURCES = src/main.cpp
all: $(TARGET)
$(TARGET): $(SOURCES)
mkdir -p build
$(CXX) -o $@ $(CXXFLAGS) $(SOURCES) $(LDFLAGS) $(LIBS)
clean:
rm -rf build- 验证头文件路径 :
确认头文件路径正确。例如,检查头文件是否存在:
ls /opt/homebrew/include/onnxruntime/core/session/onnxruntime_cxx_api.h如果文件存在且路径正确,编译器应该能够找到它。
手动下载和配置ONNX Runtime
如果Homebrew无法正确安装ONNX Runtime,你也可以手动下载并配置:
- 下载ONNX Runtime :
前往ONNX Runtime的GitHub仓库 并下载适合macOS的预编译库,或自行编译。
2. 解压并设置路径 :
将下载的文件解压到一个合适的位置,例如~/onnxruntime.
tar -xzvf onnxruntime-osx.tar.gz -C ~/onnxruntime- 更新Makefile :
修改Makefile,以引用手动安装的ONNX Runtime路径:
CXX = g++
CXXFLAGS = -I~/onnxruntime/include -O2 -std=c++20 -Wall -Wextra
LDFLAGS = -L~/onnxruntime/lib -Wl,-rpath,'$ORIGIN'
LIBS = -lpthread -lonnxruntime
TARGET = build/openwakeword
SOURCES = src/main.cpp
all: $(TARGET)
$(TARGET): $(SOURCES)
mkdir -p build
$(CXX) -o $@ $(CXXFLAGS) $(SOURCES) $(LDFLAGS) $(LIBS)
clean:
rm -rf build- 编译项目 :
确认路径无误后,重新运行make命令进行编译:
make验证安装
确认你能成功编译并链接ONNX Runtime库。如果仍然有问题,提供具体的错误信息可以帮助进一步诊断问题。
You:

已上传的图片
这么多版本,哪个才是m1 mac能下载的版本?我想把这个包直接下载到我们的项目目录下面来运行,另外这是我的现在的makefile文件,只适用于linux系统,现在请你做相对应的修改使得他可以在m1 mac系统下运行:
.PHONY: release debug clean
ARCH := (ARCH)
release:
mkdir -p build
g++ -o build/openwakeword -I(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/
ChatGPT:

已上传的图片
这么多版本,哪个才是m1 mac能下载的版本?我想把这个包直接下载到我们的项目目录下面来运行,另外这是我的现在的makefile文件,只适用于linux系统,现在请你做相对应的修改使得他可以在m1 mac系统下运行:
.PHONY: release debug clean
ARCH := (ARCH)
release:
mkdir -p build
g++ -o build/openwakeword -I(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/
You:
- 针对你的问题和需求,我们可以选择适用于M1 Mac的ONNX Runtime版本,并调整Makefile使其能够在M1 Mac系统上正确运行。
选择适用的ONNX Runtime版本
从你的截图来看,适用于M1 Mac的ONNX Runtime版本是:
onnxruntime-osx-arm64-1.17.3.tgz
下载这个版本并解压到你的项目目录中:
wget https://github.com/microsoft/onnxruntime/releases/download/v1.17.3/onnxruntime-osx-arm64-1.17.3.tgz
tar -xzvf onnxruntime-osx-arm64-1.17.3.tgz -C ./lib修改Makefile
将Makefile修改为适用于macOS系统,并引用下载的ONNX Runtime库和头文件。假设你已经将ONNX Runtime解压到lib/arm64目录下,以下是更新后的Makefile:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'@loader_path' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/目录结构
确保你的目录结构如下:
openWakeWord-cpp
├── LICENSE.md
├── Makefile
├── README.md
├── build
├── lib
│ └── arm64
│ ├── include
│ │ └── onnxruntime
│ │ └── core
│ │ └── session
│ │ └── onnxruntime_cxx_api.h
│ ├── lib
│ │ ├── libonnxruntime.dylib
│ │ └── ...
├── models
│ ├── alexa_v0.1.onnx
│ ├── embedding_model.onnx
│ ├── hey_jarvis_v0.1.onnx
│ ├── hey_marvin_v0.1.onnx
│ ├── hey_mycroft_v0.1.onnx
│ └── melspectrogram.onnx
├── src
│ ├── CMakeLists.txt
│ ├── android
│ ├── main.cpp
│ └── main.h
└── openWakeWord-cpp.iml编译和运行
确保路径正确后,执行以下命令进行编译:
make release验证编译
确保编译成功后,运行生成的可执行文件:
./build/openwakeword如果你遇到任何问题,请提供具体的错误信息以便进一步诊断和解决问题。
1/2
4o
ChatGPT:
- 针对你的问题和需求,我们可以选择适用于M1 Mac的ONNX Runtime版本,并调整Makefile使其能够在M1 Mac系统上正确运行。
选择适用的ONNX Runtime版本
从你的截图来看,适用于M1 Mac的ONNX Runtime版本是:
onnxruntime-osx-arm64-1.17.3.tgz
下载这个版本并解压到你的项目目录中:
wget https://github.com/microsoft/onnxruntime/releases/download/v1.17.3/onnxruntime-osx-arm64-1.17.3.tgz
tar -xzvf onnxruntime-osx-arm64-1.17.3.tgz -C ./lib修改Makefile
将Makefile修改为适用于macOS系统,并引用下载的ONNX Runtime库和头文件。假设你已经将ONNX Runtime解压到lib/arm64目录下,以下是更新后的Makefile:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'@loader_path' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/目录结构
确保你的目录结构如下:
openWakeWord-cpp
├── LICENSE.md
├── Makefile
├── README.md
├── build
├── lib
│ └── arm64
│ ├── include
│ │ └── onnxruntime
│ │ └── core
│ │ └── session
│ │ └── onnxruntime_cxx_api.h
│ ├── lib
│ │ ├── libonnxruntime.dylib
│ │ └── ...
├── models
│ ├── alexa_v0.1.onnx
│ ├── embedding_model.onnx
│ ├── hey_jarvis_v0.1.onnx
│ ├── hey_marvin_v0.1.onnx
│ ├── hey_mycroft_v0.1.onnx
│ └── melspectrogram.onnx
├── src
│ ├── CMakeLists.txt
│ ├── android
│ ├── main.cpp
│ └── main.h
└── openWakeWord-cpp.iml编译和运行
确保路径正确后,执行以下命令进行编译:
make release验证编译
确保编译成功后,运行生成的可执行文件:
./build/openwakeword如果你遇到任何问题,请提供具体的错误信息以便进一步诊断和解决问题。
You:
- ➜ openWakeWord-cpp git:(AndroidImplementation) wget https://github.com/microsoft/onnxruntime/releases/download/v1.17.3/onnxruntime-osx-arm64-1.17.3.tgz
zsh: command not found: wget
ChatGPT:
- ➜ openWakeWord-cpp git:(AndroidImplementation) wget https://github.com/microsoft/onnxruntime/releases/download/v1.17.3/onnxruntime-osx-arm64-1.17.3.tgz
zsh: command not found: wget
You:
- 如果你的系统没有安装
wget,你可以使用curl来下载文件。以下是如何使用curl下载并解压ONNX Runtime文件的步骤:
- 下载ONNX Runtime :
curl -L -o onnxruntime-osx-arm64-1.17.3.tgz https://github.com/microsoft/onnxruntime/releases/download/v1.17.3/onnxruntime-osx-arm64-1.17.3.tgz- 解压ONNX Runtime :
mkdir -p lib/arm64
tar -xzvf onnxruntime-osx-arm64-1.17.3.tgz -C lib/arm64 --strip-components=1- 修改Makefile :
更新Makefile以适应M1 Mac环境:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/- 编译项目 :
在项目目录中运行以下命令进行编译:
make release上述步骤将下载、解压并配置ONNX Runtime库以便在M1 Mac上使用,并将更新的Makefile用于项目编译。如果在任何步骤中遇到问题,请提供具体的错误信息以便进一步协助。
4o
ChatGPT:
- 如果你的系统没有安装
wget,你可以使用curl来下载文件。以下是如何使用curl下载并解压ONNX Runtime文件的步骤:
- 下载ONNX Runtime :
curl -L -o onnxruntime-osx-arm64-1.17.3.tgz https://github.com/microsoft/onnxruntime/releases/download/v1.17.3/onnxruntime-osx-arm64-1.17.3.tgz- 解压ONNX Runtime :
mkdir -p lib/arm64
tar -xzvf onnxruntime-osx-arm64-1.17.3.tgz -C lib/arm64 --strip-components=1- 修改Makefile :
更新Makefile以适应M1 Mac环境:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/- 编译项目 :
在项目目录中运行以下命令进行编译:
make release上述步骤将下载、解压并配置ONNX Runtime库以便在M1 Mac上使用,并将更新的Makefile用于项目编译。如果在任何步骤中遇到问题,请提供具体的错误信息以便进一步协助。
You:
- 这里还有一个报错是为啥?代码是这个#include <jni.h>
报错如下:
基于 configurationProvider 设置提供的信息检测到 #include 错误。已针对此翻译单元(/Users/jiejaitt/Desktop/openWakeWord-cpp/src/main.h)禁用波形曲线。
ChatGPT:
- 这里还有一个报错是为啥?代码是这个#include <jni.h>
报错如下:
基于 configurationProvider 设置提供的信息检测到 #include 错误。已针对此翻译单元(/Users/jiejaitt/Desktop/openWakeWord-cpp/src/main.h)禁用波形曲线。
You:
#include <jni.h>错误通常意味着系统找不到Java Native Interface (JNI)的头文件。对于macOS上的M1设备,你需要确保Java开发工具包(JDK)正确安装,并且配置文件路径以便编译器能找到这些头文件。
以下是解决这个问题的步骤:
1. 安装JDK
如果你还没有安装JDK,可以使用Homebrew安装:
brew install openjdk2. 查找JDK路径
使用以下命令查找JDK的安装路径:
/usr/libexec/java_home这将返回JDK的根目录,例如:/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
3. 更新Makefile
你需要在Makefile中指定JNI头文件的路径。在Makefile中添加包含路径和库路径:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JDKDIR := $(shell /usr/libexec/java_home)
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JDKDIR)/include -I$(JDKDIR)/include/darwin -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/4. 编译项目
运行以下命令进行编译:
make release验证头文件路径
确保路径正确,验证头文件是否存在。例如:
ls $(JDKDIR)/include/jni.h
ls $(JDKDIR)/include/darwin/jni_md.h如果文件存在且路径正确,编译器应该能够找到它们。
如果仍有问题
- 确保JDK正确安装 :
确保你安装的是正确版本的JDK,并且系统环境变量已正确配置。 - 检查环境变量 :
确保JAVA_HOME环境变量已正确设置,可以在终端中执行以下命令:
echo $JAVA_HOME如果没有输出,或者输出错误路径,设置JAVA_HOME:
export JAVA_HOME=$(/usr/libexec/java_home)并将其添加到你的shell配置文件(例如.zshrc或.bashrc)中:
echo 'export JAVA_HOME=$(/usr/libexec/java_home)' >> ~/.zshrc
source ~/.zshrc希望这些步骤能帮助你解决编译错误。如果问题依然存在,请提供更多详细信息以便进一步诊断。
4o
ChatGPT:
#include <jni.h>错误通常意味着系统找不到Java Native Interface (JNI)的头文件。对于macOS上的M1设备,你需要确保Java开发工具包(JDK)正确安装,并且配置文件路径以便编译器能找到这些头文件。
以下是解决这个问题的步骤:
1. 安装JDK
如果你还没有安装JDK,可以使用Homebrew安装:
brew install openjdk2. 查找JDK路径
使用以下命令查找JDK的安装路径:
/usr/libexec/java_home这将返回JDK的根目录,例如:/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
3. 更新Makefile
你需要在Makefile中指定JNI头文件的路径。在Makefile中添加包含路径和库路径:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JDKDIR := $(shell /usr/libexec/java_home)
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JDKDIR)/include -I$(JDKDIR)/include/darwin -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/4. 编译项目
运行以下命令进行编译:
make release验证头文件路径
确保路径正确,验证头文件是否存在。例如:
ls $(JDKDIR)/include/jni.h
ls $(JDKDIR)/include/darwin/jni_md.h如果文件存在且路径正确,编译器应该能够找到它们。
如果仍有问题
- 确保JDK正确安装 :
确保你安装的是正确版本的JDK,并且系统环境变量已正确配置。 - 检查环境变量 :
确保JAVA_HOME环境变量已正确设置,可以在终端中执行以下命令:
echo $JAVA_HOME如果没有输出,或者输出错误路径,设置JAVA_HOME:
export JAVA_HOME=$(/usr/libexec/java_home)并将其添加到你的shell配置文件(例如.zshrc或.bashrc)中:
echo 'export JAVA_HOME=$(/usr/libexec/java_home)' >> ~/.zshrc
source ~/.zshrc希望这些步骤能帮助你解决编译错误。如果问题依然存在,请提供更多详细信息以便进一步诊断。
You:
- 我想把#include <jni.h>安装到我的项目目录下面可以吗?
ChatGPT:
- 我想把#include <jni.h>安装到我的项目目录下面可以吗?
You:
- 是的,你可以将
jni.h头文件安装到你的项目目录下并配置你的编译器来查找这些文件。下面是一个具体的步骤来实现这一点。
步骤:
- 下载和复制JNI头文件
如果你已经安装了JDK,你可以复制所需的JNI头文件到你的项目目录下。例如:
mkdir -p /path/to/your/project/lib/jni
cp $(/usr/libexec/java_home)/include/jni.h /path/to/your/project/lib/jni/
cp $(/usr/libexec/java_home)/include/darwin/jni_md.h /path/to/your/project/lib/jni/这将创建一个名为lib/jni的目录并将jni.h和jni_md.h文件复制到该目录中。
2. 更新Makefile
更新你的Makefile以包含新的JNI头文件路径。
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JNIDIR := lib/jni
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JNIDIR) -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/- 编译项目
在项目目录中运行以下命令进行编译:
make release验证
确保文件被正确复制和包含路径正确。如果在编译过程中仍然遇到#include <jni.h>错误,检查文件是否正确复制,并且确保Makefile中包含路径设置无误。
示例
假设你的项目目录结构如下:
openWakeWord-cpp
├── LICENSE.md
├── Makefile
├── README.md
├── build
├── lib
│ ├── arm64
│ │ ├── include
│ │ └── lib
│ └── jni
│ ├── jni.h
│ └── jni_md.h
├── models
│ ├── alexa_v0.1.onnx
│ ├── embedding_model.onnx
│ ├── hey_jarvis_v0.1.onnx
│ ├── hey_marvin_v0.1.onnx
│ ├── hey_mycroft_v0.1.onnx
│ └── melspectrogram.onnx
├── openWakeWord-cpp.iml
└── src
├── CMakeLists.txt
├── android
├── main.cpp
└── main.hMakefile配置
确保Makefile中的路径配置正确:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JNIDIR := lib/jni
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JNIDIR) -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/这样,jni.h文件会在编译时被正确包含,从而避免缺少JNI头文件的错误。
4o
ChatGPT:
- 是的,你可以将
jni.h头文件安装到你的项目目录下并配置你的编译器来查找这些文件。下面是一个具体的步骤来实现这一点。
步骤:
- 下载和复制JNI头文件
如果你已经安装了JDK,你可以复制所需的JNI头文件到你的项目目录下。例如:
mkdir -p /path/to/your/project/lib/jni
cp $(/usr/libexec/java_home)/include/jni.h /path/to/your/project/lib/jni/
cp $(/usr/libexec/java_home)/include/darwin/jni_md.h /path/to/your/project/lib/jni/这将创建一个名为lib/jni的目录并将jni.h和jni_md.h文件复制到该目录中。
2. 更新Makefile
更新你的Makefile以包含新的JNI头文件路径。
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JNIDIR := lib/jni
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JNIDIR) -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/- 编译项目
在项目目录中运行以下命令进行编译:
make release验证
确保文件被正确复制和包含路径正确。如果在编译过程中仍然遇到#include <jni.h>错误,检查文件是否正确复制,并且确保Makefile中包含路径设置无误。
示例
假设你的项目目录结构如下:
openWakeWord-cpp
├── LICENSE.md
├── Makefile
├── README.md
├── build
├── lib
│ ├── arm64
│ │ ├── include
│ │ └── lib
│ └── jni
│ ├── jni.h
│ └── jni_md.h
├── models
│ ├── alexa_v0.1.onnx
│ ├── embedding_model.onnx
│ ├── hey_jarvis_v0.1.onnx
│ ├── hey_marvin_v0.1.onnx
│ ├── hey_mycroft_v0.1.onnx
│ └── melspectrogram.onnx
├── openWakeWord-cpp.iml
└── src
├── CMakeLists.txt
├── android
├── main.cpp
└── main.hMakefile配置
确保Makefile中的路径配置正确:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JNIDIR := lib/jni
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JNIDIR) -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/这样,jni.h文件会在编译时被正确包含,从而避免缺少JNI头文件的错误。
You:
- ➜ openWakeWord-cpp git:(AndroidImplementation) ✗ find /opt/homebrew/Cellar/openjdk -name jni.h
/opt/homebrew/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/Home/include/jni.h
/opt/homebrew/Cellar/openjdk/21.0.3/include/jni.h
ChatGPT:
- ➜ openWakeWord-cpp git:(AndroidImplementation) ✗ find /opt/homebrew/Cellar/openjdk -name jni.h
/opt/homebrew/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/Home/include/jni.h
/opt/homebrew/Cellar/openjdk/21.0.3/include/jni.h
You:
- 好的,既然你已经找到
jni.h的路径,我们可以按照之前的计划将jni.h和相关文件复制到项目目录下,并更新Makefile。
1. 复制JNI头文件
将jni.h和jni_md.h文件复制到项目目录下的lib/jni目录中:
mkdir -p /path/to/your/project/lib/jni
cp /opt/homebrew/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/Home/include/jni.h /path/to/your/project/lib/jni/
cp /opt/homebrew/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/Home/include/darwin/jni_md.h /path/to/your/project/lib/jni/2. 更新Makefile
在Makefile中添加JNI头文件路径:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JNIDIR := lib/jni
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JNIDIR) -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/3. 编译项目
在项目目录中运行以下命令进行编译:
make release验证
确保文件被正确复制,并且路径设置无误。如果在编译过程中仍然遇到#include <jni.h>错误,请检查文件是否正确复制,并确认Makefile中包含路径设置正确。
示例目录结构
假设你的项目目录结构如下:
openWakeWord-cpp
├── LICENSE.md
├── Makefile
├── README.md
├── build
├── lib
│ ├── arm64
│ │ ├── include
│ │ └── lib
│ └── jni
│ ├── jni.h
│ └── jni_md.h
├── models
│ ├── alexa_v0.1.onnx
│ ├── embedding_model.onnx
│ ├── hey_jarvis_v0.1.onnx
│ ├── hey_marvin_v0.1.onnx
│ ├── hey_mycroft_v0.1.onnx
│ └── melspectrogram.onnx
├── openWakeWord-cpp.iml
└── src
├── CMakeLists.txt
├── android
├── main.cpp
└── main.h在Makefile中,确保JNIDIR路径设置正确:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JNIDIR := lib/jni
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JNIDIR) -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/这样,你的项目应该可以在M1 Mac上编译和运行。
4o
ChatGPT:
- 好的,既然你已经找到
jni.h的路径,我们可以按照之前的计划将jni.h和相关文件复制到项目目录下,并更新Makefile。
1. 复制JNI头文件
将jni.h和jni_md.h文件复制到项目目录下的lib/jni目录中:
mkdir -p /path/to/your/project/lib/jni
cp /opt/homebrew/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/Home/include/jni.h /path/to/your/project/lib/jni/
cp /opt/homebrew/Cellar/openjdk/21.0.3/libexec/openjdk.jdk/Contents/Home/include/darwin/jni_md.h /path/to/your/project/lib/jni/2. 更新Makefile
在Makefile中添加JNI头文件路径:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JNIDIR := lib/jni
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JNIDIR) -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/3. 编译项目
在项目目录中运行以下命令进行编译:
make release验证
确保文件被正确复制,并且路径设置无误。如果在编译过程中仍然遇到#include <jni.h>错误,请检查文件是否正确复制,并确认Makefile中包含路径设置正确。
示例目录结构
假设你的项目目录结构如下:
openWakeWord-cpp
├── LICENSE.md
├── Makefile
├── README.md
├── build
├── lib
│ ├── arm64
│ │ ├── include
│ │ └── lib
│ └── jni
│ ├── jni.h
│ └── jni_md.h
├── models
│ ├── alexa_v0.1.onnx
│ ├── embedding_model.onnx
│ ├── hey_jarvis_v0.1.onnx
│ ├── hey_marvin_v0.1.onnx
│ ├── hey_mycroft_v0.1.onnx
│ └── melspectrogram.onnx
├── openWakeWord-cpp.iml
└── src
├── CMakeLists.txt
├── android
├── main.cpp
└── main.h在Makefile中,确保JNIDIR路径设置正确:
.PHONY: release debug clean
ARCH := arm64
ONNXDIR := lib/$(ARCH)
JNIDIR := lib/jni
release:
mkdir -p build
g++ -o build/openwakeword -I$(ONNXDIR)/include -I$(JNIDIR) -L$(ONNXDIR)/lib -O2 -std=c++20 -Wall -Wextra -Wl,-rpath,'$ORIGIN' src/main.cpp -lpthread -lonnxruntime
cp -a $(ONNXDIR)/lib/* build/
clean:
rm -rf build/ dist/这样,你的项目应该可以在M1 Mac上编译和运行。