mirror of
https://github.com/espressif/esp-sr.git
synced 2025-09-15 15:28:44 +08:00
Merge branch 'feature/decoder_accelerate' into 'master'
Feature/decoder accelerate See merge request speech-recognition-internal/esp_sr_public!7
This commit is contained in:
commit
bb416a8319
@ -1,4 +1,4 @@
|
||||
# esp_sr
|
||||
# esp_sr [[中文]](./README_cn.md)
|
||||
|
||||
Espressif esp_sr provides basic algorithms for **Speech Recognition** applications. Now, this framework has three modules:
|
||||
|
||||
|
||||
24
README_cn.md
Normal file
24
README_cn.md
Normal file
@ -0,0 +1,24 @@
|
||||
# esp_sr [[English]](./README.md)
|
||||
|
||||
esp_sr 提供语音识别相关方向算法模型,目前主要包括三个模块:
|
||||
|
||||
* 唤醒词识别模型 [WakeNet](wake_word_engine/README_cn.md)
|
||||
* 语音命令识别模型 [MultiNet](speech_command_recognition/README_cn.md)
|
||||
* 声学算法:AEC(Acoustic Echo Cancellation), VAD(Voice Activity Detection), AGC(Automatic Gain Control), NS(Noise Suppression)
|
||||
|
||||
这些算法以组件的形式提供,因此可以轻松地将它们集成到您的项目中。
|
||||
|
||||
## 唤醒词识别
|
||||
|
||||
唤醒词模型 [WakeNet](wake_word_engine/README_cn.md),致力于提供一个低资源消耗的的高性能模型,支持类似“Alexa”,“天猫精灵”,“小爱同学”等唤醒词的识别。
|
||||
|
||||
目前乐鑫免费开放“Hi,乐鑫”唤醒词。如果用户需要其它唤醒词,乐鑫提供有唤醒词定制服务,具体可参考 [乐鑫语音唤醒词定制流程](wake_word_engine/乐鑫语音唤醒词定制流程.md)。
|
||||
|
||||
## 语音命令识别
|
||||
|
||||
命令词识别模型 [MultiNet](speech_command_recognition/README_cn.md) ,致力于提供一个灵活的离线语音命词识别框架。用户可方便根据需求自定义语音命令,无需重新训练模型。
|
||||
|
||||
目前模型支持类似“打开空调”,“打开卧室灯”等中文命令词识别,自定义语音命令词最大个数为 100。
|
||||
|
||||
英文命令词定义将在下一版提供支持。
|
||||
|
||||
Binary file not shown.
@ -1,4 +1,4 @@
|
||||
# MultiNet Introduction
|
||||
# MultiNet Introduction [[中文]](./README_cn.md)
|
||||
|
||||
MultiNet is a lightweight model specially designed based on [CRNN](https://arxiv.org/pdf/1703.05390.pdf) and [CTC](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.6306&rep=rep1&type=pdf) for the implementation of multi-command recognization with ESP32. Now, up to 100 speech commands, including customized commands, are supported.
|
||||
|
||||
|
||||
153
speech_command_recognition/README_cn.md
Normal file
153
speech_command_recognition/README_cn.md
Normal file
@ -0,0 +1,153 @@
|
||||
# MultiNet 介绍 [[English]](./README.md)
|
||||
|
||||
MultiNet 是为了在 ESP32 上实现多命令词识别, 基于 [CRNN](https://arxiv.org/pdf/1703.05390.pdf) 网络和 [CTC](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.75.6306&rep=rep1&type=pdf) 设计的轻量化模型,目前支持 100 个以内的自定义命令词识别。
|
||||
|
||||
## 概述
|
||||
|
||||
MultiNet 输入为音频经过 **MFCC** 处理后的特征值,输出为汉语/英语的“音素”分类。通过对输出音素进行组合,则可以对应到相应的汉字或单词。
|
||||
|
||||
## 命令词识别流程
|
||||
|
||||
1. 添自定义命令词
|
||||
2. 输入一帧时间长度为 30ms 的音频(16KHz, 16bit, 单声道)
|
||||
3. 获得输入音频的 **MFCC** 特征值
|
||||
4. 将特征值输入 MultiNet,输出该帧对应的识别**音素**
|
||||
5. 将识别出的音素送至语言模型输出最终识别结果
|
||||
6. 将识别结果和已存储的命令词队列比对,输出对应的命令词 ID
|
||||
|
||||
其中 3-6 步均在接口内完成,无须用户自己处理。
|
||||
|
||||
可以参考以下命令词识别流程:
|
||||
|
||||

|
||||
|
||||
|
||||
## 使用指南
|
||||
|
||||
### 命令词
|
||||
|
||||
目前,用户可以使用 `make menuconfig` 命令来添加自定义命令词。可以通过 `menuconfig->Component config > ESP Speech Recognition->Add speech commands` 添加命令词,目前已经添加有 20 个命令词,如下表所示:
|
||||
|
||||
|Command ID|命令词|Command ID|命令词|Command ID|命令词|Command ID|命令词|
|
||||
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
|0|打开空调|5|降低一度|10| 关闭节能模式|15| 播放歌曲
|
||||
|1|关闭空调|6|制热模式|11| 除湿模式|16| 暂停播放
|
||||
|2|增大风速|7|制冷模式|12| 关闭除湿模式|17| 定时一小时
|
||||
|3|减少风速|8|送风模式|13| 打开蓝牙|18| 打开电灯
|
||||
|4| 升高一度|9|节能模式|10| 关闭蓝牙|19| 关闭电灯
|
||||
|
||||
网络支持自定义命令词,用户可以将自己想要的设置的命令词加入 MultiNet,注意新添加的命令词需要有其的对应 Command ID 已便于 MultiNet 时候后输出。
|
||||
|
||||
### 添加自定义命令词
|
||||
|
||||
可以通过 `make menuconfig > Component config > ESP Speech Recognition->Add speech commands` 命令使用拼音添加对应的命令词,比如:
|
||||
|
||||
当添加“打开空调”命令时,应该输入 "da kai kong tiao",请注意:
|
||||
|
||||
- 一个 Commnad ID 可以对应多个命令短语
|
||||
- 最多支持 100 个 Command ID 或者 命令短语
|
||||
- 同一个 Command ID 对应的几条命令短语之间应该由 "," 隔开
|
||||
|
||||
### 基础配置
|
||||
在使用命令词识别模型前首先需要定义以下变量:
|
||||
|
||||
1. 模型版本
|
||||
|
||||
模型版本可以需要在 `menuconfig` 中进行预选择,请在选择后在代码里添加如下的代码
|
||||
static const esp_mn_iface_t *multinet = &MULTINET_MODEL;
|
||||
|
||||
2. 生成模型句柄
|
||||
|
||||
支持的语言和模型的有效性由模型参数决定,现在只支持中文命令。请在 `menuconfig` 中配置 `MULTINET_COEFF` 选项,并在代码中添加以下行以生成模型句柄。 6000 是语音识别的音频长度,以 ms 为单位,sample_length 的范围为 0~6000。
|
||||
model_iface_data_t *model_data = multinet->create(&MULTINET_COEFF, 6000);
|
||||
|
||||
### API 参考
|
||||
|
||||
#### 头文件
|
||||
- esp_mn_iface.h
|
||||
- esp_mn_models.h
|
||||
|
||||
#### 函数
|
||||
|
||||
- `typedef model_iface_data_t* (*esp_mn_iface_op_create_t)(const model_coeff_getter_t *coeff, int sample_length);`
|
||||
|
||||
**Definition**
|
||||
|
||||
Easy function type to initialize a model instance with a coefficient.
|
||||
|
||||
**Parameter**
|
||||
|
||||
* coeff: The coefficient for speech commands recognition.
|
||||
* sample_length: Audio length for speech recognition, in ms. The range of sample_length is 0~6000.
|
||||
|
||||
**Return**
|
||||
|
||||
Handle to the model data.
|
||||
|
||||
- `typedef int (*esp_mn_iface_op_get_samp_chunksize_t)(model_iface_data_t *model);`
|
||||
|
||||
**Definition**
|
||||
|
||||
Callback function type to fetch the amount of samples that need to be passed to the detection function. Every speech recognition model processes a certain number of samples at the same time. This function can be used to query the amount. Note that the returned amount is in 16-bit samples, not in bytes.
|
||||
|
||||
**Parameter**
|
||||
|
||||
model: The model object to query.
|
||||
|
||||
**Return**
|
||||
|
||||
The amount of samples to feed the detection function.
|
||||
|
||||
|
||||
- `typedef int (*esp_mn_iface_op_get_samp_chunknum_t)(model_iface_data_t *model);`
|
||||
|
||||
**Definition**
|
||||
|
||||
Callback function type to fetch the number of frames recognized by the speech command.
|
||||
|
||||
**Parameter**
|
||||
|
||||
model: The model object to query.
|
||||
|
||||
**Return**
|
||||
|
||||
The number of the frames recognized by the speech command.
|
||||
|
||||
- `typedef int (*esp_mn_iface_op_get_samp_rate_t)(model_iface_data_t *model);`
|
||||
|
||||
**Definition**
|
||||
|
||||
Get the sample rate of the samples to feed to the detection function.
|
||||
|
||||
**Parameter**
|
||||
|
||||
model: The model object to query.
|
||||
|
||||
**Return**
|
||||
|
||||
The sample rate, in Hz.
|
||||
|
||||
- `typedef float* (*esp_mn_iface_op_detect_t)(model_iface_data_t *model, int16_t *samples);`
|
||||
|
||||
**Definition**
|
||||
|
||||
Easy function type to initialize a model instance with a coefficient.
|
||||
|
||||
**Parameter**
|
||||
|
||||
coeff: The coefficient for speech commands recognition.
|
||||
|
||||
**Return**
|
||||
|
||||
* The command id, if a matching command is found.
|
||||
* -1, if no matching command is found.
|
||||
|
||||
- `typedef void (*esp_mn_iface_op_destroy_t)(model_iface_data_t *model);`
|
||||
|
||||
**Definition**
|
||||
|
||||
Destroy a voiceprint recognition model.
|
||||
|
||||
**Parameters**
|
||||
|
||||
model: Model object to destroy.
|
||||
@ -1,4 +1,4 @@
|
||||
# Espressif Speech Wake Word Customization Process
|
||||
# Espressif Speech Wake Word Customization Process [[中文]](./乐鑫语音唤醒词定制流程.md)
|
||||
|
||||
#### Offline Wake Word Customization
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
# WakeNet
|
||||
# WakeNet [[中文]](./README_cn.md)
|
||||
|
||||
WakeNet, which is a wake word engine built upon neural network, is specially designed for low-power embedded MCUs. Now, the WakeNet model supports up to 5 wake words.
|
||||
|
||||
@ -31,9 +31,9 @@ Please see the flow diagram of WakeNet below:
|
||||
|
||||
Go to `make menuconfig`, navigate to `Component config` >> `ESP Speech Recognition` >> `Wake word engine`. See below:
|
||||
|
||||
<center>
|
||||
<img src="../img/model_sel.png" width = "500" />
|
||||
</center>
|
||||
<center>
|
||||
<img src="../img/model_sel.png" width = "500" />
|
||||
</center>
|
||||
|
||||
|
||||
- How to select the wake words
|
||||
|
||||
87
wake_word_engine/README_cn.md
Normal file
87
wake_word_engine/README_cn.md
Normal file
@ -0,0 +1,87 @@
|
||||
# WakeNet [[English]](./README.md)
|
||||
|
||||
WakeNet是一个基于神经网络,为低功耗嵌入式MCU设计的的唤醒词模型,目前支持5个以内的唤醒词识别。
|
||||
|
||||
## Overview
|
||||
|
||||
WakeNet的流程图如下:
|
||||
<center>
|
||||
<img src="../img/wakenet_workflow.png" width = "800" />
|
||||
</center>
|
||||
|
||||
|
||||
- speech features:
|
||||
我们使用[MFCC](https://en.wikipedia.org/wiki/Mel-frequency_cepstrum)方法提取语音频谱特征。输入的音频文件采样率为16KHz,单声道,编码方式为signed 16-bit。每帧窗宽和步长均为30ms。
|
||||
|
||||
- neural network:
|
||||
神经网络结构已经更新到第6版,其中:
|
||||
- wakeNet1和wakeNet2已经停止使用。
|
||||
- wakeNet3和wakeNet4基于[CRNN](https://arxiv.org/abs/1703.05390)结构。
|
||||
- WakeNet5(WakeNet5X2,WakeNetX3) 和 WakeNet6 基于 the [Dilated Convolution](https://arxiv.org/pdf/1609.03499.pdf) 结构。
|
||||
|
||||
注意,WakeNet5,WakeNet5X2 和 WakeNet5X3 的网络结构一致,但是 WakeNetX2 和 WakeNetX3 的参数比 WakeNet5 要多。请参考 [性能测试](#性能测试) 来获取更多细节。
|
||||
|
||||
- keyword trigger method:
|
||||
对连续的音频流,为准确判断关键词的触发,我们通过计算若干帧内识别结果的平均值M,来判断触发。当M大于大于指定阈值,发出触发的命令。
|
||||
|
||||
|
||||
## API introduction
|
||||
|
||||
- WakeNet模型选择
|
||||
使用make menuconfig,选择Component config >> ESP Speech commands >> Keyword spotting model,如下图
|
||||
|
||||
<center>
|
||||
<img src="../img/model_sel.png" width = "500" />
|
||||
</center>
|
||||
|
||||
- 唤醒词选择
|
||||
使用make menuconfig,选择Component config >> ESP Speech commands >> Wake word list进行选择,如下图
|
||||
<center>
|
||||
<img src="../img/word_sel.png" width = "500" />
|
||||
</center>
|
||||
|
||||
对于自定义的唤醒词,请选择`customized wake word`,目前唤醒词定制只支持WakeNet5和WakeNet6,WakeNet3和WakeNet4只对之前版本保持兼容,具体可参考《乐鑫唤醒词定制流程》。
|
||||
|
||||
- 阈值设定
|
||||
1.唤醒词模型通过设定触发阈值,来调整唤醒灵敏度,阈值范围为0~0.9999,对于包含多个唤醒词的模型,每个唤醒词的阈值相互独立。
|
||||
2.调整阈值时,当阈值减小,唤醒识别率增高同时误触发的风险也变大,反之唤醒识别率降低,误触发也减小。实际使用需要根据具体应用场景选择合适的阈值。
|
||||
3.每个唤醒词在模型内部预定义两个阈值,在模型初始化时使用,其中
|
||||
```
|
||||
typedef enum {
|
||||
DET_MODE_90 = 0, //Normal, response accuracy rate about 90%
|
||||
DET_MODE_95 //Aggressive, response accuracy rate about 95%
|
||||
} det_mode_t;
|
||||
```
|
||||
4.初始化后,可以使用`set_det_threshold()`对不同唤醒词阈值进行重新设定。
|
||||
|
||||
- 采样率与每帧长度
|
||||
使用函数`get_samp_rate`获取识别所需音频数据的采样率
|
||||
使用函数`get_samp_chunksize`获取每帧所需采样点,语言编码方式为unsigned 16-bit int
|
||||
|
||||
|
||||
## 性能测试
|
||||
|
||||
### 1.资源占用
|
||||
|
||||
|模型|参数量|RAM|平均每帧时间消耗|每帧时长|
|
||||
|:---:|:---:|:---:|:---:|:---:|
|
||||
|Quantized WakeNet3|26 K|20 KB|29 ms|90 ms|
|
||||
|Quantised WakeNet4|53 K|22 KB|48 ms|90 ms|
|
||||
|Quantised WakeNet5|41 K|15 KB|5.5 ms|30 ms|
|
||||
|Quantised WakeNet5X2|165 K|20 KB|10.5 ms|30 ms|
|
||||
|Quantised WakeNet5X3|371 K|24 KB|18 ms|30 ms|
|
||||
|
||||
|
||||
### 2.识别性能
|
||||
|距离|安静环境|平稳噪声(SNR=0~10dB)|语音噪声(SNR=0~10dB)|AEC打断唤醒(-5~-15dB)|
|
||||
|:---:|:---:|:---:|:---:|:---:|
|
||||
|1 m|95%|88%|85%|89%|
|
||||
|3 m|90%|80%|75%|80%|
|
||||
|
||||
误唤醒率:1 次/ 12 小时
|
||||
**注**:以上测试基于 WakeNet5X2(hilexin) 模型,使用lyrat-mini开发板测试。该板为单颗麦克风拾音,若使用多麦拾音的开发板,可预料在远场场景会有更好的识别性能。
|
||||
|
||||
## 唤醒词定制
|
||||
|
||||
如果需要定制唤醒词,请参考[乐鑫语音唤醒词定制流程](乐鑫语音唤醒词定制流程.md)。
|
||||
|
||||
78
wake_word_engine/乐鑫语音唤醒词定制流程.md
Normal file
78
wake_word_engine/乐鑫语音唤醒词定制流程.md
Normal file
@ -0,0 +1,78 @@
|
||||
# 乐鑫语音唤醒方案客户定制流程 [[English]](./ESP_Wake_Words_Customization.md)
|
||||
|
||||
#### 一、离线唤醒词定制服务
|
||||
|
||||
乐鑫提供 离线语音唤醒词 定制服务,详情如下:
|
||||
|
||||
1. “嗨乐鑫“ ”Alexa” “Espressif” 等官方公开的唤醒词,客户可直接商用
|
||||
- 如 ADF/ASR Demo 提供的离线命令词提供
|
||||
- 乐鑫会逐渐开放更多的商用 Free 关键词
|
||||
|
||||
2. 除官方开放的唤醒词,可接受客户定制服务,分如下两种情况
|
||||
- 如果客户提供 唤醒词语料
|
||||
- 需要提供大于 1.5 万条合格的语料(语料需求见下文)
|
||||
- 语料提供给乐鑫后,需要 2~3 周进行模型训练及调优
|
||||
- 根据量级收取少量模型定制费用
|
||||
|
||||
- 如果客户不提供 唤醒词语料
|
||||
- 所有训练语料由乐鑫采集提供(训练前、后,乐鑫不会泄露客户语料)
|
||||
- 语料提供给乐鑫后,需要 2~3 周进行模型训练及调优
|
||||
- 根据量级收取少量模型定制费用(语料采集费用另收)
|
||||
|
||||
- 费用收取具体定价和定制时间,烦请邮件至 sales@espressif.com 协议商定
|
||||
- 收费取决于 唤醒词定制的数量 以及 产品量产数量
|
||||
|
||||
3. 对于乐鑫唤醒词模型:
|
||||
- 目前单个模型最多支持5个及以内的唤醒词识别
|
||||
- 每个唤醒词通常由 3-6 音节组成,比如“hi乐鑫”,“Alexa”,“小爱同学”,“你好天猫”等
|
||||
- 可多个唤醒模型一起使用,具体需根据客户应用的资源消耗确定
|
||||
|
||||
|
||||
#### 二、训练语料要求
|
||||
|
||||
客户可自备训练语料或向第三方采购,对于语料有以下要求
|
||||
|
||||
- 语料音频格式要求
|
||||
- 采样率(sample rate):16 KHz
|
||||
- 编码(encoding):16-bit signed int
|
||||
- 通道数(channel):mono
|
||||
- 格式:wav
|
||||
|
||||
- 语料采集要求
|
||||
- 采样人数:最好样本可以大于 500 人,其中男女,年龄分布均衡,儿童不小于 100 人
|
||||
- 采样环境:环境噪声低(< 40 dB),建议在语音室等专业环境下录制
|
||||
- 录制场景:距离麦克风 1 m 处每人录制 15 遍,其中 5 遍快语速,5 遍正常语速,5 遍慢语速;距离麦克风 3 m 处每人录制 15 遍,其中 5 遍快语速,5 遍正常语速,5 遍慢语速
|
||||
- 录制设备:高保真麦克风
|
||||
- 样本命名需体现样本信息:如 female_age_fast_id.wav 或有单独表格记录每个样本的年龄,性别等信息
|
||||
|
||||
#### 三、硬件设计与测试
|
||||
|
||||
语音唤醒效果与硬件设计以及腔体结构有很大关系,为确保硬件设备设计合理,请认真阅读以下内容
|
||||
|
||||
- 硬件设计要求
|
||||
- 对于各类语音音箱类设计,乐鑫可提供 原理图/PCB 等设计参考,客户可以根据自身具体需求设计修改,设计完毕后,乐鑫可提供Review服务,避免常见设计问题。
|
||||
|
||||
- 腔体结构,最好有专门的声学人员参与设计,乐鑫不提供 ID 设计类的参考,客户可以市场上主流音箱设计为参考
|
||||
> 例如 天猫精灵、小度音箱、谷歌音箱等
|
||||
|
||||
2. 硬件设计好后,客户可通过以下简单测试,验证硬件设计效果(下列测试都是基于语音室环境,客户可以根据自身测试环境做调整)
|
||||
- 录音测试,验证 MIC、codec 录音增益以及失真情况
|
||||
|
||||
- 音源 90 dB,距离 0.1 m 播放样本,调节增益,保证录音样本不饱和
|
||||
- 使用扫频文件(0~20 KHz),使用 16 KHz 采样率录音,音频不会出现明显频率混叠
|
||||
- 录制 100 个语音样本,使用公开的云端语音识别端口识别,识别率达到指定标准
|
||||
|
||||
- 播音测试,验证 功率放大器(PA)、喇叭的失真情况
|
||||
- 测试PA功率 @1% 总谐波失真(THD)
|
||||
|
||||
- 语音算法测试,验证 AEC、BFM、NS 效果
|
||||
- 首先需要注意下参考信号延时,不同的 AEC 算法有不同的要求
|
||||
- 以实际产品场景为测试指标,例如 MIC 播放 85DB-90DB 大梦想家.wav, 设备回采
|
||||
- 保存回声参考信号、回声消除后的信号分析,对比查看 AEC、NS、BFM 等效果
|
||||
|
||||
- DSP性能测试,验证DSP参数是否合适,同时尽可能减少DSP算法中的非线性失真
|
||||
- 降噪(Noise suppression)算法性能测试
|
||||
- 回声消除(Acoustic Echo Cancellation)算法性能测试
|
||||
- 语音增强(Speech Enhancement)算法性能测试
|
||||
|
||||
3. 硬件设计完毕后,**可寄送** 1-2 台硬件至乐鑫,乐鑫会基于客户整机做唤醒词性能调优
|
||||
Loading…
Reference in New Issue
Block a user