当前位置:首页 > 技术 > 正文内容

智能语音之远场关键词识别实践(二)

Lotus2022-12-19 10:19技术

上篇(智能语音之远场关键词识别实践(一))讲了“远场关键词识别”项目中后端上的实践。本篇将讲在前端上的一些实践以及将前端和后端连起来形成一个完整的方案。下图是其框图:(麦克风阵列为圆阵且有四个麦克风,即有四个语音通道)

从上图可以看出,前端主要包括去混响、声源定位和波速形成(beamforming)、单通道降噪四大功能模块。每个模块的作用在上篇中已简单描述过,这里就不讲了。每个模块由一个人负责,我负责做单声道降噪。对于每个功能模块来说,通常都会有多种不同的实现算法,不同的算法在性能和运算复杂度上有优劣,因此先要去评估,选择最适合我们项目的算法。评估主要从性能以及运算复杂度两方面去做。评估下来后去混响选择了WPE(Weighted prediction error,加权预测误差)算法,声源定位选择了GCC-PHAT(Generalized Cross Correlation-Phase Transform,广义互相关-相位变换)算法,波速形成选择了MVDR(Minimum Variance Distortionless Response,最小方差无失真响应)算法。单声道降噪不像其他模块只有几种主流的算法,去评估后选择一到两种就可以了。单声道降噪好多年前就研究了,有多种效果不错的算法,且不断有新的算法(比如基于深度学习的算法)提出来。它以前主要用在语音通话中,现在我们要把它用在远场麦克风阵列的语音识别中。我深入的调研了一番,没有文章公开说哪种算法在语音识别中效果较好,市面上主流的产品(比如小度音箱、天猫精灵等)也没说用了哪种单声道降噪算法,只能摸着石头过河了。先前有同事找到了一篇传统方法和深度学习相结合的单声道降噪的文章,大家讨论了一下,觉得有点符合潮流(深度学习),就决定先研究这个。经过一段时间的学习和实践,有了一些输出,也写了关于这个算法理论和实践的几篇文章,具体见《语音降噪论文“A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phoneme Classifier”的研读 》,《基于混合模型的语音降噪实践 》,《基于混合模型的语音降噪效果提升 》。这个算法的降噪效果还可以,但是里面有神经网络模型,且参数不少,要求一定的算力,在嵌入式上部署load有点吃紧。讨论后这种算法留作备份,再去研究有没有更适合的算法。考虑到基于深度学习的方法在嵌入式上都不太能部署,就在传统方法中寻找。调研后发现基于MCRA-OMLSA的降噪算法效果很好且运算复杂度不高,讨论后决定试试这种方法。依旧是先学习理论,然后用python实现和tuning看效果。实验做下来效果还是挺好的,就决定用这个算法了。关于MCRA-OMLSA的降噪算法,我也写了三篇文章。具体见《基于MCRA-OMLSA的语音降噪(一):原理 》,《基于MCRA-OMLSA的语音降噪(二):实现 》,《基于MCRA-OMLSA的语音降噪(三):实现(续) 》。

 

当前端的各个模块的算法都python实现完成后就开始把前端和后端串起来看效果,即把前端的输出作为后端的输入看识别率。不过模型是基于先前录的单声道的数据训练的。测试下来发现识别率比先前的降很多。出问题就要找原因和解决方法。大家先分头调查和思考,然后一起讨论。讨论后觉得原因很可能是这个:模型是基于先前单声道的语料训练的,而现在识别时的语音是多声道语音经过前端各算法处理后得到的单声道语音,两者不匹配。要想得到好的识别率,应该基于第二次录得的多声道的语料做完前端各算法处理后得到的单声道的语料来重新训练模型。简而言之,就是要让模型学习一下前端中的各个算法处理。于是基于第二次录得的多声道的语料重新训练模型。先把多声道数据经过前端各算法处理得到单声道数据,再做各种augmentation来增强语料库,最后拿这些处理后的数据去训练得到新的模型。新的模型用上后识别率有了很大的提升。经过实践,我们的经验是要想有好的识别率,模型一定要把pipeline中的各种算法都学习到。

 

