语音识别效果优化¶
1 概要及背景¶
本文档主要针对 具备软件开发和硬件调试能力,并且已经熟悉启英泰伦语音SDK及方案开发流程的开发者,通过本文档进行识别效果的debug及调优效果。
2 识别效果排查¶
语音识别效果是整体的表现,影响其效果的既包含识别算法(类似人的大脑),也包含硬件结构的特性(类似人的耳朵),当出现识别不理想的时候,我们可以优先采用对比的方法查看是否是外部环境影响,排查后再去软件优化,可按下面流程进行问题排查。
2.1 通过采音观察麦克风拾音效果¶
麦克风输入的音频信号质量直接影响到识别效果好坏,所以需要对麦克风输入的音频、麦克风电路进行录音分析,以确定硬件电路、结构、麦克风物料等是否满足要求,同时在问题分析中也可通过采音来定位一些麦克风电路所引起的识别差问题。详情参考:采音板使用说明进行底噪采音,观察采集到的音频波形有无异常,如有异常比如截幅,底噪高,正常音量下语音幅度极低等情况可参考下面各优化方向来进行优化。
2.2 硬件优化¶
2.2.1 确保麦克风参数无误,正反顺序是正确的,没有虚接,拾音孔没有堵塞等情况
用于我司语音芯片的麦克风参数规格有两点需要注意的,灵敏度必须为-32±3dB,信噪比必须为≥65dB;推荐用户直接采用我司验证后的麦克风设计方案,可参考我司外围器件兼容列表选择合适的麦克风。
如下图,左侧信号为麦克风反接时输入的音频信号,与右侧麦克风正接时输入的音频信号相比,幅值明显偏小。

如下图,麦克风座子大小不合适导致与端子虚接。

2.2.2 整机装配中请确保麦克风线束远离220V电源线以及其他强电线束,并且远离PCBA上的继电器、变压器等强电部分的元器件
交流电会产生工频干扰,可能耦合到麦克风信号中,导致”嗡嗡”声(低频噪声),而且如果电源线束绝缘不良,距离过近时高压可能击穿麦克风电路,导致信号异常甚至损坏麦克风。部分元器件在开关或工作时会产生高频瞬态噪声,可能通过电磁辐射或传导干扰麦克风信号,导致语音失真或底噪增加。
2.2.3 硬件电路的设计请确保麦克风电路符合设计规范,以下给出几个与识别效果密切相关的设计规范要点,其他设计规范请参考我司硬件设计资料
如下图,语音芯片供电纹波要小于300mV,电源纹波过大会影响语音识别效果,增加TVS与电阻后,对电源的浪涌和干扰纹波都有很好的抑制效果。

如下图,语音芯片有接4.7UF的滤波电容脚(VDD、AVDD、VDD33、VDD11)和VCM脚,电容尽量靠近芯片放置,电容与芯片引脚距离<5mm,走线宽度≥0.4mm。电容接地端靠近焊盘多打几个地孔,至少每个电容旁打一个地孔。
VDD、AVDD、VDD33、VDD11与语音芯片的地回路要最短,不能绕。AVDD、VDD33、VDD11三处电源纹波要求≤50mV,若对地电容离芯片引脚太远纹波会增大。

如下图,麦克风电路的阻容尽量靠近芯片放置,距离<5mm;MIC+、MIC-并行走,最好不要打孔。麦克风与语音芯片之间的布局路径尽量短,底层不要走线,保证地的完整性,顶层和底层都铺AGND。未走线的地方铺实心地铜,多打地孔,至少语音部分要铺地铜。

2.3结构优化¶
确认硬件没有问题之后,如果发现所有命令词的识别效果都不好,请将麦克风从机器结构中取出,固定在机器外壳表面或者直接使用裸板进行测试,若发现效果提升明显,则是机器结构原因导致识别效果不理想,需要进行结构上的优化。除此之外,还需要注意机器的结构噪音是否过大,麦克风处噪声达到75dB就会对识别有明显影响,机器的结构噪音也可通过采音进行观察一般来说声音幅值最好不超过5000,如果机器结构噪音过大也需要进行结构上的优化。如下图,麦克风结构处的噪音幅值已经满幅,必须要在结构上想办法处理。

