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:
Sun Xiang Yu 2019-09-09 20:44:55 +08:00
commit bb416a8319
9 changed files with 349 additions and 7 deletions

View File

@ -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
View 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.

View File

@ -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.

View 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 步均在接口内完成,无须用户自己处理。
可以参考以下命令词识别流程:
![speech_command-recognition-system](../img/multinet_workflow.png)
## 使用指南
### 命令词
目前,用户可以使用 `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.

View File

@ -1,4 +1,4 @@
# Espressif Speech Wake Word Customization Process
# Espressif Speech Wake Word Customization Process [[中文]](./乐鑫语音唤醒词定制流程.md)
#### Offline Wake Word Customization

View File

@ -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

View 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和WakeNet6WakeNet3和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)。

View File

@ -0,0 +1,78 @@
# 乐鑫语音唤醒方案客户定制流程 [[English]](./ESP_Wake_Words_Customization.md)
#### 一、离线唤醒词定制服务
乐鑫提供 离线语音唤醒词 定制服务,详情如下:
1. “嗨乐鑫“ ”Alexa” “Espressif” 等官方公开的唤醒词,客户可直接商用
- 如 ADFASR Demo 提供的离线命令词提供
- 乐鑫会逐渐开放更多的商用 Free 关键词
2. 除官方开放的唤醒词,可接受客户定制服务,分如下两种情况
- 如果客户提供 唤醒词语料
- 需要提供大于 1.5 万条合格的语料(语料需求见下文)
- 语料提供给乐鑫后,需要 23 周进行模型训练及调优
- 根据量级收取少量模型定制费用
- 如果客户不提供 唤醒词语料
- 所有训练语料由乐鑫采集提供(训练前、后,乐鑫不会泄露客户语料)
- 语料提供给乐鑫后,需要 23 周进行模型训练及调优
- 根据量级收取少量模型定制费用(语料采集费用另收)
- 费用收取具体定价和定制时间,烦请邮件至 sales@espressif.com 协议商定
- 收费取决于 唤醒词定制的数量 以及 产品量产数量
3. 对于乐鑫唤醒词模型:
- 目前单个模型最多支持5个及以内的唤醒词识别
- 每个唤醒词通常由 3-6 音节组成比如“hi乐鑫”“Alexa”“小爱同学”“你好天猫”等
- 可多个唤醒模型一起使用,具体需根据客户应用的资源消耗确定
#### 二、训练语料要求
客户可自备训练语料或向第三方采购,对于语料有以下要求
- 语料音频格式要求
- 采样率(sample rate)16 KHz
- 编码encoding)16-bit signed int
- 通道数channelmono
- 格式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 台硬件至乐鑫,乐鑫会基于客户整机做唤醒词性能调优