在python下有了一个好的识别率,接下来就要看怎么在嵌入式上部署了,即用C语言来做实现。后端的C语言实现已经做好,要做的就是前端各算法的C语言实现。先前负责前端各算法的同学负责实现同样的算法,先用浮点实现。一段时间后各个算法的浮点实现都做好了,再与后端串起来看识别率,结果与python下的基本一致。后面要做的是算法的定点实现。由于team有了更高优先级的任务,只得暂停这方面的工作。只差最后一步就能真正部署了,有点可惜。后面有时间再把它完成吧。

 

远场关键词识别的项目由于参与人少做了近两年。正是因为人少,每个人做的东西就多一些,也就学到的东西多一些。就我自己而言,不仅学到了后端深度学习相关的(模型训练、量化等),也学到了前端信号处理算法相关的,同时通过实践还累积了不少关键词识别相关的经验。

 

原文链接

扫描二维码推送至手机访问。

版权声明:本文来源于网络,仅供学习,如侵权请联系站长删除。

本文链接:https://news.layui.org.cn/post/1173.html

分享给朋友:

“智能语音之远场关键词识别实践(二)” 的相关文章

Seal-Report: 开放式数据库报表工具

Seal Report是.Net的一个基于Apache 2.0 开源工具,完全用C# 语言编写,最新的6.6 版本采用.NET 6,github: https://github.com/ariacom/Seal-Report。Seal Report提供了一个完整的框架,用于从任何数据库或任何非SQL源生成每日报告。该产品的重点是易于安装和报表设计:一旦安装,报表可以在一分钟内构建和发布。 主要特性...

ETL工具Datax、sqoop、kettle 的区别

一、Sqoop主要特点: 1.可以将关系型数据库中的数据导入到hdfs,hive,hbase等hadoop组件中,也可以将hadoop组件中的数据导入到关系型数据库中; 2.sqoop在导入导出数据时,充分采用了map-reduce计算框架(默认map数为4),根据输入条件生成一个map-reduce作业(只有map,没有reduce),在hadoop集群中运行。采用map-reduce框架同时在...

用深度强化学习玩FlappyBird

摘要:学习玩游戏一直是当今AI研究的热门话题之一。使用博弈论/搜索算法来解决这些问题需要特别地进行周密的特性定义,使得其扩展性不强。使用深度学习算法训练的卷积神经网络模型(CNN)自提出以来在图像处理领域的多个大规模识别任务上取得了令人瞩目的成绩。本文是要开发一个一般的框架来学习特定游戏的特性并解决这个问题,其应用的项目是受欢迎的手机游戏Flappy Bird,控制游戏中的小鸟穿过一堆障碍物。本文...

Codeforces Round #822 (Div. 2) A-F

比赛链接 A 题解 知识点:贪心。 注意到任意三根木棍的相等最优解是最长减最小,因此从小到大排序,三个三个取,取最小值。 时间复杂度 \(O(n\log n)\) 空间复杂度 \(O(n)\) 代码 #include <bits/stdc++.h> #define ll long long using namespace std; ll a[307]; bool solve() {...

JavaScript之无题之让人烦躁的模块化

  我怎么记得我好像写过相关类型的文章,但是我找遍了我的博客没有~那就再写一遍吧,其实模块化的核心内容也算不上是复杂,只不过需要整理一下,规划一下罢了。嘻嘻。   开始写标题的时候我就在纠结一件事情,就是,先吃喜欢吃的,还是后吃喜欢吃的,翻译过来就是我应该先写CommonJS和ES6 Module,还是先写CMD和AMD。嗯,我决定了,谁先做好了我就先吃谁。   其实模块化的缘由很简单,就一句话,...

重新理解微服务之终究绕不过这4个坎?(观点探讨)

系列文章 .Net微服务实战之技术选型篇 .Net微服务实战之技术架构分层篇 .Net微服务实战之DevOps篇 .Net微服务实战之负载均衡(上) .Net微服务实战之CI/CD .Net微服务实战之Kubernetes的搭建与使用 .Net微服务实战之负载均衡(下) .Net微服务实战之必须得面对的分布式问题 .Net微服务实战之可观测性 重新理解微服务之它还那么纯粹吗? 前言  ...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。