关于结构优化请参考产品结构设计对机器结构进行优化。
2.4 软件优化¶
在排除硬件与结构的因素影响之后,则可以考虑从软件方向进行优化。
2.4.1 整体命令词识别不好
首先,要确定产品的使用场景去正确选择对应的声学模型,因为不同的声学模型在不同环境会有不同的效果。
在启英AI平台->语言模型开发功能中选择好参数以及应用场景,即可在选择声学模型一栏中选择模型。举个例子,中文风扇通用模型_pro4_V1_1.3M_V01374这个模型包含了一下信息,从下述信息我们就得知该模型适合运用于中文风扇产品的开发。
| 名称 | 含义 |
|---|---|
| 中文 | 能够识别的语言 |
| 风扇通用 | 使用场景为风扇 |
| pro4 | 分为普通声学模型和 pro 声学模型两种模型,proX 其中 X 越高代表越高的压缩效果,建议采用压缩效果较高的 pro 模型进行开发 |
| V1 | 版本号,尽量使用版本最新的模型 |
| 1.3M | 模型大小 |
| V01374 | 模型编号,沟通交互时,可以用模型编号进行同步,如上面的 V01374 可以简称为 1374 模型 |
| ----------------------------------- ---------------------------------------------------------------------------------------------------------------- |
其次,模型开发使用平台的语言模型自动优化选项来进行优化。
在启英AI平台->语言模型开发功能中选择命令词合成语言模型,勾选旁边的语言模型自动优化选项,如下图,目前pro声学模型经过平台自动优化过后的模型基本上都能达到理想的识别效果。

最后,可以采用一些特定算法对识别效果进行优化。
- 将动态增益改为固定增益
在一些类似按摩仪,头盔等使用距离较近的产品,麦克风的拾音效果可能会出现削顶现象,如下图红色箭头标记处,这种情况我们可以将动态增益改为固定增益,另外麦克风位置距离噪声源很近并且噪声源主要是稳态噪声的情况下比如风扇,油烟机等产品,若识别不好也可以尝试采用此算法进行优化。

以下解释几个专业名词:
ALC叫自动增益调整,当语音信号幅度过小时,则自动提高增益,把信号自动调大,便于识别。语音信号幅度过大时,则自动降低增益,把信号自动调小,便于识别。上电是默认增益为28.5,之后不同环境下,增益是自动变化的。
动态ALC即是动态控制ALC的开和关,在ALC调整放大过大时(ALC提高或降低就那么几个档位,有可能一下子把信号放得过大了削頂),会自动把ALC关掉,改变为固定增益,从而降低信号幅度,避免削頂,保障基本的识别。之后当外部信号变小时,又会自动打开
ALC,不同环境下,增益是自动变化的,所以称为动态增益。
固定增益就是关闭动态ALC以及关闭ALC,然后把增益固定为某一值。不同环境下,增益都是固定不变的。
CI130X芯片单麦方案的固定增益设置方法,先关闭动态ALC,后在audio_in_manage_inner.c的audio_in_manage_inner_task()函数开始位置添加下面两行代码,设置固定增益并配置参数,参考如下图代码所示。
cm_set_codec_alc(HOST_MIC_RECORD_CODEC_ID,CM_CHA_LEFT,DISABLE);
cm_set_codec_adc_gain(HOST_MIC_RECORD_CODEC_ID,CM_CHA_LEFT,20); //关闭ALC后,设置左声道固定增益为20dB;增益参数定义范围 -18~28dB,增益建议调节范围:15~28dB;麦克风处噪声小向28方向调,麦克风处噪声大向15方向调。

CI130X芯片双麦方案的固定增益设置方法,一般情况下,需要左右MIC都要设置初始化增益,参考如下:
cm_set_codec_alc(HOST_MIC_RECORD_CODEC_ID,CM_CHA_LEFT,DISABLE); //关闭左声道ALC后,
cm_set_codec_adc_gain(HOST_MIC_RECORD_CODEC_ID,CM_CHA_LEFT,20); //设置左声道固定增益初始化为20dB;
cm_set_codec_alc(HOST_MIC_RECORD_CODEC_ID,CM_CHA_RIGHT,DISABLE); //关闭右声道ALC后,
cm_set_codec_adc_gain(HOST_MIC_RECORD_CODEC_ID,CM_CHA_RIGHT,20); //设置右声道固定增益初始化为20dB;
CI13LC芯片单麦方案的固定增益设置方法如下图九代码所示,先关闭动态ALC,后在main.c的task_init函数里的”audio_in_codec_registe();"后面添加下面两行代码,设置固定增益并配置参数,参考如下所示:
cm_set_codec_alc(HOST_MIC_RECORD_CODEC_ID, CM_CHA_LEFT, DISABLE);
cm_set_codec_adc_gain(HOST_MIC_RECORD_CODEC_ID, CM_CHA_LEFT, 15);//关闭ALC后,设置左声道固定增益为15dB;增益参数定义范围 -18~28dB,增益建议调节范围:15~28dB;MIC处噪声小向28方向调,MIC处噪声大向15方向调;目前80db~83db情
况,设置到15比较合适。

