From a96cd301aefb2d6be89454f00538d405929ad445 Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Fri, 22 Aug 2025 10:19:56 +0800 Subject: [PATCH] =?utf8?q?=E9=9B=B7=E9=B8=9Fvad=E9=9B=86=E6=88=90=EF=BC=8C?= =?utf8?q?=E5=B7=B2=E7=94=A8=E5=AE=9E=E6=97=B6=E5=BD=95=E9=9F=B3=E9=AA=8C?= =?utf8?q?=E8=AF=81=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/brandy_standard/CMakeLists.txt | 1 + .../brandy/brandy_standard/service_init.c | 8 + .../config/target_config/brandy/config.py | 1 + .../kits/audio_capturer_lite/CMakeLists.txt | 2 + code/sdk/zhihui/CMakeLists.txt | 1 + code/sdk/zhihui/leiniao/CMakeLists.txt | 1 + .../sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt | 68 +++ .../leiniao/imsl_ln/REAL_VAD_TEST_GUIDE.md | 273 ++++++++++ .../leiniao/imsl_ln/imsl_system_adapter.c | 36 ++ .../zhihui/leiniao/imsl_ln/include/imsl_kws.h | 140 ++++++ .../zhihui/leiniao/imsl_ln/include/imsl_vad.h | 103 ++++ .../zhihui/leiniao/imsl_ln/lib/libimslkws.a | Bin 0 -> 99670 bytes .../zhihui/leiniao/imsl_ln/lib/libimslnn.a | Bin 0 -> 96312 bytes .../zhihui/leiniao/imsl_ln/lib/libimslvad.a | Bin 0 -> 76708 bytes code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.c | 475 ++++++++++++++++++ code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.h | 24 + 16 files changed, 1133 insertions(+) create mode 100644 code/sdk/zhihui/leiniao/CMakeLists.txt create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/REAL_VAD_TEST_GUIDE.md create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/imsl_system_adapter.c create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/include/imsl_kws.h create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/include/imsl_vad.h create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/lib/libimslkws.a create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/lib/libimslnn.a create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/lib/libimslvad.a create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.c create mode 100644 code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.h diff --git a/code/sdk/application/brandy/brandy_standard/CMakeLists.txt b/code/sdk/application/brandy/brandy_standard/CMakeLists.txt index 92a47bdc5..16800934f 100644 --- a/code/sdk/application/brandy/brandy_standard/CMakeLists.txt +++ b/code/sdk/application/brandy/brandy_standard/CMakeLists.txt @@ -44,6 +44,7 @@ set(PRIVATE_HEADER ${ROOT_DIR}/zhihui/4g/cat1Service/include ${ROOT_DIR}/zhihui/4g/cat1Service/Service ${ROOT_DIR}/zhihui/4gTest + ${ROOT_DIR}/zhihui/leiniao/imsl_ln/ ) set(PUBLIC_HEADER diff --git a/code/sdk/application/brandy/brandy_standard/service_init.c b/code/sdk/application/brandy/brandy_standard/service_init.c index d6f1d7d88..db162c760 100644 --- a/code/sdk/application/brandy/brandy_standard/service_init.c +++ b/code/sdk/application/brandy/brandy_standard/service_init.c @@ -96,6 +96,9 @@ #ifdef SUPPORT_AT_BP #include "bp_at_cmd.h" #endif +#ifdef SUPPORT_AT_VAD +#include "vad_at_cmd.h" +#endif static void register_at_service(void) { #ifdef SUPPORT_AT_GRAPHIC @@ -222,6 +225,11 @@ static void register_at_service(void) at_cmd_table_t *bp_table = get_bp_cmd_table(&bp_cmd_count); at_cmd_add_moudle(bp_table, bp_cmd_count); #endif +#ifdef SUPPORT_AT_VAD + uint32_t vad_cmd_count; + at_cmd_table_t *vad_table = get_vad_cmd_table(&vad_cmd_count); + at_cmd_add_moudle(vad_table, vad_cmd_count); +#endif } #ifdef CONFIG_OTA_UPDATE_SUPPORT diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py index f2cbfba48..0d37dd32f 100644 --- a/code/sdk/build/config/target_config/brandy/config.py +++ b/code/sdk/build/config/target_config/brandy/config.py @@ -421,6 +421,7 @@ target = { "ppg_sensor_hx3695", # "ppgBleService", "mag_sensor_mmc5603", + "thunderbird_toys",#雷鸟 "vibrator", "vibrator_service", # "-:lwip", diff --git a/code/sdk/middleware/services/media/foundation/audio_capturer/interfaces/kits/audio_capturer_lite/CMakeLists.txt b/code/sdk/middleware/services/media/foundation/audio_capturer/interfaces/kits/audio_capturer_lite/CMakeLists.txt index e474e779d..8cac94bf2 100644 --- a/code/sdk/middleware/services/media/foundation/audio_capturer/interfaces/kits/audio_capturer_lite/CMakeLists.txt +++ b/code/sdk/middleware/services/media/foundation/audio_capturer/interfaces/kits/audio_capturer_lite/CMakeLists.txt @@ -38,6 +38,8 @@ set(PRIVATE_HEADER ${ROOTDIR}/open_source/openharmony/foundation/multimedia/audio_capturer/interfaces/kits ${ROOT_DIR}/application/wearable/service/xiaodu_voice + # IMSL VAD/KWS headers + ${ROOTDIR}/zhihui/leiniao/imsl_ln/include ) set(CCDEFINES ${CCDEFINES} "_GNU_SOURCE" "_XOPEN_SOURCE=700" "UNSUPPORT_AUDIO_DECODER") diff --git a/code/sdk/zhihui/CMakeLists.txt b/code/sdk/zhihui/CMakeLists.txt index 2ad2f1472..8155e7046 100644 --- a/code/sdk/zhihui/CMakeLists.txt +++ b/code/sdk/zhihui/CMakeLists.txt @@ -9,6 +9,7 @@ add_subdirectory_if_exist(utilscpp) add_subdirectory_if_exist(drivers) add_subdirectory_if_exist(config) add_subdirectory_if_exist(UI) +add_subdirectory_if_exist(leiniao) if("TEST_4G_SDK" IN_LIST DEFINES) add_subdirectory_if_exist(4gsdk) diff --git a/code/sdk/zhihui/leiniao/CMakeLists.txt b/code/sdk/zhihui/leiniao/CMakeLists.txt new file mode 100644 index 000000000..03ce15ec1 --- /dev/null +++ b/code/sdk/zhihui/leiniao/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory_if_exist(imsl_ln) \ No newline at end of file diff --git a/code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt b/code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt new file mode 100644 index 000000000..a860f8c95 --- /dev/null +++ b/code/sdk/zhihui/leiniao/imsl_ln/CMakeLists.txt @@ -0,0 +1,68 @@ +#=============================================================================== +# @brief imsl_ln component cmake file +# Copyright (c) @CompanyNameMagicTag 2023-2023. All rights reserved. +#=============================================================================== +set(COMPONENT_NAME "thunderbird_toys") + +# 源文件:系统适配层实现 +set(SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/imsl_system_adapter.c + ${CMAKE_CURRENT_SOURCE_DIR}/vad_at_cmd.c +) + +# 公共头文件路径(供其他模块引用) +set(PUBLIC_HEADER + ${CMAKE_CURRENT_SOURCE_DIR}/include # 包含imsl_vad.h和imsl_kws.h的目录 +) + +# 公共宏定义(可选) +set(PUBLIC_DEFINES + # 例如:IMSL_LN_ENABLE=1 + THUNDERBIRD_TOYS + SUPPORT_AT_VAD +) + +# 私有头文件路径(仅当前组件内部使用) +set(PRIVATE_HEADER + # 如无特殊私有头文件,可留空 +) + +# 私有宏定义(可选) +set(PRIVATE_DEFINES + # 如无特殊私有宏,可留空 +) + +# 公共编译选项(可选) +set(COMPONENT_PUBLIC_CCFLAGS +) + +# 组件专属编译选项 +set(COMPONENT_CCFLAGS + -Wno-incompatible-function-pointer-types + -Wno-unused-function # 屏蔽未使用函数的警告(根据实际情况调整) +) + +# 是否启用全量链接(静态库通常需要) +set(WHOLE_LINK + true +) + +# 是否为主组件(通常为false,主组件一般是app) +set(MAIN_COMPONENT + false +) + +# 安装SDK时包含的文件(头文件和库文件) +# install_sdk(${CMAKE_CURRENT_SOURCE_DIR}/include "*.h") # 安装头文件 +# install_sdk(${CMAKE_CURRENT_SOURCE_DIR}/lib "*.a") # 安装静态库(假设.a在lib目录) +install_sdk(${CMAKE_CURRENT_SOURCE_DIR} "*") + +# 直接指定静态库全路径(目录下现有文件名为 libimslvad.a、libimslkws.a、libimslnn.a) +set(LIBS + ${CMAKE_CURRENT_SOURCE_DIR}/lib/libimslvad.a + ${CMAKE_CURRENT_SOURCE_DIR}/lib/libimslkws.a + ${CMAKE_CURRENT_SOURCE_DIR}/lib/libimslnn.a +) + +# 构建组件 +build_component() \ No newline at end of file diff --git a/code/sdk/zhihui/leiniao/imsl_ln/REAL_VAD_TEST_GUIDE.md b/code/sdk/zhihui/leiniao/imsl_ln/REAL_VAD_TEST_GUIDE.md new file mode 100644 index 000000000..936e9ac7e --- /dev/null +++ b/code/sdk/zhihui/leiniao/imsl_ln/REAL_VAD_TEST_GUIDE.md @@ -0,0 +1,273 @@ +# 🎤 真实语音数据验证 VAD 功能指南 + +## 🎯 目标 +使用真实语音数据验证 VAD 功能,确保语音活动检测的准确性和实时性。 + +## 📋 完整的 VAD AT 指令集 + +### 1. 基础指令 +``` +AT^VAD_INIT # 初始化 VAD +AT^VAD_STATUS # 查询 VAD 状态 +AT^VAD_CLEANUP # 清理 VAD 资源 +AT^VAD_HELP # 显示帮助信息 +``` + +### 2. 配置指令 +``` +AT^VAD_CONFIG +``` + +**参数说明:** +- `sil_threshold`: 静音阈值 (默认: 63, 建议: 50-70) +- `energy_threshold`: 能量阈值 (默认: 10000, 建议: 5000-20000) +- `min_speech_length`: 最小语音长度 (默认: 240, 建议: 120-480) +- `silence_detect_length`: 静音检测长度 (默认: 300, 建议: 200-500) +- `rule1_min_tailing_silence`: 规则1最小尾部静音 (默认: 480, 建议: 240-960) +- `rule2_min_tailing_silence`: 规则2最小尾部静音 (默认: 960, 建议: 480-1920) +- `rule3_min_tailing_silence`: 规则3最小尾部静音 (默认: 960, 建议: 480-1920) + +### 3. 测试指令 +``` +AT^VAD_TEST_AUDIO # 测试音频数据 +AT^VAD_RECORD_START # 开始录音测试 +AT^VAD_RECORD_STOP # 停止录音测试 +``` + +**audio_type 参数:** +- `0`: 静音测试 +- `1`: 语音测试 +- `2`: 混合测试(静音+语音) + +## 🎵 真实语音数据验证方法 + +### 方法 1:使用真实麦克风录音 + +#### 步骤 1:初始化 VAD +```bash +AT^VAD_INIT +``` +**预期输出:** +``` +=== VAD AT 指令测试 === +✓ 日志回调设置成功 +✓ VAD 初始化成功 (状态: 1) +``` + +#### 步骤 2:配置优化参数(可选) +```bash +AT^VAD_CONFIG 50 5000 120 300 480 960 960 +``` +**参数说明:** +- 降低静音阈值:63 → 50(更容易检测到语音) +- 降低能量阈值:10000 → 5000(对低音量语音更敏感) +- 降低最小语音长度:240 → 120(更快响应短语音) + +#### 步骤 3:开始录音测试 +```bash +AT^VAD_RECORD_START +``` +**预期输出:** +``` +=== VAD 录音测试开始 === +请对着麦克风说话,系统将实时检测语音活动 +按任意键停止录音测试 +``` + +#### 步骤 4:进行语音测试 +1. **静音测试**:保持安静 3-5 秒 + - 预期:VAD 状态 = 0(静音) + +2. **语音测试**:清晰地说 "你好" 或 "测试" + - 预期:VAD 状态 = 1(语音) + +3. **语音结束测试**:停止说话,保持安静 + - 预期:VAD 状态 = 2(语音结束),然后自动变为 0 + +#### 步骤 5:停止录音测试 +```bash +AT^VAD_RECORD_STOP +``` + +### 方法 2:使用预录制的语音文件 + +#### 步骤 1:准备测试音频文件 +- 格式:16kHz, 16bit, 单声道 PCM +- 内容:包含静音-语音-静音的完整序列 +- 时长:建议 10-30 秒 + +#### 步骤 2:音频数据处理 +```c +// 读取音频文件并分帧处理 +FILE *audio_file = fopen("test_audio.pcm", "rb"); +int16_t audio_frame[160]; // 10ms @ 16kHz + +while (fread(audio_frame, sizeof(int16_t), 160, audio_file) == 160) { + // 运行 VAD + run_vad(audio_frame, 160); + + // 获取状态 + int status = vad_detect(); + printf("帧 %d: VAD状态 = %d\n", frame_count++, status); + + // 处理语音结束 + if (status == 2) { + printf("检测到语音结束\n"); + vad_clear(); + } +} +``` + +### 方法 3:实时音频流测试 + +#### 步骤 1:配置音频采集 +```c +// 配置音频采集参数 +struct AudioConfig audio_conf = { + .sample_rate = 16000, + .bit_depth = 16, + .channels = 1, + .frame_size = 160 // 10ms +}; +``` + +#### 步骤 2:实时 VAD 处理 +```c +// 音频采集回调函数 +void audio_callback(int16_t *audio_data, int data_len) { + // 分帧处理(每帧 160 采样点) + for (int i = 0; i < data_len; i += 160) { + int16_t frame[160]; + memcpy(frame, &audio_data[i], 160 * sizeof(int16_t)); + + // 运行 VAD + run_vad(frame, 160); + int status = vad_detect(); + + // 实时输出状态 + if (status != prev_status) { + printf("VAD状态变化: %d -> %d\n", prev_status, status); + prev_status = status; + + if (status == 2) { + printf("语音结束\n"); + vad_clear(); + } + } + } +} +``` + +## 🔍 VAD 状态验证要点 + +### 状态 0:静音 +- **触发条件**:音频能量低,特征不明显 +- **验证方法**:保持安静,观察状态是否稳定为 0 +- **预期行为**:状态稳定,无频繁变化 + +### 状态 1:语音 +- **触发条件**:检测到语音特征,能量超过阈值 +- **验证方法**:清晰说话,观察状态是否变为 1 +- **预期行为**:语音开始后状态变为 1,持续到语音结束 + +### 状态 2:语音结束 +- **触发条件**:语音特征消失,静音持续一定时间 +- **验证方法**:停止说话,观察状态是否变为 2 +- **预期行为**:状态变为 2 后自动调用 `vad_clear()`,然后变为 0 + +## 📊 性能验证指标 + +### 响应时间 +- **目标**:< 100ms +- **测试方法**:从说话开始到状态变为 1 的时间 +- **测量工具**:秒表或系统时钟 + +### 准确率 +- **目标**:> 95% +- **测试方法**:统计正确检测的语音片段数量 +- **计算公式**:正确检测数 / 总测试数 × 100% + +### 误检率 +- **目标**:< 5% +- **测试方法**:统计误报的语音检测数量 +- **计算公式**:误报数 / 总测试数 × 100% + +## 🚀 高级测试场景 + +### 场景 1:环境噪声测试 +- **背景**:播放环境噪声(空调、风扇、交通等) +- **目标**:确保 VAD 不会误报环境噪声为语音 +- **方法**:在噪声环境中保持静音,观察状态 + +### 场景 2:多人语音测试 +- **背景**:多人同时说话 +- **目标**:验证 VAD 对混合语音的处理能力 +- **方法**:2-3 人同时说话,观察状态变化 + +### 场景 3:音量变化测试 +- **背景**:从轻声到大声的语音变化 +- **目标**:验证 VAD 对不同音量语音的适应性 +- **方法**:逐渐提高说话音量,观察检测效果 + +## 🛠️ 故障排除 + +### 问题 1:VAD 状态始终为 0 +**可能原因:** +- 能量阈值过高 +- 静音阈值过低 +- 音频数据格式不正确 + +**解决方案:** +```bash +AT^VAD_CONFIG 50 3000 120 300 480 960 960 +``` + +### 问题 2:VAD 状态频繁变化 +**可能原因:** +- 阈值设置不当 +- 环境噪声干扰 +- 音频质量差 + +**解决方案:** +```bash +AT^VAD_CONFIG 60 8000 240 400 600 1200 1200 +``` + +### 问题 3:语音结束检测延迟 +**可能原因:** +- 尾部静音阈值过高 +- 静音检测长度过长 + +**解决方案:** +```bash +AT^VAD_CONFIG 50 5000 120 200 300 600 600 +``` + +## 🎉 成功验证标志 + +当 VAD 功能正常工作时,你应该看到: + +1. **初始化成功**:`✓ VAD 初始化成功 (状态: 1)` +2. **状态变化正常**:静音(0) → 语音(1) → 结束(2) → 静音(0) +3. **响应及时**:语音开始后 100ms 内状态变化 +4. **误检率低**:环境噪声不会误报为语音 +5. **资源管理**:正确调用 `vad_clear()` 和 `free_vad()` + +## 📝 测试记录模板 + +``` +测试时间: _____________ +测试环境: _____________ +测试人员: _____________ + +测试结果: +□ 静音检测正常 +□ 语音检测正常 +□ 语音结束检测正常 +□ 响应时间 < 100ms +□ 误检率 < 5% + +备注: _____________ +``` + +按照这个指南进行测试,你就能全面验证 VAD 功能的正确性和性能了!🎯 diff --git a/code/sdk/zhihui/leiniao/imsl_ln/imsl_system_adapter.c b/code/sdk/zhihui/leiniao/imsl_ln/imsl_system_adapter.c new file mode 100644 index 000000000..a57546a9f --- /dev/null +++ b/code/sdk/zhihui/leiniao/imsl_ln/imsl_system_adapter.c @@ -0,0 +1,36 @@ +/** + * @file imsl_system_adapter.c + * @brief IMSL 库系统适配层,提供系统内存管理接口 + * @copyright Copyright (c) 2023-2023. All rights reserved. + */ + +#include +#include + +/** + * @brief 初始化系统堆内存 + * @note IMSL 库内部调用,这里提供空实现 + */ +void sys_heap_init(void) +{ + // 空实现,IMSL 库内部调用 +} + +/** + * @brief 系统内存分配 + * @param size 请求的内存大小 + * @return 分配的内存指针,失败返回 NULL + */ +void *sys_malloc(size_t size) +{ + return malloc(size); +} + +/** + * @brief 系统内存释放 + * @param ptr 要释放的内存指针 + */ +void sys_free(void *ptr) +{ + free(ptr); +} diff --git a/code/sdk/zhihui/leiniao/imsl_ln/include/imsl_kws.h b/code/sdk/zhihui/leiniao/imsl_ln/include/imsl_kws.h new file mode 100644 index 000000000..43ce640e4 --- /dev/null +++ b/code/sdk/zhihui/leiniao/imsl_ln/include/imsl_kws.h @@ -0,0 +1,140 @@ +#ifndef _IMSL_KWS_DLL +#define _IMSL_KWS_DLL + +#ifndef _IMSL_NN_COMMON +#define _IMSL_NN_COMMON +#include + +typedef int (*imsl_nn_printf_func)(const char *format, ...); + +struct AuthInfo +{ + char dmp_token[64]; +}; +#endif + +struct KwsConfig +{ + int min_activate_len; // 最小检测多少ms的激活才算检测到关键词 + int max_activate_gap; // 关键词激活点最长持续时间 比如 100ms 时检测到关键词但是未达到最短长度,直到100ms + max_activate_gap 这个时间点使激活失效 + int active_threshold; // 激活阈值 + + int kws_log_level; // kws log打印控制, 0 不打印,1 INFO,2 INFO DEBUG + + struct AuthInfo auth_info; +}; + +/* +初始化kws解码器,默认配置见下方的example +*/ +int init_kws(const struct KwsConfig* conf); + +int auth_kws(const struct AuthInfo* auth_info); + +void run_kws(const int16_t* data, const int data_len); + +int kws_detect(void); + +void kws_clear(void); + +void free_kws(void); + +#endif + +/* example 只使用kws +// 设置log函数 +extern imsl_nn_printf_func imsl_nn_printf; +imsl_nn_printf = printf; + +// 初始化 +struct KwsConfig kws_conf; +kws_conf.min_activate_len = 10; +kws_conf.active_threshold = 32; +kws_conf.max_activate_gap = 160; +kws_conf.kws_log_level = 0; + +int kws_status = init_kws(&kws_conf); + +struct AuthInfo auth_info; +strcpy(auth_info.dmp_token, dmp_token); +auth_kws(&auth_info); + +// 在每次接收语音时调用 注意 如果是void* 或 int8* 的指针,长度 / 2 +// 运行结束后获取kws状态 +run_kws(wave, chunk_size / 2); +int kws_status = kws_detect(); +if (kws_status == 1) { + kws_clear(); +} + +// 不使用kws或kws暂时停用时调用 +free_kws(); + +*/ + + +/* example 2 配合vad使用 +// 初始化 + + +struct VadConfig vad_conf; +vad_conf.sil_threshold = 63; +vad_conf.energy_threshold = 5000; +vad_conf.min_speech_length = 240; +vad_conf.silence_detect_length = 300; +vad_conf.rule1_min_tailing_silence = 480; +vad_conf.rule2_min_tailing_silence = 960; +vad_conf.rule3_min_tailing_silence = 960; +vad_conf.vad_log_level = 2; + +int vad_status = init_vad(&vad_conf); + +struct KwsConfig kws_conf; +kws_conf.min_activate_len = 10; +kws_conf.active_threshold = 32; +kws_conf.max_activate_gap = 160; +kws_conf.kws_log_level = 0; + +int kws_status = init_kws(&kws_conf); + +const int chunk_size = 480; // 这里的chunk size每次送入kws语音的点数 比如 30ms 就是 30 * 16 +const int chunk_cache = 9; // 由于vad存在一定延时,需要cache一些chunk防止丢失头部语音 +const int cache_size = chunk_cache * chunk_size; // chunk_cache 的值需要根据chunk_size的值变化 9*480/chunk_size +int16_t wave_cache[cache_size] = {0}; // !!!!!!!!!注意我这边是int16_t +int prev_vad_status = 0; // 记录vad状态,只在vad刚检测到语音时使用cache语音 + + +// 每次接收到语音时 +run_vad(wave + i, chunk_size); + +if (vad_status == 1) { + if (prev_vad_status == 0 || prev_vad_status == 2) { + for (j = 0; j < chunk_cache; j++) { + u32 time4 = timer_get_ms(); + run_kws(wave_cache + j * chunk_size, chunk_size); + u32 time5 = timer_get_ms(); + printf("run kws takes %d ms\n", time5 - time4); + } + } + run_kws(wave + i, chunk_size); + int kws_status = kws_detect(); + if (kws_status == 1) { + printf("!!!!!!!!!!!!!!!!!!!!!!keyword detected!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"); + kws_clear(); + } +} else if (vad_status == 2) { + vad_clear(); +} + +prev_vad_status = vad_status; +memcpy(wave_cache, wave_cache + chunk_size, sizeof(int16_t) * (cache_size - chunk_size)); +memcpy(wave_cache + (cache_size - chunk_size), wave + i, sizeof(int16_t) * chunk_size); + + +// kws暂停使用时 +free_kws(); + +// vad暂停使用时 +free_vad(); + +*/ diff --git a/code/sdk/zhihui/leiniao/imsl_ln/include/imsl_vad.h b/code/sdk/zhihui/leiniao/imsl_ln/include/imsl_vad.h new file mode 100644 index 000000000..0fb9e2017 --- /dev/null +++ b/code/sdk/zhihui/leiniao/imsl_ln/include/imsl_vad.h @@ -0,0 +1,103 @@ +#ifndef _IMSL_VAD_DLL +#define _IMSL_VAD_DLL +#include + +#ifndef _IMSL_NN_COMMON +#define _IMSL_NN_COMMON +typedef int (*imsl_nn_printf_func)(const char *format, ...); + +struct AuthInfo +{ + char dmp_token[64]; +}; +#endif + +// 注意这个必须要与imsl_vad.h中的定义一致 +struct VadConfig +{ + int vad_log_level; // 0 不启用 1 INFO 2 INFO、DEBUG + int sil_threshold; // 静音阈值 推荐值 63 (0-127) (修改意义不大) + int energy_threshold; // 能量阈值 推荐值 10000 + int min_speech_length; // 最短语音长度 240 (须小于 rule1_min_tailing_silence) + int silence_detect_length; // vad_silence_detect 接口判定的尾部静音长度, 如果不需要vad_silence_detect接口可以忽略这个参数 + int rule1_min_tailing_silence; // 多长时间没有检测到语音重置VAD状态 (ms) 480 + int rule2_min_tailing_silence; // 0-10s最短多少静音判定语音结束 (ms) 960 + int rule3_min_tailing_silence; // 10s以上最短多少静音判定语音结束 (ms) 960 + + struct AuthInfo auth_info; +}; + +/* 初始化vad +详细参数设置参照 imsl_vad.h +返回值 : + 0 初始化失败 + 1 试用模式 (最长30分钟) + // 2 授权成功 (如果授权失败控制台会打印错误信息,同时转为试用模式) +*/ +int init_vad(const struct VadConfig* conf); + +/* 授权vad +返回值: + 0 初始化失败 + 1 初始化成功 +*/ +int auth_vad(const struct AuthInfo* auth_info); + +// 运行vad函数,data为16khz 16bit的pcm音频数据 +// 注意data_len是int16_t的data_len,如果传入u8*或void* 数据data_len需要 / 2 +void run_vad(const int16_t* data, int data_len); + +// 获取VAD的状态 +// 0 静音 1 语音 2 语音结束 +int vad_detect(void); + +// 获取尾部静音的状态 +// 1 尾部静音超过规定时长,0 尾部静音未超过规定时长 +// 注意如果要调用 vad_silence_detect,需要在vad_clear前调用 +int vad_silence_detect(void); + +// 清除尾部静音,调用这个函数后尾部静音长度会清0 +void vad_silence_clear(void); + +// 重置VAD的状态 每次在vad_detect为2时调用 +void vad_clear(void); + +// 释放VAD内存,不使用VAD或暂停使用VAD时调用 +void free_vad(void); + +#endif + +/*example : + #include "imsl_vad.h" + + // 设置log函数 + extern imsl_nn_printf_func imsl_nn_printf; + imsl_nn_printf = printf; + + // 启用VAD时初始化 + struct VadConfig conf; + conf.sil_threshold = 63; + conf.energy_threshold = 10000; + conf.min_speech_length = 240; + conf.silence_detect_length = 300; + conf.rule1_min_tailing_silence = 480; + conf.rule2_min_tailing_silence = 960; + conf.rule3_min_tailing_silence = 960; + conf.vad_log_level = 2; + init_vad(&conf); + + struct AuthInfo auth_info; + strcpy(auth_info.dmp_token, dmp_token); + auth_vad(&auth_info); + + // 每次获得语音后调用, 语音长度最好小于100ms + // wave为u8*或void*指针时需要 / 2 + run_vad(wave, wave_len / 2); + int status = vad_detect(); + if (status == 2) { + vad_clear(); + } + + // 不使用或暂停使用VAD时调用 + free_vad(); +*/ \ No newline at end of file diff --git a/code/sdk/zhihui/leiniao/imsl_ln/lib/libimslkws.a b/code/sdk/zhihui/leiniao/imsl_ln/lib/libimslkws.a new file mode 100644 index 0000000000000000000000000000000000000000..6c074350dc192f119832b3c024b3c7a5caedf0fd GIT binary patch literal 99670 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 literal 0 HcmV?d00001 diff --git a/code/sdk/zhihui/leiniao/imsl_ln/lib/libimslnn.a b/code/sdk/zhihui/leiniao/imsl_ln/lib/libimslnn.a new file mode 100644 index 0000000000000000000000000000000000000000..0f737239c3163797d4371f1d8ea7768a21393897 GIT binary patch literal 96312 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 O#<0(PjEwH&bN>&l@tF(& literal 0 HcmV?d00001 diff --git a/code/sdk/zhihui/leiniao/imsl_ln/lib/libimslvad.a b/code/sdk/zhihui/leiniao/imsl_ln/lib/libimslvad.a new file mode 100644 index 0000000000000000000000000000000000000000..293b4e009a885634774b9f5eef5071740658c5cd GIT binary patch literal 76708 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%0AfVcoxr3+Fb`g+PLLqT5S3RPz3V|V2eZ{^cyWq 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 literal 0 HcmV?d00001 diff --git a/code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.c b/code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.c new file mode 100644 index 000000000..dadac514d --- /dev/null +++ b/code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.c @@ -0,0 +1,475 @@ +#include "vad_at_cmd.h" +#include "at_cmd_api.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "imsl_vad.h" +#include "media_thread_adapt.h" + +#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0])) +#define VAD_MAX_ARGC 8 +#define VAD_MAX_ARGV_LEN 64 +#define VAD_FAILED (-1) +#define VAD_SUCCESS (0) + +/* Indicate that a local variable is not used */ +#define VAD_UNUSED(a) ((void)(a)) + +// 全局 VAD 状态 +static bool g_vad_initialized = false; +static int g_vad_status = -1; +static struct VadConfig g_vad_config = {0}; + +// 音频缓冲区(用于真实语音测试) +#define VAD_AUDIO_BUFFER_SIZE 3200 // 200ms @ 16kHz +static int16_t g_audio_buffer[VAD_AUDIO_BUFFER_SIZE]; +static int g_audio_buffer_pos = 0; + +/* 录音封装(由 C++ 提供,C 接口声明) */ +extern int32_t AudioCaptureSample(int32_t argc, const char *argv[]); + +/* 将 PCM 文件按 10ms(160点) 分帧喂给 VAD 并打印结果 */ +static int AnalyzePcmFileWithVad(const char *pcm_path) +{ + FILE *fp = fopen(pcm_path, "rb"); + if (fp == NULL) { + printf("open pcm failed: %s\n", pcm_path); + return VAD_FAILED; + } + + int16_t frame[160]; + size_t total_frames = 0; + int prev = -1; + int count_speech = 0; + int count_end = 0; + + while (1) { + size_t n = fread(frame, sizeof(int16_t), 160, fp); + if (n < 160) { + break; + } + run_vad(frame, 160); + int st = vad_detect(); + if (st != prev) { + printf("VAD状态变化: %d -> %d 于帧%zu\n", prev, st, total_frames); + prev = st; + } + if (st == 1) { + count_speech++; + } else if (st == 2) { + count_end++; + vad_clear(); + } + total_frames++; + } + fclose(fp); + printf("总帧数:%zu, 语音帧:%d, 结束帧:%d\n", total_frames, count_speech, count_end); + return VAD_SUCCESS; +} + +/* ---------------- 实时录音并同步喂给 VAD(基于文件尾随) ---------------- */ +static volatile bool g_vad_live_running = false; +static MediaThreadIdHandle g_vad_tail_thread = NULL; +static char g_vad_live_path[256] = "/user/vad_live.pcm"; +static int g_vad_prev_status = -1; + +static void *VadTailThread(void *arg) +{ + printf("VAD TailThread\n"); + (void)arg; + FILE *fp = NULL; + int16_t frame[160]; + size_t filled = 0; + + /* 等待文件可读 */ + while (g_vad_live_running && fp == NULL) { + fp = fopen(g_vad_live_path, "rb"); + if (fp == NULL) { + usleep(50 * 1000); + } + } + if (!g_vad_live_running) { + if (fp) fclose(fp); + return NULL; + } + + /* 从头开始读,持续尾随追加的数据 */ + while (g_vad_live_running) { + int16_t sample; + size_t n = fread(&sample, sizeof(int16_t), 1, fp); + if (n == 1) { + frame[filled++] = sample; + if (filled == 160) { + run_vad(frame, 160); + int st = vad_detect(); + if (st != g_vad_prev_status) { + printf("[VAD-LIVE] 状态变化: %d -> %d\n", g_vad_prev_status, st); + g_vad_prev_status = st; + if (st == 2) { + printf("[VAD-LIVE] 检测到语音结束,vad_clear()\n"); + vad_clear(); + } + } + filled = 0; + } + } else { + /* 到达当前 EOF,短暂等待数据追加 */ + clearerr(fp); + usleep(10 * 1000); + } + } + if (fp) fclose(fp); + return NULL; +} + +static void *StartRecordThread(void *arg) +{ + printf("VAD StartRecordThread\n"); + (void)arg; + const char *startArgs[6] = {"01", "pcm", "16000", "1", "16", g_vad_live_path}; + (void)AudioCaptureSample(6, startArgs); + return NULL; +} + +static void EnsureParentDir(const char *file_path) +{ + if (file_path == NULL) { + return; + } + const char *slash = strrchr(file_path, '/'); + if (slash == NULL || slash == file_path) { + return; // no parent or root + } + char dir[256]; + size_t len = (size_t)(slash - file_path); + if (len >= sizeof(dir)) { + return; + } + memcpy(dir, file_path, len); + dir[len] = '\0'; + struct stat st; + if (stat(dir, &st) == 0) { + return; // exists + } + (void)mkdir(dir, 0777); +} + +static int ConvertCmdToParam(uint8_t *para, uint32_t paraLen, uint8_t argv[VAD_MAX_ARGC][VAD_MAX_ARGV_LEN], uint32_t *argc) +{ + uint32_t pos = 0; + *argc = 0; + + for (uint32_t i = 0; i < paraLen; i++) + { + if ((para[i] == ' ' || para[i] == '\n') && pos != 0) + { + argv[*argc][pos] = '\0'; + *argc += 1; + pos = 0; + if (*argc >= VAD_MAX_ARGC) + { + return VAD_FAILED; + } + } + else + { + argv[*argc][pos] = para[i]; + pos++; + if (pos >= VAD_MAX_ARGV_LEN) + { + return VAD_FAILED; + } + } + } + if (pos != 0) + { + *argc += 1; + } + + return VAD_SUCCESS; +} + +// AT^VAD_INIT - 初始化 VAD +static uint32_t vad_init(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(strCommonCmd); + uint8_t argv[VAD_MAX_ARGC][VAD_MAX_ARGV_LEN] = {0}; + uint32_t argc = 0; + + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != VAD_SUCCESS) + { + printf("VADTEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + + if (g_vad_initialized) + { + printf("VAD already initialized\n"); + return ERRCODE_SUCC; + } + + printf("=== VAD AT 指令测试 ===\n"); + + // 设置日志回调 + extern imsl_nn_printf_func imsl_nn_printf; + imsl_nn_printf = printf; + printf("✓ 日志回调设置成功\n"); + + // 初始化 VAD 配置 + g_vad_config.sil_threshold = 63; + g_vad_config.energy_threshold = 10000; + g_vad_config.min_speech_length = 240; + g_vad_config.silence_detect_length = 300; + g_vad_config.rule1_min_tailing_silence = 480; + g_vad_config.rule2_min_tailing_silence = 960; + g_vad_config.rule3_min_tailing_silence = 960; + g_vad_config.vad_log_level = 2; + + int init_result = init_vad(&g_vad_config); + if (init_result == 0) + { + printf("❌ VAD 初始化失败\n"); + return ERRCODE_FAIL; + } + + printf("✓ VAD 初始化成功 (状态: %d)\n", init_result); + g_vad_initialized = true; + g_vad_status = 0; + + return ERRCODE_SUCC; +} + +// AT^VAD_CONFIG - 配置 VAD 参数 +static uint32_t vad_config(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(strCommonCmd); + uint8_t argv[VAD_MAX_ARGC][VAD_MAX_ARGV_LEN] = {0}; + uint32_t argc = 0; + + int ret = ConvertCmdToParam(para, paraLen, argv, &argc); + if (ret != VAD_SUCCESS) + { + printf("VADTEST ATCMD Convert Command Failed\n"); + return ERRCODE_FAIL; + } + + if (!g_vad_initialized) + { + printf("VAD not initialized, call AT^VAD_INIT first\n"); + return ERRCODE_FAIL; + } + + if (argc != 7) + { + printf("Usage: AT^VAD_CONFIG \n"); + return ERRCODE_FAIL; + } + + // 解析参数 + g_vad_config.sil_threshold = atoi((char *)argv[0]); + g_vad_config.energy_threshold = atoi((char *)argv[1]); + g_vad_config.min_speech_length = atoi((char *)argv[2]); + g_vad_config.silence_detect_length = atoi((char *)argv[3]); + g_vad_config.rule1_min_tailing_silence = atoi((char *)argv[4]); + g_vad_config.rule2_min_tailing_silence = atoi((char *)argv[5]); + g_vad_config.rule3_min_tailing_silence = atoi((char *)argv[6]); + + printf("✓ VAD 配置更新成功\n"); + printf(" sil_threshold: %d\n", g_vad_config.sil_threshold); + printf(" energy_threshold: %d\n", g_vad_config.energy_threshold); + printf(" min_speech_length: %d\n", g_vad_config.min_speech_length); + + return ERRCODE_SUCC; +} + +// AT^VAD_STATUS - 查询 VAD 状态 +static uint32_t vad_status(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); + VAD_UNUSED(paraLen); + VAD_UNUSED(strCommonCmd); + + if (!g_vad_initialized) + { + printf("VAD not initialized, call AT^VAD_INIT first\n"); + return ERRCODE_FAIL; + } + + printf("=== VAD 状态信息 ===\n"); + printf("初始化状态: %s\n", g_vad_initialized ? "已初始化" : "未初始化"); + printf("当前状态: %d (0=静音, 1=语音, 2=结束)\n", g_vad_status); + printf("配置参数:\n"); + printf(" sil_threshold: %d\n", g_vad_config.sil_threshold); + printf(" energy_threshold: %d\n", g_vad_config.energy_threshold); + printf(" min_speech_length: %d\n", g_vad_config.min_speech_length); + + return ERRCODE_SUCC; +} + +// AT^VAD_ANALYZE_PCM +static uint32_t vad_analyze_pcm(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(strCommonCmd); + if (!g_vad_initialized) { + printf("VAD not initialized, call AT^VAD_INIT first\n"); + return ERRCODE_FAIL; + } + uint8_t argv[VAD_MAX_ARGC][VAD_MAX_ARGV_LEN] = {0}; + uint32_t argc = 0; + if (ConvertCmdToParam(para, paraLen, argv, &argc) != VAD_SUCCESS || argc != 1) { + printf("Usage: AT^VAD_ANALYZE_PCM \n"); + return ERRCODE_FAIL; + } + const char *pcm_path = (const char*)argv[0]; + printf("VAD 分析现有 PCM: %s\n", pcm_path); + int ret = AnalyzePcmFileWithVad(pcm_path); + return (ret == VAD_SUCCESS) ? ERRCODE_SUCC : ERRCODE_FAIL; +} + +// AT^VAD_RECORD_START - 开始录音测试 +static uint32_t vad_record_start(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(strCommonCmd); + if (!g_vad_initialized) { + printf("VAD not initialized, call AT^VAD_INIT first\n"); + return ERRCODE_FAIL; + } + + if (g_vad_live_running) { + printf("VAD live already running\n"); + return ERRCODE_SUCC; + } + + /* 可选自定义输出路径 */ + const char *out_path = (const char*)g_vad_live_path; + uint8_t argvbuf[VAD_MAX_ARGC][VAD_MAX_ARGV_LEN] = {0}; + uint32_t argc = 0; + if (para != NULL && paraLen > 0 && ConvertCmdToParam(para, paraLen, argvbuf, &argc) == VAD_SUCCESS && argc >= 1) { + strncpy(g_vad_live_path, (const char*)argvbuf[0], sizeof(g_vad_live_path) - 1); + g_vad_live_path[sizeof(g_vad_live_path) - 1] = '\0'; + out_path = g_vad_live_path; + } + + printf("=== VAD 实时录音开始 ===\n"); + printf("PCM 输出: %s\n", out_path); + + /* 1) 确保目录存在并异步启动系统录音保存为 PCM(避免在 AT 线程上堆栈溢出) */ + EnsureParentDir(out_path); + strncpy(g_vad_live_path, out_path, sizeof(g_vad_live_path) - 1); + g_vad_live_path[sizeof(g_vad_live_path) - 1] = '\0'; + StartRecordThread(NULL); + + /* 2) 启动尾随线程实时喂给 VAD */ + g_vad_prev_status = -1; + g_vad_live_running = true; + { + MediaThreadattr attr = { "VADTail", 0x1000, THREAD_SCHED_INVALID, 0, true }; + g_vad_tail_thread = MediaThreadCreate(VadTailThread, NULL, &attr); + if (g_vad_tail_thread == NULL) { + printf("create tail thread failed\n"); + g_vad_live_running = false; + return ERRCODE_FAIL; + } + } + return ERRCODE_SUCC; +} + +// AT^VAD_RECORD_STOP - 停止录音测试 +static uint32_t vad_record_stop(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); + VAD_UNUSED(paraLen); + VAD_UNUSED(strCommonCmd); + + printf("=== 停止 VAD 实时录音 ===\n"); + + /* 1) 停止尾随线程 */ + if (g_vad_live_running) { + g_vad_live_running = false; + if (g_vad_tail_thread != NULL) { + MediaThreadJoin(&g_vad_tail_thread); + g_vad_tail_thread = NULL; + } + } + + /* 2) 停止系统录音 */ + { + const char *stopArg = "stop"; + (void)AudioCaptureSample(1, &stopArg); + } + + printf("VAD 实时录音已停止\n"); + return ERRCODE_SUCC; +} + +// AT^VAD_CLEANUP - 清理 VAD 资源 +static uint32_t vad_cleanup(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); + VAD_UNUSED(paraLen); + VAD_UNUSED(strCommonCmd); + + if (!g_vad_initialized) + { + printf("VAD not initialized\n"); + return ERRCODE_SUCC; + } + + free_vad(); + printf("✓ VAD 资源释放成功\n"); + g_vad_initialized = false; + g_vad_status = -1; + + return ERRCODE_SUCC; +} + +// AT^VAD_HELP - 显示帮助信息 +static uint32_t vad_help(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); + VAD_UNUSED(paraLen); + VAD_UNUSED(strCommonCmd); + + printf("=== VAD AT 指令帮助 ===\n"); + printf("AT^VAD_INIT - 初始化 VAD\n"); + printf("AT^VAD_CONFIG - 配置 VAD 参数\n"); + printf("AT^VAD_STATUS - 查询 VAD 状态\n"); + printf("AT^VAD_ANALYZE_PCM - 分析已有PCM\n"); + printf("AT^VAD_RECORD_START - 开始录音测试\n"); + printf("AT^VAD_RECORD_STOP - 停止录音测试\n"); + printf("AT^VAD_CLEANUP - 清理 VAD 资源\n"); + printf("AT^VAD_HELP - 显示此帮助\n"); + printf("\n=== 使用示例 ===\n"); + printf("AT^VAD_INIT # 初始化\n"); + printf("AT^VAD_CONFIG 50 5000 120 300 480 960 960 # 配置参数\n"); + printf("AT^VAD_TEST_AUDIO 1 # 测试语音\n"); + printf("AT^VAD_STATUS # 查看状态\n"); + printf("AT^VAD_CLEANUP # 清理资源\n"); + printf("=====================\n"); + + return ERRCODE_SUCC; +} + +static const at_cmd_table_t g_vad_cmd[] = { + {(char *)"AT^VAD_INIT", vad_init, (char *)"初始化 VAD"}, + {(char *)"AT^VAD_CONFIG", vad_config, (char *)"配置 VAD 参数"}, + {(char *)"AT^VAD_STATUS", vad_status, (char *)"查询 VAD 状态"}, + {(char *)"AT^VAD_ANALYZE_PCM", vad_analyze_pcm, (char *)"分析现有PCM"}, + {(char *)"AT^VAD_RECORD_START", vad_record_start, (char *)"开始录音测试"}, + {(char *)"AT^VAD_RECORD_STOP", vad_record_stop, (char *)"停止录音测试"}, + {(char *)"AT^VAD_CLEANUP", vad_cleanup, (char *)"清理 VAD 资源"}, + {(char *)"AT^VAD_HELP", vad_help, (char *)"显示帮助信息"}, +}; + +at_cmd_table_t *get_vad_cmd_table(uint32_t *cmd_count) +{ + *cmd_count = ARRAY_COUNT(g_vad_cmd); + return (at_cmd_table_t *)g_vad_cmd; +} diff --git a/code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.h b/code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.h new file mode 100644 index 000000000..d95097f08 --- /dev/null +++ b/code/sdk/zhihui/leiniao/imsl_ln/vad_at_cmd.h @@ -0,0 +1,24 @@ +#ifndef VAD_AT_CMD_H +#define VAD_AT_CMD_H + +#include +#include +#include "errcode.h" +#include "soc_osal.h" +#include "at_cmd_api.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +at_cmd_table_t *get_vad_cmd_table(uint32_t *cmd_count); + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +#endif -- 2.17.1