espressif/gmf_ai_audio

uploaded 5 days ago
Espressif GMF AI Audio Elements Module

readme (zh)

# 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) 文件夹中的唤醒词检测和音频回声消除程序。

Links

Supports all targets

License: Custom

Tags

To add this component to your project, run:

idf.py add-dependency "espressif/gmf_ai_audio^0.6.1"

or download archive

Stats

  • Archive size
    Archive size ~ 63.35 KB
  • Downloaded in total
    Downloaded in total 6 times
  • Downloaded this version
    This version: 5 times

Badge

espressif/gmf_ai_audio version: 0.6.1
|