通过该算法的处理,我们可以看到采用固定增益后,声音信号幅值明降低了。

-
使用深度降噪算法(CI130X芯片)
一些产品在使用过程中会产生较大的噪音,比如油烟机以及电动窗帘和电动晾衣机工作时麦克风处结构噪音比较大,此类产品在开发过程中如果识别效果不好可采用深度降噪算法进行优化。
深度降噪算法抑制设备本身产生的高噪声,以提升低信噪比环境下的识别率,针对不同应用领域需使用对应的领域模型,当前只提供了烟机和窗帘的降噪模型。
1.CI130X_SDK_ALG_PRO_X.X.XX\projects\offline_asr_alg_pro_sample\project_file\makefile文件中,将CI_ALG_TYPE := $(USE_NULL)修改为CI_ALG_TYPE := $(USE_DENOISE_NN)
并且请把CI130X_SDK_ALG_PRO_X.X.XX\external\model\nn_denoise(深度降噪)中的[60003]nn_denoise_xx.bin深度降噪算法模型,复制到CI130X_SDK_ALG_PRO_X.X.XX\projects\offline_asr_alg_pro_sample\firmware\dnn文件夹中,请参考算法SDK2.4.18开发流程
请注意,深度降噪需使用CI130X芯片搭配该算法的前端算法模型使用,如下图所示,深度降噪在AI平台制作ASR与DNN模型请选择深度降噪专用模型。

2.4.2 个别命令词识别不好
1.在分词文件中对该命令词增加正性词
首先解释下分词文件,分词文件是从我司AI平台生成模型后下载的压缩包内名为G.fst的txt文件,分词文件的格式说明请参考链接通过分词文件生成模型的说明章节。
正性词为提高词集内目标词的识别效果而引入的词,通常与目标词的输出结果一样。
增加正性词的方法为添加与命令词发音接近的词语,比如下图所示的”光闭”为”关闭”的正性词,可以增强”关闭”的识别效果。”赵敏”为”照明”的正性词,可以增强”照明”的识别效果。

请注意不能无限制增加正性词,增加正性词后,命令词节点数也会增加,请确保程序运行后日志打印没有出现诸如”arcs xxxx too more”等警告信息,如有出现类似下图所示警告则必须删减词条以降低节点数。

