智能语音之远场关键词识别实践(一)
off999 2024-12-10 19:12 14 浏览 0 评论
语音识别主要分两大类:大词汇量连续语音识别技术(Large Vocabulary Continuous Speech Recognition,LVCSR)和关键词识别(keyword Spotting,KWS)。LVCSR由于对算力要求较高,一般在云端(服务器侧)做,而KWS对算力的要求相对较小,可以在终端上做。我们公司是芯片设计公司,主要设计终端上的芯片,想要在语音识别上做点事情,最可能的是做KWS,于是我们就选择KWS来实践语音识别。按距离远近,语音识别可分为近场识别和远场识别,远场的应用场景更丰富些,如智能音箱、智能家居等,如是远场的话需要用到麦克风阵列。讨论下来我们决定做远场下的关键词识别。图1是其框图:(麦克风阵列为圆阵且有四个麦克风,即有四个语音通道)
图 1
从上图可以看出,系统可以分为前端和后端两部分。前端主要包括去混响、声源定位和波速形成(beamforming)、单通道降噪四大模块。混响是指声音信号遇到墙壁、天花板、地面等障碍物形成反射声,并和直达声相叠加的现象。去混响就是去除那些叠加的声音。声源定位是利用多通道语音信号来计算目标说话人的角度和距离从而实现对目标说话人的跟踪,严格的声源定位是指同时确定说话人的角度(包括方位角、俯仰角)和距离。在消费级的麦克风阵列中,通常关心的是声源到达的方向,也就是波达方向(Direction of Arrival,DOA)。波束形成是对信号进行空域滤波,将多个通道的语音数据变成一个波束(即一个通道)的目标声源,目标声源的信干噪比(SINR)得到提升。单通道降噪是抑制单个通道上的噪声。后端主要包括特征提取和神经网络模型推理两大模块,特征提取是得到作为神经网络模型输入的语音的特征向量,神经网络模型推理是根据输入的特征向量计算出一个输出。不管是前端还是后端,对我们都是陌生的,讨论下来由于我们team人数较少就先从后端入手,有一个识别率较高的模型后再去做前端相关的。本篇先讲在后端上的一些实践,下篇讲在前端上的一些实践以及将前端和后端连起来形成一个完整的方案。
后端主要是语音识别相关的。语音识别分为训练和识别两个阶段。在训练阶段,用海量的相关的语料训练出一个识别率较高的神经网络模型。在识别阶段,采集到的语音经过前端处理后提取出特征向量再经过神经网络模型推理得到相应的输出。后端的主要工作如下:训练语料获取、语料数据增强、模型训练、模型量化、模型推理实现等。
1, 训练语料获取
训练语料一般有三种办法获得。一是用公开的语料库,中文比较出名的语料库有thchs30等,但这些公开的一般适用于LVCSR,不太适用于KWS,因为KWS是一些特定词。二是花钱买,三是自己录。花钱买的语料库一般较贵,当前我们处于起步阶段,所以我们决定自己录语料。自己录要先选定应用场景和关键词,讨论后我们选定了智能家居场景,关键词包括“打开空调”、“关闭空调”、“打开窗帘”、“拉上窗帘”等。定好关键词后就开始录音了,我们先后录过两次音。第一次录音是在做后端神经网络模型时,录的是单声道数据。找来5台安卓手机,装上录音软件easyrecord,放在一个安静的会议室里,距离说话人50CM左右处,示意如图2:
图 2
说话人先以正常语速说一遍关键词,然后以较快语速说一遍,最后以较慢语速说一遍。当时请了部门里几乎所有同学近100人参与录音,得到了一个我们自己定义的单声道关键词的语料库。由于人数较少,是一个小语料库。第二次录音是在做前端麦克风阵列中去混响、波束形成等算法时,录的是多声道数据。买来一块多声道采集的评估板放在一个大会议室里,同时评估板边上放风扇、菜场等噪声,说话人在相对远处不同的位置上说关键词,示意如图3:
图 3
依旧是先以正常语速说一遍关键词,然后以较快语速说一遍,最后以较慢语速说一遍。这是一个带不同种类噪声的关键词多声道语料库。
2,对语料做数据增强
刚开始我们采集到语料后就开始训练模型了。由于录到的语料都是干净语音,模型训练好后干净语音识别率还可以,但是带噪语音就不行了。遇到问题就要找解决方法。调查后发现通常的做法是对语料做数据增强(augmentation)。所谓数据增强就是用一些音频处理的算法(比如加噪声)对已有的训练集里的语音(通常训练集里的语音是在安静的环境下录制的,比如录音棚里)进行一定的处理,让其变得更接近真实场景中的语音,来增加训练样本的多样性。基于神经网络的深度学习技术,通常都需要使用大量的数据来训练,语音识别也不例外。对一个语音识别系统而言,决定其识别准确率的关键因素,大致可以分为两个方面:一是模型本身的好坏;二是训练所使用的训练数据。对于训练数据而言,其与真实使用场景中的数据的匹配度越高,则语音识别的性能越好。实际应用中,语音识别的使用场景很复杂,环境噪声、人的说话方式,如音量、语速等,都会一定程度上影响语音识别系统的准确率。训练数据对这些复杂的情况覆盖得越全面,则语音识别系统的效果越好。为了构建一个强大的语音识别系统,应该广泛地搜集各种复杂的真实场景下的语音数据,来构建训练集。然而在现实条件下,想要做到这一点却很不容易,尤其对于中小厂商。因为不是每个厂商都有获取真实场景语音数据的渠道和能力,即使成功获得了真实场景的语音数据,数据标注也是一项极为费时费力费钱的工作。在训练集数据有限的情况下,可以通过数据增强的方法来扩充训练集数据,使训练集数据更多样性,来提高语音识别的准确率。我们用python开源库(nlpaug.augmenter.audio)做了数据增强,用的数据增强方法主要有如下几种:
1)Loudness:调整音频的音量(增大或减小)
2)Speed:调整音频的播放速度(加速或减速)
3)Pitch:调整音频的音高
4)Noise:加入噪声,主要有白噪声、粉红噪声、环境噪声等。
做好数据增强后语料库就增大了好多倍。用增大后的语料库去训练得到新的模型,再用带噪语音去测试模型识别率提高了好多。
3,模型训练
模型训练是个大话题,这里就简述了,主要分几块:语料库的数据预处理、模型选择和迭代训练及评估。这些都在python下实践。找一个开源的语音识别开源框架,并根据自己的需求改造。我们是在框架中基于keras来训练模型的。
1) 数据预处理
数据预处理主要包括语音的特征(feature)选取和提取以及标签(label)处理。语音识别里常用的特征是MFCC和Fbank。我们刚开始用的特征是MFCC,后来随着用的深入,发现Fbank的效果比MFCC好,就改成用Fbank了。特征提取就是把wav中的每帧PCM数据变成特征向量,作为神经网络模型的输入。标签(label)就是标注wav文件对应的内容。语音识别神经网络模型通常都是分类模型,且有不同的分类方法。可以以音素分类,分出来的音素类型有几十或者上百个,标注时就是以音素为标签(label),代码中每个音素都有一个数字ID。如果用作唤醒词识别(唤醒词识别是关键词识别的一个特例,只有一个关键词),就是一个典型的二分类问题,是唤醒词的标注为1,不是的标注为0。把这些label作为target也作为模型的输入。训练前要把语料分成训练集/验证集/测试集,通常比例是8:1:1。训练集和验证集用于训练,测试集用于评估。
2)模型训练和评估
模型训练的第一步是选择网络架构。对于语音识别,目前主流的网络架构有卷积神经网络(CNN)和循环神经网络(RNN/LSTM)等。我们根据项目的需求选择CNN作为网络架构(主要是因为CNN相对简单且有很多KWS论文里的网络模型可以参考)。网络架构确定后训练模型时最好先找一个相关论文里的成熟模型来借鉴,然后对其进行改进,最终通过训练确定CNN层数、每层的Kernel个数、Kernel Size、Stride等。训练过程就是用训练集的数据作为输入,经过网络前向传播计算出输出,再同事先设定的标签(label)进行loss计算(根据设定的损失函数计算),然后通过反向传播来更新权重后,再迭代进行前向传播、loss计算和反向传播更新权重,直至loss值达到预期效果的过程。根据应用场景我们先后训练出两个网络模型,多关键词网络模型和单关键词(即唤醒词)网络模型。多关键词网络模型是音素分类模型,以CTC为损失函数,网络模型输出是每个音素的概率值,概率最大的那个音素作为输出,后接CTC解码,得到结果。唤醒词网络模型是二分类模型,以交叉熵为损失函数,网络模型输出是唤醒词和非唤醒词的概率值,再设定一个是唤醒词概率的阈值,如果输出的唤醒词概率大于阈值,就认为是唤醒词了,反之不是。
模型训练好后要对其进行评估,看是否满足要求。KWS模型一般都是分类模型,对于分类模型,曾写过文章介绍过评价指标,具体见《深度学习分类问题中accuracy等评价指标的理解》。只有这些评价指标都符合要求了,模型训练工作才算结束。否则要分析不达标的原因,找解决方法,再重新训练,直到所有指标都达标。模型训练就是一个不断重复迭代的过程。
4,模型量化
训练好的模型中的参数都是浮点数,在识别过程中模型推理(inference)时为了降低CPU load和节省memory,需要对模型做量化处理。至于具体怎么做,请参见曾写过的文章《深度学习中神经网络模型的量化》。
5,模型推理实现
KWS模型训练是在python下完成的,但识别推理是在嵌入式系统上完成,因此要用其他语言把模型推理实现了。嵌入式系统上最常用的语言是C,我们就用C实现了模型推理。实现过程中参考了CMSIS的代码。为了节省memory,我们对实现过程做了优化,具体见曾写过的文章《嵌入式设备上卷积神经网络推理时memory的优化》。
以上就是后端的主要工作。写起来简单,其实都是需要花不少时间的,尤其在模型训练上。如果是第一次做,则需要花更多的时间,有一个摸索的过程。
相关推荐
-
- 电脑怎么下载word官方免费版
-
可以从官网或者360软件管家下载,还有激活使用。MicrosoftWord是微软公司的一个文字处理器应用程序。它最初是由RichardBrodie为了运行DOS的IBM计算机而在1983年编写的。随后的版本可运行于AppleMacin...
-
2025-11-07 21:51 off999
- 电脑网络已连接但无法访问互联网
-
因为网络配置有问题造成的,解决的方法也很简单,可以直接进入win7系统的“控制面板”—“网络”中,然后将除开拨号适配器以外的全部选项全部删除掉,然后重新启动计算机后再添加microsoft的“TCP/...
- win7隐藏文件怎么显示(win7中显示隐藏文件)
-
要在Win7中显示隐藏文件,需依次打开“我的电脑”或“计算机”→点击“工具”→选择“文件夹选项”→在弹出的“文件夹选项”窗口中点击“查看”标签→在“隐藏文件和文件夹”选项中选择“显示隐藏的文件、文件夹...
-
- 邮箱163注册怎么注册(邮箱163如何注册)
-
1.打开浏览器,搜索163邮箱,进入登录页面,点击去注册2.进入163邮箱注册页面后,输入想要的邮箱地址,输入密码,手机号,点击立即注册选项,就可以申请注册163邮箱了。操作方法01登陆163邮箱的官方网站,点击“注册”02可通过手机...
-
2025-11-07 20:03 off999
- 音频设备有哪些(音频设备有哪些类型)
-
用录音机,MP3,手机之类的,通常需采用话筒,麦克风等设备,现在自然声音的收集方式主要是用麦克风等声音采集设备捕捉声波,将声波的振动转化为模拟信号,然后用磁带将模拟信号记录下来,或者用电脑将模拟信号记...
- 华硕笔记本电脑不显示wifi列表
-
您好!可以在启动项处,右键,属性,选择自定义通知图标,查看声音和电池图标,选择显示或总是显示。确定。然后重启机器尝试。如果还是没有反应,则可能是相关的文件出现错误。比如使用了驱动软件更新系统的补丁或驱...
- 电脑自动关机怎么解除(电脑自动关机解除方法)
-
要取消电脑关机后的还原,首先尝试迅速按下键盘上的Ctrl+Alt+Delete组合键,然后选择任务管理器以打开它。在任务管理器中,点击"文件"菜单,选择"新任务"选项。...
- 苹果笔记本电脑重装系统教程
-
苹果笔记本电脑系统可以通过以下步骤进行重装:1.备份数据:在开始重装前,需要备份你的重要数据。你可以将数据存储到外部硬盘、云存储或其他可靠的设备中。2.下载安装器:从AppStore中下载macOS...
- win7和win8系统哪个好用些(win7和win8.1哪个好用)
-
iqoo7用的是OriginOS系统。OriginOS系统给人的感觉还是相当耳目一新的。除了基本的设置、应用商店、i主题、闹钟、天气这些外,还多出了控制台、交互池、变形器、镜头包等。一加八出厂预装的...
- 电脑摄像头万能驱动(电脑摄像头驱动程序)
-
清理一下垃圾,点一下设置设置一下就可以了
- qq下载官方下载(qq下载官网2020安卓版)
-
建议关闭杀毒软件,但是也不要轻易下载QQ群文件、陌生QQ邮件的附件以及陌生人发送的文件,很可能是病毒,如果提示有病毒,千万不要下载,避免电脑中毒。如果真的需要下载就暂时关闭杀毒软件。最终还是希望通过正...
-
- 台式电脑主机开不了机是什么原因
-
重新接下VGA线,电源线,重新接插下,打开显示器开关。不行的话拨下显卡,清灰并检查显卡元件外观,电容鼓起的话,则显卡烧坏,换同型号电容即可。同样的内存也插拔下,擦拭下触点的位置换件检查,把主机输出接在电视上,检查,内存调换,显卡临时替换...
-
2025-11-07 15:51 off999
- tp路由器无线桥接怎么设置(tp路由器如何桥接设置)
-
1、路由器接通电源,打开路由器并链接。2、弹出的界面中,设置管理员密码后跳过引导。3、在应用管理”中找到无线桥接”选项。4、点击开始设置”,找到要连接的无线网络,输入密码后点击下一步”。5、输入无线密...
- 笔记本电脑处理器怎么选(笔记本电脑处理器怎么选2020)
-
从科普与测试中可以看出笔记本CPU的各方面性能差异还是比较大的,可以总结为,在购买笔记本电脑时应优先选择最新一代中的更高端型号CPU,需求性能较高的用户可以选够标压且核心更多的CPU,需求高续航和低功...
- 格式化后文件还能恢复吗(格式化后文件怎么恢复)
-
可以恢复的,但是如果文件被覆盖了就不能恢复了。磁盘格式化后,建立了新的文件系统格式,原来硬盘上的数据会被抹去,不过数据不是真正的被清除,在新的数据存入之前即文件被覆盖之前是可以恢复的。现在很多软件都支...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
