OpenWakeWord.AXERA / cpp /README.md
inoryQwQ's picture
Add prebuilt C++ shared library SDK (libopenwakeword_ax) + header for secondary development
09bc000
|
Raw
History Blame
3.63 kB

openWakeWord C++ 推理

本目录提供 AX650 和 AX630C C++ 推理程序。WAV、STFT、mel 和缓存更新在 CPU 端完成,embedding 与 classifier 使用对应平台的 axmodel

编译环境

AX650 与 AX630C 共用 Arm GNU 9.2 AArch64 交叉编译器:

mkdir -p cpp/toolchains
wget -P cpp/toolchains \
  https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xf cpp/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz \
  -C cpp/toolchains

下载 BSP:

bash cpp/download_bsp.sh all
平台 BSP 压缩包 编译目录
AX650 msp_50_3.10.2.zip cpp/toolchains/ax650n_bsp_sdk/msp/out
AX630C msp_20e_3.0.0.zip cpp/toolchains/ax620e_bsp_sdk/msp/out/arm64_glibc

交叉编译

export TOOLCHAIN_ROOT="cpp/toolchains/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu"

bash cpp/build_ax650.sh
bash cpp/build_ax630c.sh

生成:

cpp/bin/openwakeword_ax650
cpp/bin/openwakeword_ax630c

如 BSP 放在其他位置,可设置 BSP_MSP_DIR。AX650 应指向包含 include/lib/msp/out;AX630C 应指向 msp/out/arm64_glibc

板端运行

AX650 单条推理:

AUDIO=audio/openwakeword/alexa_test.wav \
bash cpp/run_openwakeword_ax650.sh

AX630C 单条推理:

AUDIO=audio/openwakeword/alexa_test.wav \
bash cpp/run_openwakeword_ax630c.sh

批量测试:

THRESHOLD=0.5 bash cpp/run_batch_openwakeword_ax650.sh
THRESHOLD=0.5 bash cpp/run_batch_openwakeword_ax630c.sh

模型目录必须与平台对应:

models/650/
models/630C/

运行脚本会检查 embedding 和 6 个 classifier 模型,避免误用其他平台的 axmodel。 输入音频必须为 16 kHz、单声道、16-bit PCM WAV。

单条推理会输出 classifier 分数和 WAKEUP,并只输出一个 rtfrtf 包含 CPU mel 和 NPU 推理,不包含一次性模型加载与初始化。

阈值可通过环境变量调整:

THRESHOLD=0.6 AUDIO=audio/openwakeword/hey_mycroft_test.wav \
bash cpp/run_openwakeword_ax630c.sh

二次开发(共享库)

编译产物除可执行文件外,还包含共享库:

cpp/lib/ax650/libopenwakeword_ax.so      # AX650
cpp/lib/ax630c/libopenwakeword_ax.so     # AX630C
cpp/include/openwakeword_ax.hpp          # 公共 API 头文件

在自己的 CMake 工程中链接:

add_library(openwakeword_ax SHARED IMPORTED)
set_target_properties(openwakeword_ax PROPERTIES
  IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/cpp/lib/ax650/libopenwakeword_ax.so")
target_include_directories(your_app PRIVATE cpp/include)
target_link_libraries(your_app PRIVATE openwakeword_ax)

最小使用示例:

#include "openwakeword_ax.hpp"

openwakeword::WakeWordDetector detector(
    "models/650",                    // axmodel 目录
    "config/openwakeword_mel_weights.bin",  // CPU mel 权重
    0.5f);                            // 阈值

// 每 80ms 喂一帧 1280 个 int16 样本(16 kHz)
openwakeword::FrameResult result = detector.ProcessFrame(pcm_frame);
for (std::size_t i = 0; i < result.names.size(); ++i) {
    printf("%s max_score=%.4f\n", result.names[i].c_str(),
           result.max_scores[i]);
}
if (result.any_triggered) { /* 唤醒 */ }
detector.Reset();  // 新会话时清空流式状态

板端运行时需提供 BSP 动态库路径(AX650 通常为 /soc/lib,AX630C 为 /opt/lib):

export LD_LIBRARY_PATH=/soc/lib:${LD_LIBRARY_PATH}