前面的文章(语音降噪论文“A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phoneme Classifier”的研读 )梳理了论文的思想。本篇就开始对其实践,主要分以下几步:1,基于一个语料库算出每个音素的单高斯模型;2,训练一个输出是一帧是每个音素概率的NN分类判别模型;3,算法实现及调优。

1,得到每个音素的单高斯模型

要想得到每个音素的单高斯模型,首先得做好音素对齐,知道某一帧对应哪个音素。论文里用的是英文的TIMIT语料库,已经做好了音素对齐,知道了哪个时间段是哪个音素。现在做的是中文的语音降噪,最好能有一个像TIMIT一样已经做好音素对齐的语料库。网上搜了 一下,没有已做好音素对齐的中文语料库,只能自己做音素对齐了。做语音识别时用过清华的Thchs30语料库,且它在中文语音识别领域里知名度较高,于是就决定基于Thchs30做每个音素的单高斯模型。自己来做音素对齐,肯定花不少时间,最好是有开源工具帮忙来做。幸运的是找到了支持中文音素对齐的工具speech-aligner(https://github.com/open-speech/speech-aligner),它是基于kaidi的,我用过一段时间kaldi,自然对它用起来也比较顺手。speech-aligner里音素较多,主要是因为音素带音调了(包括轻声共5个音调,分别是0/1/2/3/4,0表示轻声)。Phoneme.txt里是音素和id的映射,wav.scp放wav文件名对应的音频位置,text里放wav文件对应的中文和带调拼音,自己弄时依葫芦画瓢就可以了。比较好的是Thchs30语料库里已有了每个wav文件对应的中文和带调拼音(trn文件里),我只需要写python脚本把它们集中起来使用,这让我省了不少时间,尤其是在拼音标注上。用speech-aligner做好音素对齐后得到的是out.ali文件,里面指出了哪个时间段是什么音素,示意如下图:

从上图可以看出,0~25ms是音素y,25~460ms是音素e_3。

接下来就是基于out.ali得到每帧是哪个音素。这里的帧跟语音识别里的帧一样,帧长25ms和帧移10ms。依旧用python脚本处理后得到csv文件,每行代表一个wav文件的信息,开头是文件名,后面就是每帧对应的音素id,示意如下图:

有了每帧跟音素的映射后就开始算每个音素的单音素高斯模型了。统计出语料库中每个音素共有多少帧,每帧求出对数幅度谱。由于帧长是25ms,16k HZ采样下是400个点,所以STFT用512个点的,即有512个频段。时域数据转换到频域后是复数形式,除了0和N/2维外其他值是对称的,所以只要(N/2 + 1)表示频域数据就可以了。当N=512时,N/2 + 1是257,从而对数幅度谱的数据是257维的。对每维分别算均值和方差,这样每个音素的单高斯模型就有了,它是257维的,每维有均值和方差。

2,分类判别NN模型训练

原理篇中说过这是个典型的分类问题,需要训练一个分类模型 。在做KWS(keyword spotting,关键词识别)时我们就训练过分类模型,这里可以拿来用,不过要做一些修改,比如分类label的处理上。我把语料库按8:1:1分成训练集/验证集/测试集,网络用的是CNN(卷积神经网络)。论文是几年前的啦,当时神经网络刚流行,更多用的是DNN全连接网络。训练时发现模型不能收敛,在测试集下准确率跟论文里的差不多。我认真想了下,不能收敛也是合理的,毕竟音素对齐时就不是很准确,尤其是两个音素的临界处。论文里用9帧(当前帧+前后各4帧)作为网络的输入。我试过单帧(当前帧)输入 / 3帧(当前帧+前后各1帧)输入 /5帧(当前帧+前后各2帧)输入 / 7帧(当前帧+前后各3帧)输入 / 9帧(当前帧+前后各4帧)输入,准确率都差不多,考虑到更多帧的输入导致模型参数更多,我最后选了单帧输入。既然准确率跟论文里差不多,我也就没再深究。这样基于NN的分类判别模型就训练好了。

3,算法实现和调优

上面的两个模型做好后就开始做算法实现了。依旧在python下实现,因为python里有好多现成的库,实现起来更快,要把更多的时间放在降噪效果调优上。算法实现依据原理篇中给出的步骤一帧一帧的做。先根据前25帧(约250ms)算出噪声单高斯模型的均值和方差的初始值用于后面迭代。在每一帧里,先根据NN模型求出这帧对应每个音素的后验概率,然后算对数谱,根据数学表达式算出降噪后的每一维的对数谱,再做反变换得到时域的PCM值。最后再更新噪声的单高斯模型的均值和方差,用于下一帧的计算。算法实现还是挺快的,有两个值α和β需要tuning。先简单调了下这两个参数,能起到部分降噪效果,接下来就是调优了。

经过好多次的尝试,得到了一个相对不错的α和β值,在各种不同的SNR下MOS分平均能提高0.3左右,与论文里说的差不多(由于语言/语料库/网络模型等不一样,结果与论文里的也不可能完全一样)。我也将其与webRTC里的ANS(用的是我手头上的一个C语言的版本,且有3个不同的level,分别是弱/一般/激进 )的降噪效果做了比较,具体MOS分如下表:

训练分类模型时都是干净语音,降噪时都是拿带噪语音去算每帧是每个音素的后验概率,准确率相对干净语音会低一些,进而会影响到降噪效果。如果拿降噪后的语音去再次算后验概率,准确率会高些,降噪效果也会好些。于是对于一段降噪的语音,我把算法做了几次迭代,即拿前一次降噪后的语音经过NN算后验概率,再次降噪,直到最后一次的降噪结果作为输出。实践下来第一次迭代后MOS分有近0.1的提升,后面的迭代效果就不明显了。迭代能提升一点MOS分,但是会带来运算量(即CPU load)的增加,真正用时做一次算法迭代就可以了。

基于混合模型的语音降噪实践相关推荐

  1. 基于rnn的语音降噪matlab,基于RNN的音频降噪算法 (附完整C代码)

    前几天无意间看到一个项目rnnoise. 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可惜的是作者没有提供数据训练集. 不过基本可以断定他采用的数据集里,肯定有ur ...

  2. 打破传统降噪技术 看网易云信在语音降噪的实践应用

    导读:随着音视频会议.娱乐互动直播.在线教育产品的火热发展,产品中令人愉悦的音效音质体验是必不可少的. 文|飒飒 网易云信音视频算法工程师 但在音视频实时通信中,难免会遇到各种我们不希望出现的声音,例 ...

  3. 传统语音增强——基于先验信噪比的维纳滤波语音降噪算法

    一.基于先验信噪比的维纳滤波语音降噪算法的基本概念 改进的维纳滤波器为基于先验信噪比的维纳滤波器,其原理框图下图所示. 对于第m帧带噪语音信号ym(n)=sm(n)+nm(n) 式中,sm(n)是第m ...

  4. 【语音去噪】基于matlab小波硬阈值语音降噪【含Matlab源码 532期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[语音去噪]基于matlab小波硬阈值语音降噪[含Matlab源码 532期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  5. 传统语音增强——基于小波分解的语音降噪算法

    一.小波分析的意义 在传统的傅里叶分析中,信号完全是在频域展开的,不包含任何时频的信息.因为丢弃的时域信息对某些应用同样重要,所以出现很多能表征时域和频域信息的信号分析方法,如短时傅里叶变换.Gabo ...

  6. 语音降噪论文“A Hybrid Approach for Speech Enhancement ...“的研读

    最近认真的研读了一篇关于语音降噪的论文(A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phon ...

  7. webRTC中语音降噪模块ANS细节详解(一)

    ANS(adaptive noise suppression) 是webRTC中音频相关的核心模块之一,为众多公司所使用.从2015年开始,我在几个产品中使用了webRTC的3A(AEC/ANS/AG ...

  8. [投稿]谱减法语音降噪原理

    本文是音频处理的朋友icoolmedia(QQ:314138065)的投稿.各位做视音频技术朋友如果好的原创技术文章并希望通过我的博客分享给大家,也欢迎投稿到我的邮箱:leixiaohua1020@1 ...

  9. 基于神经网络的语音频带扩展

    本博客转载自顾宇的<基于神经网络的语音频带扩展方法研究>,大家可从知网获取. 摘要 语音频带扩展旨在从频带受限的窄带语音信号中恢复宽带语音信号.由于受到语音采集设备以及信道条件的限制,传输 ...

最新文章

  1. MVC中的验证和异常处理以及手工激活验证
  2. lucene索引文件格式
  3. Hadoop中任务提交运行流程
  4. java位于算——一个测试搞懂位运算
  5. 带线的无限级下拉树列表-完整示例篇
  6. Java语言的基础知识11
  7. oid 值 内存使用_如何使用Choerodon LDAP以及配置定时任务
  8. 自动部署 管道 ci cd_自动化测试在CI CD管道中的作用
  9. 接口一个被我忽略的地方--接口重定向技术
  10. 程序员管理思维修炼,只需要反复阅读本篇
  11. 2021牛客暑期多校训练营9,签到题HE
  12. mysql创建定时任务 脚本_linux中定时执行mysql脚本
  13. DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第1篇API展示及使用部分)
  14. android 多媒体封装格式详解---MKV
  15. 一些个人常用的网站网址
  16. AI vs ML:有什么区别?
  17. 深剖基类和派生类的虚函数表
  18. python抽取某个时间段的数据_python 批量提取excel 指定时间段的数据
  19. 阿里云国际版账户登录不上,有什么办法解决吗?
  20. python turtle什么意思_Python turtle(介绍一)

热门文章

  1. sql中1=1,1=0 ,1 大于 1,1 小于 1代表什么
  2. “人各有志,给分六十”
  3. 快速云:云计算技术在计算机数据处理中的应用
  4. GCP 搭建 tg代理 MTG
  5. UE4 皮革材质从简单到复杂
  6. Jupyter制作slides(幻灯片)
  7. 如何利用CRM来维护客户关系?
  8. SiamFC代码配置复现 matlab版本
  9. 车站椅子上密密麻麻的孔,是为了方便放屁吗?
  10. 网络原理IP协议/以太网