跳转至

NN Denoise*

提示

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 初始化流程*

  1. 配置按键 GPIO 16(上拉输入),注册单击回调 _btn1_click_callback 用于切换降噪
  2. 配置 LED GPIO 5(输出),初始低电平(降噪开启)
  3. 读取 VPA 上下文,获取音频 IO 配置参数
  4. 初始化音频输出:麦克风缓冲区作为播放缓冲区,采样率跟随 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. 注意事项*

  1. NN 模型依赖:降噪功能依赖 VPA 框架中的 vpa_ns_nn 模块,需确保固件包含 NN 降噪模型
  2. 零拷贝注意:音频输出直接使用 VPA 的麦克风缓冲区,不要额外分配或释放该缓冲区
  3. 外置 DAC:如果使用外置 DAC,需在 audio_out.c 中启用 CONFIG_ENABLE_EXTERNAL_DAC,引脚复用和静音引脚会不同
  4. 按键消抖:按键检测由 multi_button 框架处理,自带消抖逻辑
  5. 休眠/唤醒未实现:当前 SDK 不支持休眠功能,app_suspend()app_resume() 保持空实现即可