NN Denoise*
提示
- SDK 路径: http://gitlab.nationalchip.com/nationalchip/voice-wifi-solution/ovp_aiot
- App 路径: SDK 路径下 app/nn_denoise_app/
- 适用芯片 8005/8006
1. 概述*
神经网络降噪示例 App,演示如何通过 NN(神经网络)对麦克风音频进行实时降噪,并将降噪后的音频输出到扬声器。支持物理按键切换降噪开关、LED 状态指示、以及基于 VAD 的自动静音。
2. 功能特性*
- NN 实时降噪处理(
vpa_ns_nn) - 物理按键(GPIO 16)单击切换降噪开/关
- LED(GPIO 5)指示降噪状态(低电平 = 降噪开启,高电平 = 降噪关闭)
- VAD 驱动自动静音:连续静音帧达到阈值后 MUTE 输出,检测到语音立即恢复
- 零拷贝音频通路:麦克风缓冲区直接作为音频输出缓冲区
3. 目录结构*
app/nn_denoise_app/
├── nn_denoise_app.c # 主程序
├── app.mk # 编译配置
├── app.name # Kconfig 选项
├── Kconfig # 子配置(空)
└── audio_out/
├── audio_out.c # 音频输出驱动(SDM/DAC)
└── audio_out.h # 音频输出 API
| 文件 | 作用 |
|---|---|
nn_denoise_app.c |
主程序,按键处理、VAD 静音逻辑、降噪切换 |
app.mk |
编译主程序和 audio_out 子模块 |
app.name |
定义 CONFIG_APP_NN_DENOISE 选项 |
audio_out/ |
音频输出驱动封装,支持内部和外置 DAC |
4. 配置说明*
4.1 Kconfig 选项*
该 App 无额外 Kconfig 子配置。
4.2 宏定义*
#define NEED_SILENCE_FRAMES 30 // 连续静音帧数阈值(达到后 MUTE 输出)
#define BTN_NS_GPIO 16 // 降噪开关按键 GPIO
#define LED1_GPIO 5 // 降噪状态指示灯 GPIO
4.3 音频输出 API*
// 播放器状态
typedef enum { AOUT_STATUS_IDLE, AOUT_STATUS_PREPARE, AOUT_STATUS_PLAYING } PLAYER_STATUS;
// 初始化音频输出
int32_t aout_init(AOUT_PARAM *aout_param);
// 开始播放(offset: 偏移, length: 长度)
int32_t aout_play(uint32_t offset, uint32_t length);
// 设置音量(0-100)
int32_t aout_set_volume(uint32_t volume);
// 静音 / 取消静音
int32_t aout_set_mute(void);
int32_t aout_cancel_mute(void);
5. 工作原理*
5.1 初始化流程*
- 配置按键 GPIO 16(上拉输入),注册单击回调
_btn1_click_callback用于切换降噪 - 配置 LED GPIO 5(输出),初始低电平(降噪开启)
- 读取 VPA 上下文,获取音频 IO 配置参数
- 初始化音频输出:麦克风缓冲区作为播放缓冲区,采样率跟随 VPA 配置,音量 100
5.2 降噪切换*
按键单击 → 翻转降噪状态 → 调用 vpa_ns_set_use_ns_mask_flag() → 更新 LED:
降噪开启 → LED 低电平
降噪关闭 → LED 高电平
5.3 VAD 静音逻辑*
每收到 Audio-in 录音完成事件时检查:
context->vad == true → 立即取消静音,计数器清零
context->vad == false → 计数器 +1
计数器 >= 30 → MUTE 输出
5.4 事件处理*
| 事件 | 触发时机 | 处理逻辑 |
|---|---|---|
EVENT_AUDIO_IN_RECORD_DONE |
Audio-in 录音完成(触发时间由 PCM 帧长决定,根据配置自行确定) | 首帧启动播放;后续帧执行 VAD 静音逻辑 |
5.5 主循环*
app_task_loop() 中调用 multi_button_tick() 驱动按键检测。
6. 使用方法*
6.1 编译*
cp configs/nn_denoise/8006_nn_denoise_app.config .config
make defconfig
make clean; make
6.2 烧录运行*
cd tools/bootx/
./flash_nor.sh 0 -r 1000000
7. 预期输出*
- 上电后扬声器输出降噪后的麦克风音频(实时直通)
- 按下 GPIO 16 按键,降噪切换,LED 状态翻转
- 麦克风静音约 1.2 秒(30 帧 × 40ms)后自动 MUTE
8. 注意事项*
- NN 模型依赖:降噪功能依赖 VPA 框架中的
vpa_ns_nn模块,需确保固件包含 NN 降噪模型 - 零拷贝注意:音频输出直接使用 VPA 的麦克风缓冲区,不要额外分配或释放该缓冲区
- 外置 DAC:如果使用外置 DAC,需在
audio_out.c中启用CONFIG_ENABLE_EXTERNAL_DAC,引脚复用和静音引脚会不同 - 按键消抖:按键检测由
multi_button框架处理,自带消抖逻辑 - 休眠/唤醒未实现:当前 SDK 不支持休眠功能,
app_suspend()和app_resume()保持空实现即可