2.检查命令词是否识别到了负性词导致识别不好
负性词,即为降低词集内目标词的识别效果而引入的词,当喊正常命令词识别为负性词时是不会输出识别结果的,所以为了确认识别成了哪一个负性词,我们在SDK中把中间结果打开,即在SDK中将int ctr_asr_detail_result(int p)函数的参数设为1即可,并开启log打印,喊命令词的时候观察识别结果,在分词中将最后识别到的负性词(如下图所示负性词后面是有#标识的)删掉,重新生成模型后再测试。

3.降低置信度
置信度,用于调整命令词的识别灵敏度,解决误识别等。在命令词信息表文件中进行调整,命令词信息表文件就是在SDK工程目录下的\projects\offline_asr_alg_pro_sample\firmware\user_file\cmd_info文件夹中以[60000]开头命令的表格文件。当识别不好时可以尝试降低置信度,可以每次降低5个置信度观察效果进行调整。
2.4.3 唤醒词识别不好
首先唤醒词的设计请参考我司的语音UI设计参考,唤醒词是不能够随便设计的,必须符合一定的规范。开发过程当中遇到唤醒词识别不好可以参考本文件中2.4.2的方法进行优化,如下图所示,有一个唤醒词叫做”小朋小朋”,因为客户口音以及其他问题,会导致难唤醒,此时可以将近似的一些说法以正性词的形式加到分词中导向小朋,兼容更多口音效果。

2.4.4 误唤醒
误唤醒,即语音唤醒过程中出现的,无音频流或者音频流中没有出现唤醒所需的特征或事件时,语音唤醒系统被唤醒的现象。处理误唤醒问题可以采用我司的误唤醒误识别测试工具进行测试和调优,请参考链接误识别误唤醒的工具使用说明误唤醒与置信度存在一定的关系,如果置信度设置过大,则会导致识别率下降,如果置信度设置过小,虽不影响识别率,但会增加集外误识别,降低识别体验。为兼顾识别和误识别,以下有几种确认置信度的方法,可有效地提高用户对语音识别的体验感。
A. 采用启英AI平台产生的默认值,开发者可以直接采用经过启英AI平台生成的置信度。因为一般在声学模型训练出来时,我们会通过大量的测试集测试统计后确定一个初步的置信度,在此置信度下,识别效果一般都能满足用户对语音识别的需求。需要注意的是不同的声学模型因训练词频的不同,在不同的声学模型下即使是相同的词条置信度也可能会不一样。 所以不同声学模型的置信度不能直接套用。
B. 若后续测试中仍然存在次数较多的误唤醒,开发者可以利用最大收益法调整置信度。首先,假设唤醒词置信度在初始值25的条件下,选取10个的声音(男:女=5:5),在安静和新闻噪音下进行识别率测试,并根据测试结果统计识别打分分布如下表所示。然后再选取12小时综艺节目音频进行误唤醒测试(麦克处分贝测量 65dB 左右环境),根据结果统计误唤醒打分分布。置信度为25时,安静识别/误唤醒置信度如下表,根据最大收益原则,结合识别和误唤醒的分布,对唤醒词的置信度可设置为27。
| 类别 | 置信度分布数据(按顺序) |
|---|---|
| 误唤醒置信度分布 | 23, 25, 25, 22, 22, 22, 24, 26, 24, 23, 30, 23, 24, 26, 22, 22 |
| 正确识别置信度分布 | 38, 39, 35, 37, 33, 39, 40, 36, 31, 29 |
C. 添加负性词也可有效降低误唤醒,我司的误唤醒误识别测试工具可以输出发生误唤醒时触发的音频文件,开发者可以通过人工辨别或者利用微信语音等工具转换成文字,并以负性词的形式添加到分词文件中,再重新生成模型。
2.4.5 命令词集内误识别
集内误识别即唤醒后属于命令词集内的词引发的误识别,存在以下几种情况
1.长词识别成短词
可增加短词的特殊词计数处理该问题,特殊词计数用于短的命令词截获具有相同内容的长命令词的情况。可在命令词信息表文件即工程目录下的\projects\offline_asr_alg_pro_sample\firmware\user_file\cmd_info中的[60000]表格中增加短词的特殊词计数。比如:”加热”和”加热三分钟”,可能说”加热三分钟”,也会得到”加热”的结果。解决方法是给”加热”命令词设置特殊词计数,在识别到”加热”后,再等待一会,看后续是否有相近命令结果,如果有就丢弃”加热”。也不能设置的太大,否则会明显增大”加热”的响应时间,一般来说长词中每个字需要4个特殊词计数,比如”加热三分钟”字数是5,则”加热”的特殊词计数设置为20,”加热三分钟”的特殊词计数则保持为0。
2.没有包含关系的命令词之间存在相互误识别
例如四档风容易误识别成十档风,可以在四档风以及相关泛化词的分词后面加一个Tab键隔开(分词格式需要),然后加上0.0的权重数,十档相关分词后面加上0.5的权重数。权重数最低0.0,最高2.0,数字越高权重越低,会降低相应识别灵敏度,十档的权重数初步确认为0.5,可以在平台上模型制作方式选择分词合成模型,重新上传制作模型后测试,观察效果后慢慢调整,调整最小步伐为0.1。

2.4.6 命令词集外误识别
集外误识别即唤醒后属于命令词集外的词引发的误识别。
语音产品实际使用过程中,唤醒过后在一段时间内由其他音源(例如电视声音,用户闲聊声音等)与命令词不相关的词语触发的识别,处理方法与处理误唤醒一样。可以采用我司的误唤醒误识别测试工具进行测试和调优。通常来说,语音产品都会要求规定一个比较合适的退出唤醒时间比如15秒,所以集外误识别的次数仅仅作为参考不纳入测试验收标准。
2.4.7 模型训练
语音识别优化还有最后一招:个别词在训练集中词频过少或缺乏也会导致识别不好,必要时可以提供100人以上的录音进行训练提升。