# GMF AI Audio
- [English](./README.md)
`GMF AI Audio` 是一个人工智能语音处理模块,它在 [GMF](https://github.com/espressif/esp-gmf) 层面为用户提供方便、易用的语音唤醒、命令词识别和回声消除等常用智能语音处理算法。目前基于 `esp-sr` 提供以下模块:
* [esp_gmf_afe_manager](./src/esp_gmf_afe_manager.c): `audio front end(afe)` 管理器
* [esp_gmf_aec](./src/esp_gmf_aec.c): 回声消除
* [esp_gmf_afe](./src/esp_gmf_afe.c): 基于 `esp-sr` 中 `audio front end (afe)` 实现的易用接口,提供了语音唤醒,命令词识别,人声检测等语音识别的功能
## AFE 管理器 `esp_gmf_afe_manager`
### 功能
- 管理音频前端(Audio Front-End, AFE)的数据通路与任务调度
- 支持动态启用/禁用特性(如唤醒、AEC、VAD)
- 提供多任务协同机制,确保实时音频流处理
### 关键特性
- 任务管理:创建独立的 `feed_task` 和 `fetch_task`,分别负责音频数据输入和结果处理
- 特性控制:通过 `esp_afe_manager_enable_features` 动态开关算法模块
- 事件驱动:支持挂起/恢复操作 `esp_afe_manager_suspend`,适配低功耗场景
### 系统框图
```mermaid
graph LR
subgraph AFE管理器
DATA_CB[原始数据]
FEED_TASK[feed_task<br>音频输入任务]
FETCH_TASK[fetch_task<br>结果处理任务]
AFE_CORE[AFE核心<br>esp_afe_sr_iface]
EVENT_CB[结果回调]
CTRL_IF[控制接口]
end
FEED_TASK -->|数据回调| DATA_CB
FEED_TASK -->|原始音频数据| AFE_CORE
AFE_CORE -->|处理结果| FETCH_TASK
FETCH_TASK -->|结果回调<br>(数据/唤醒/VAD/命令词)| EVENT_CB
CTRL_IF -->|挂起/恢复接口| FEED_TASK
CTRL_IF -->|挂起/恢复接口| FETCH_TASK
CTRL_IF -->|特性使能接口<br>(AEC/VAD/SE)| AFE_CORE
```
## 回声消除 `esp_gmf_aec`
### 功能
- 消除音频中的回声干扰,提升语音质量
- 支持多通道输入,单通道输出
### 技术规格
- 支持硬件:`ESP32`、`ESP32-S3`、`ESP32-C5` 和 `ESP32-P4`
- 输入格式
- 采样率:16 kHz
- 位宽:16-bit PCM
- 通道配置:字符串标识(如 `MMNR`)
- `M`:麦克风通道
- `R`:回采信号通道
- `N`:无效信号
- 输出格式:16-bit 单通道 PCM
## 语音识别 `esp_gmf_afe`
### 功能
- 语音唤醒(Wake Word Detection)
- 命令词识别(Voice Command Detection)
- 人声检测(VAD)与状态管理
### 关键特性
- 支持硬件: `esp32`, `esp32s3` 和 `esp32p4`
- 输入与输出同上文中的 `esp_gmf_aec`
- 统一事件接口:通过回调函数通知事件(唤醒开始/结束、VAD 状态变化、命令词触发)
- 状态机管理:自动维护唤醒、语音、静音等状态切换
### 系统框图
```mermaid
graph TD
subgraph 音频前级处理
RAW[音频数据]
end
subgraph GMF_AFE
AFE_MGR[AFE管理器<br>esp_gmf_afe_manager]
INPUT_RB[输入缓存]
OUTPUT_RB[输出缓存]
STATE_MACHINE[唤醒/VAD状态机]
MN_DET[命令词检测]
DELAY[延时机制]
end
subgraph 应用层
EVENT_CB[事件回调]
OUT_PORT[数据出口]
end
RAW -->| 音频前级处理后的数据| INPUT_RB
INPUT_RB -->| 数据回调 | AFE_MGR
AFE_MGR -->| 结果回调<br>数据 | OUTPUT_RB
AFE_MGR -->| 结果回调<br>唤醒/VAD事件 | STATE_MACHINE
AFE_MGR -->| 结果回调<br>数据 | MN_DET
OUTPUT_RB --> DELAY --> OUT_PORT
STATE_MACHINE -->| 事件通知 | EVENT_CB
MN_DET -->| 事件通知 | EVENT_CB
```
### `esp_gmf_afe_cfg_t` 高级配置参数说明
| 参数 | 描述 | 默认值 |
| --- | --- | --- |
| **wakeup_time** | 唤醒功能启用后,若未检测到人声事件,则在等待 `wakeup_time` 毫秒后触发唤醒结束事件 | 10000(ms) |
| **wakeup_end** | 唤醒功能启用后,若依次检测到人声和静音,则在静音事件触发后等待 `wakeup_end` 毫秒,触发唤醒结束事件 | 2000(ms) |
| **vcmd_timeout** | 命令词检测的超时时间,超时后需重新调用接口以开启新一轮命令词检测 | 5760(ms) |
| **delay_samples** | 输出数据延迟,用于补偿 VAD 检测滞后导致的数据输出与事件回调不同步的问题。该参数指定的数据长度(以采样点为单位)换算为时间后,应大于等于初始化 AFE 管理器时配置的 `afe_config_t.vad_min_speech_ms` | 2048(samples) |
### 唤醒与VAD状态机
以下列举了功能使能情况下的状态切换,`/` 字符之后为触发的用户事件
- **使能唤醒,不使能VAD**
该场景主要关注唤醒词的检测,同时可以配置(wakeup_time),在一段时间后触发结束事件
修改示例 [wwe](./examples/wwe/main/main.c) 中的配置,从而使用该场景
```c
#define WAKENET_ENABLE (true)
#define VAD_ENABLE (false)
```
```mermaid
stateDiagram-v2
[*] --> IDLE
IDLE --> WAKEUP: 唤醒词 / (WAKEUP_START)
WAKEUP --> IDLE: 定时器(wakeup_time)超时 / (WAKEUP_END)
```
- **使VAD,不使能唤醒词**
该场景主要关注人声的检测,在检测到人说话的前后节点触发相应事件
修改示例 [wwe](./examples/wwe/main/main.c) 中的配置,从而使用该场景
```c
#define WAKENET_ENABLE (false)
#define VAD_ENABLE (true)
```
```mermaid
stateDiagram-v2
[*] --> IDLE
IDLE --> SPEECHING: 检测到人声 / (VAD_START)
SPEECHING --> IDLE: 检测到噪声或静音 / (VAD_END)
```
- **使能唤醒和VAD**
该场景结合命令词与人声检测,避免在唤醒间隔之外频繁触发人声检测事件
修改示例 [wwe](./examples/wwe/main/main.c) 中的配置,从而使用该场景
```c
#define WAKENET_ENABLE (true)
#define VAD_ENABLE (true)
```
```mermaid
stateDiagram-v2
[*] --> IDLE
IDLE --> WAKEUP: 唤醒词 / (WAKEUP_START)
WAKEUP --> SPEECHING: 检测到人声 / (VAD_START)
WAKEUP --> IDLE: 定时器(wakeup_time)超时 / (WAKEUP_END)
SPEECHING --> WAIT_FOR_SLEEP: 检测到噪声或静音 / (VAD_END)
WAIT_FOR_SLEEP --> SPEECHING: 检测到人声 / (VAD_START)
WAIT_FOR_SLEEP --> IDLE: 定时器(wakeup_end)超时 / (WAKEUP_END)
```
### 命令词检测
用户需决定何时开始检测命令词,如典型的使用场景:在状态机推送(WAKEUP_START)事件之后,开启检测,并在回调函数中根据检测到的命令词序号决定下一步操作
* 命令词检测与唤醒状态机独立
* 命令词支持连续检测,直到超时
## 示例
示例代码,请参阅 [示例](./examples) 文件夹中的唤醒词检测和音频回声消除程序。
idf.py add-dependency "espressif/gmf_ai_audio^0.6.1"