语音识别初识(记录自己的学习过程)

(目的:方便自己下次看,有点流水账)
简介:
   信号处理与特征提取
   传统声学模型
   基于深度学习的声学模型
   端到端的语音识别系统简介
业界现状
开源项目

简介:

   语音识别技术所涉及的领域包括:信号处理、模式识别、概率论和信息论、发声机理和听觉机理、人工智能等等。
  语音识别的输入实际上就是一段随时间播放的信号序列(语音片段),而输出则是一段文本序列。完整的语音识别系统通常包括信号处理和特征提取、声学模型、语言模型和解码搜索四个模块。

image.png

  信号处理和特征提取可以视作音频数据的预处理部分,一般来说,一段高保真、无噪声的语言是非常难得的,实际研究中用到的语音片段或多或少都有噪声存在,所以在正式进入声学模型之前,我们需要通过消除噪声和信道增强等预处理技术,将信号从时域转化到频域,然后为之后的声学模型提取有效的特征向量。接下来声学模型会将预处理部分得到的特征向量转化为声学模型得分,与此同时,语言模型,也就是我们前面在自然语言处理中谈到的类似 n-gram 和 RNN 等模型,会得到一个语言模型得分,最后解码搜索阶段会针对声学模型得分和语言模型得分进行综合,将得分最高的词序列作为最后的识别结构。这便是语音识别的一般原理。
  因为语音识别相较于一般的自然语言处理任务特殊之处就在于声学模型,所以语言识别的****关键****也就是信号处理预处理技术和声学模型部分。在深度学习兴起应用到语言识别领域之前,声学模型已经有了非常成熟的模型体系,并且也有了被成功应用到实际系统中的案例。比如说经典的高斯混合模型(GMM)和隐马尔可夫模型(HMM)等。神经网络和深度学习兴起以后,循环神经网络、LSTM、编码-解码框架、注意力机制等基于深度学习的声学模型将此前各项基于传统声学模型的识别案例错误率降低了一个 level,所以基于深度学习的语音识别技术也正在逐渐成为语音识别领域的核心技术。
  语音识别发展到如今,无论是基于传统声学模型的语音识别系统还是基于深度学习的识别系统,语音识别的各个模块都是分开优化的。但是语音识别本质上是一个序列识别问题,如果模型中的所有组件都能够联合优化,很可能会获取更好的识别准确度,因而端到端的自动语音识别是未来语音识别的一个最重要的发展方向
  所以,这一讲主要内容的介绍顺序就是先给大家介绍声波信号处理和特征提取等预处理技术,然后介绍 GMM 和 HMM 等传统的声学模型,其中重点解释语音识别的技术原理,之后后对基于深度学习的声学模型进行一个技术概览,对当前深度学习在语音识别领域的主要技术进行简单了解,最后对未来语音识别的发展方向——端到端的语音识别系统进行了解。

信号处理与特征提取

  因为声波是一种信号,具体我们可以将其称为音频信号。原始的音频信号通常由于人类发声器官或者语音采集设备所带来的静音片段、混叠、噪声、高次谐波失真等因素,一定程度上会对语音信号质量产生影响。所以在正式使用声学模型进行语音识别之前,我们必须对音频信号进行预处理和特征提取。
  最初始的预处理工作就是静音切除,也叫语音激活检测(Voice Activity Detection, VAD) 或者语音边界检测。目的是从音频信号流里识别和消除长时间的静音片段,在截取出来的有效片段上进行后续处理会很大程度上降低静音片段带来的干扰。除此之外,还有许多其他的音频预处理技术,可以找来信号处理相关的资料进行阅读。
  然后就是特征提取工作。音频信号中通常包含着非常丰富的特征参数,不同的特征向量表征着不同的声学意义,从音频信号中选择有效的音频表征的过程就是语音特征提取。常用的语音特征包括线性预测倒谱系数(LPCC)和梅尔频率倒谱系数(MFCC),其中 LPCC 特征是根据声管模型建立的特征参数,是对声道响应的特征表征。而 MFCC 特征是基于人的听觉特征提取出来的特征参数,是对人耳听觉的特征表征。所以,在对音频信号进行特征提取时通常使用 MFCC 特征。
  MFCC 主要由预加重、分帧、加窗、快速傅里叶变换(FFT)、梅尔滤波器组、离散余弦变换几部分组成,其中FFT与梅尔滤波器组是 MFCC 最重要的部分。一个完整的 MFCC 算法包括如下几个步骤:
· 快速傅里叶变换(FFT);
· 梅尔频率尺度转换;
· 配置三角形滤波器组并计算每一个三角形滤波器对信号幅度谱滤波后的输出;
· 对所有滤波器输出作对数运算,再进一步做离散余弦变换(DTC),即可得到MFCC。
  实际的语音研究工作中,也不需要我们再从头构造一个 MFCC 特征提取方法,Python 为我们提供了 pyaudio 和 librosa 等语音处理工作库,可以直接调用 MFCC 算法的相关模块快速实现音频预处理工作。
  过去在语音识别上所取得成果证明 MFCC 是一种行之有效的特征提取方法。但随着深度学习的发展,受限的玻尔兹曼机(RBM)、卷积神经网络(CNN)、CNN-LSTM-DNN(CLDNN)等深度神经网络模型作为一个直接学习滤波器代替梅尔滤波器组被用于自动学习的语音特征提取中,并取得良好的效果。
[TOC]

传统声学模型

  在经过语音特征提取之后,我们就可以将这些音频特征进行进一步的处理,处理的目的是找到语音来自于某个声学符号(音素)的概率。这种通过音频特征找概率的模型就称之为声学模型。在深度学习兴起之前,混合高斯模型(GMM)和隐马尔可夫模型(HMM)一直作为非常有效的声学模型而被广泛使用,当然即使是在深度学习高速发展的今天,这些传统的声学模型在语音识别领域仍然有着一席之地。所以,作为传统声学模型的代表,我们就简单介绍下 GMM 和 HMM 模型。
  所谓高斯混合模型(Gaussian mixture model,GMM),就是用混合的高斯随机变量的分布来拟合训练数据(音频特征)时形成的模型。原始的音频数据经过短时傅里叶变换或者取倒谱后会变成特征序列,在忽略时序信息的条件下,这种序列非常适用于使用 GMM 进行建模。
  在实际的 GMM 训练中,通常采用 EM 算法来进行迭代优化,以求取GMM中的加权系数及各个高斯函数的均值与方差等参数。
  GMM 作为一种基于傅里叶频谱语音特征的统计模型,在传统语音识别系统的声学模型中发挥了重要的作用。其劣势在于不能考虑语音顺序信息,高斯混合分布也难以拟合非线性或近似非线性的数据特征。所以,当状态这个概念引入到声学模型的时候,就有了一种新的声学模型——隐马尔可夫模型(Hidden Markov model,HMM)。
  在随机过程领域,马尔可夫过程和马尔可夫链向来有着一席之地。当一个马尔可夫过程含有隐含未知参数时,这样的模型就称之为隐马尔可夫模型。HMM 的核心概念是状态,状态本身作为一个离散随机变量,马尔可夫链的每一个状态上都增加了不确定性或者统计分布使得 HMM 成为了一种双随机过程。
  HMM 的主要内容包括参数特征、仿真方法、参数的极大似然估计、EM估计算法以及维特比状态解码算法等细节知识,笔者将在手动实现机器学习算法系列中详细介绍,本篇作为综述这里不做详细的展开。

基于深度学习的声学模型

  一提到神经网络和深度学习在语音识别领域的应用,可能我们的第一反应就是循环神经网络 RNN 模型以及长短期记忆网络 LSTM 等等。实际上,在语音识别发展的前期,就有很多将神经网络应用于语音识别和声学模型的应用了。

  最早用于声学建模的神经网络就是最普通的深度神经网络(DNN),GMM 等传统的声学模型存在音频信号表征的低效问题,但 DNN 可以在一定程度上解决这种低效表征。但在实际建模时,由于音频信号是时序连续信号,DNN 则是需要固定大小的输入,所以早期使用 DNN 来搭建声学模型时需要一种能够处理语音信号长度变化的方法。一种将 HMM 模型与 DNN 模型结合起来的 DNN-HMM 混合系统颇具有效性。
image.png

  在上图这个框架中,HMM 用来描述语音信号的动态变化,DNN 则是用来估计观察特征的概率。在给定声学观察特征的条件下,我们可以用 DNN 的每个输出节点来估计 HMM 某个状态的后验概率。由于 DNN-HMM 训练成本不高而且相对较高的识别概率,所以即使是到现在在语音识别领域仍然是较为常用的声学模型。

  除了 DNN 之外,经常用于计算机视觉的 CNN 也可以拿来构建语音声学模型。当然,CNN 也是经常会与其他模型结合使用。CNN 用于声学模型方面主要包括 TDNN、CNN-DNN 框架、DFCNN、CNN-LSTM-DNN(CLDNN)框架、CNN-DNN-LSTM(CDL)框架、逐层语境扩展和注意 CNN 框架(LACE)等等。这么多基于 CNN 的混合模型框架都在声学模型上取得了很多成果,这里小编仅挑两个进行简单阐述。

  TDNN是最早基于 CNN 的语音识别方法,TDNN 会沿频率轴和时间轴同时进行卷积,因此能够利用可变长度的语境信息。TDNN 用于语音识别分为两种情况,第一种情况下:只有TDNN,很难用于大词汇量连续性语音识别(LVCSR),原因在于可变长度的表述(utterance)与可变长度的语境信息是两回事,在 LVCSR 中需要处理可变长度表述问题,而 TDNN 只能处理可变长度语境信息;第二种情况:TDNN-HMM 混合模型,由于HMM能够处理可变长度表述问题,因而该模型能够有效地处理 LVCSR 问题。下图DTNN模型

image.png

  DFCNN 的全称叫做全序列卷积神经网络(deep fully convolutional neural network),是由国内语音识别领域的翘楚科大讯飞于2016年提出的一种语音识别框架。DFCNN 先对时域的语音信号进行傅里叶变换得到语音的语谱图,DFCNN 直接将一句语音转化成一张图像作为输入,输出单元则直接与最终的识别结果(比如音节或者汉字)相对应。DFCNN 的结构中把时间和频率作为图像的两个维度,通过较多的卷积层和池化(pooling)层的组合,实现对整句语音的建模。DFCNN 的原理是把语谱图看作带有特定模式的图像,而有经验的语音学专家能够从中看出里面说的内容。
image.png

  最后就是循环神经网络 RNN,其中更多是 LSTM 网络。音频信号具有明显的协同发音现象,因此必须考虑长时相关性。由于循环神经网络RNN具有更强的长时建模能力,使得 RNN 也逐渐替代 DNN 和 CNN 成为语音识别主流的建模方案。比如说常见的基于 seq2seq 的编码-解码框架就是一种基于 RNN 的模型。关于 RNN 在语音识别和声学模型中的应用小编不做过多解释,感兴趣的朋友可以自行查找相关资料了解。

  长期的研究和实践证明:基于深度学习的声学模型要比传统的基于浅层模型的声学模型更适合语音处理任务。语音识别的应用环境常常比较复杂,选择能够应对各种情况的模型建模声学模型是工业界及学术界常用的建模方式。但单一模型都有局限性。HMM能够处理可变长度的表述,CNN能够处理可变声道,RNN/CNN能够处理可变语境信息。声学模型建模中,混合模型由于能够结合各个模型的优势,是目前乃至今后一段时间内声学建模的主流方式。

端到端的语音识别系统简介

  无论是 GMM 和 HMM 这样的传统声学模型,还是基于深度学习的声学模型,它们对于整个语音识别系统都是分开优化的,但是语音识别本质上是一个序列识别问题,如果模型中的所有组件都能够联合优化,很可能会获取更好的识别准确度,所以我们需要一种端到端(End2End)的语音识别处理系统。

传统的语音识别系统中的声学模型训练:
image.png

传统的语音识别系统中的语言模型训练:
image.png

谷歌的 Listen-Attend-Spell (LAS) 端到端语音识别系统:
image.png

业界现状

  一个成功的语音识别系统真的是很难离开一众优秀开源框架的支撑,比如:HTK,Julius,CMU-Sphinx,PWTH-ASR,LIA-ASR 以及 Kaldi。后来居上的 Kaldi 独领风骚,拥有活跃的技术社区,被广泛的应用在语音识别技术的研究和系统开发中。据了解,很多国内语音公司的语音识别系统也有着对 Kaldi 或多或少的依赖。但是,Kaldi 也有不尽如人意的地方,它依赖大量的脚本语言,而且核心算法使用 C++编写的,对声学模型的更新就不是一件容易的事情了,尤其是在需要改变各种神经网络的结构时。即便是拥有丰富经验的工程师,在调试的时候也会经历巨大的痛苦。当然,尽管如此,Kaldi 还是一项伟大的工作。
  有问题存在,便有了改进的需要。Yoshua Bengio 团队成员 Mirco Ravanelli 等人开发了一个试图继承 Kaldi 的效率和 PyTorch 的灵活性的开源框架——PyTorch-Kaldi。相关的论文已经在 ICASSP 2019 上发表。PyTorch-Kaldi 就是为了弥补 PyTorch 和 Kaldi 之间的鸿沟。在 PyTorch 中实现声学模型,在l Kaldi 中执行特征提取、标签/对齐计算和解码。

开源项目:

  1. 阿里开源自研语音识别模型 DFSMN,准确率高达96.04%:https://www.oschina.net/news/96897/ali-open-source-dfsmnhttps://github.com/tramphero/kaldi
    image.png
  2. 语音识别开源工具PyTorch-Kaldi:兼顾Kaldi效率与PyTorch灵活性
    https://baijiahao.baidu.com/s?id=1640464401989944651&wfr=spider&for=pc
    https://github.com/mravanelli/pytorch-kaldi
    没有找到训练好的模型
  3. ASRT 是一套基于深度学习实现的语音识别系统,全称为 Auto Speech Recognition Tool。项目声学模型通过采用卷积神经网络(CNN)和连接性时序分类(CTC)方法
    必须遵循GPL 协议,所以最好不要用
    是socket通信,没有用flask搭建服务,舍弃
    https://baijiahao.baidu.com/s?id=1625146460946766055&wfr=spider&for=pc
    https://github.com/nl8590687/ASRT_SpeechRecognition
    只能识别中文,不能有英文,因为没有包含英文词典
  4. 适用于Python的语音识别模块,支持在线和离线的多个引擎和API https://github.com/Uberi/speech_recognition
    IBM的识别机制是按照这样来的:先是将你的音频传到IBM的服务器,然后是打开音频实时识别,听起来很拗口,意思就是将音频放一遍,服务器边放边识别,最后将所有的识别以文本的形式(貌似是JSON格式,但是在speechrecognition模块中,已经转为文本)返回给你; 3、看完上面的识别机制,你可能会产生疑问:如果音频时间比较长,中间出现网络中断,之前识别的内容不就没了么。因此最好采取分段的方法,将音频分割为较短的几段,等效于实时的返回,减少丢失的问题; 4、经过测试,又有新问题,如果分段的话,超过10段以上,远程服务器会中断服务,也就是说:不能频繁的调接口,跟网站的发爬虫一样。多进程就别想了。最后部门石经理提供的解决办法是:识别一段后。等个5秒左右再循环下一个,照此方法可行。由于我自己的视频不长,数量也不多,就没做等待处理
    问题:上传到IBM服务器,应该是不行
  5. MASR 中文语音识别https://github.com/libai3/masr
    在子系统能运行,在VM不可以
    MASR使用的是门控卷积神经网络(Gated Convolutional Network),网络结构类似于Facebook在2016年提出的Wav2letter。但是使用的激活函数不是ReLU或者是HardTanh,而是GLU(门控线性单元)。因此称作门控卷积网络。+++CTCBeamDecoder
    识别效果还可以吧 但没能自己录音---》2月2日可以录音,搭建好了服务
  6. 使用deepspeech的语音识别https://github.com/SeanNaren/deepspeech.pytorch
    下载下来了模型an4_pretrained_v2.pth,但没下载数据
  7. JavaScipthttps://github.com/TalAter/annyang
  8. 语音识别——基于深度学习的中文语音识别系统框架https://github.com/audier/DeepSpeechRecognition学习使用语音识别开源工具,搭建语音识别模型 模型只训练少数数据,效果不是很好
  9. CASRDemo使用百度语音识别接口,在本地搭建环境实现语音识别功能。
    基本能达到80%的汉语拼音正确率
    https://github.com/lihanghang/CASR-DEMO
  10. 博客及其模型都有https://blog.csdn.net/rookie_wei/article/details/84527839
    CTC(Connectionist Temporal Classification)是语音识别中的一个关键技术,通过增加一个额外的Symbol代表NULL来解决叠字的问题。
    在基于连续的时间序列分类任务中,常用CTC的方法。
    该方法主要体现在处理loss值上,通过对序列对不上的label添加blank(空)的方式,将预测的输出值与给定的label值在时间序列上对齐,再求出具体损失。
    训练的是没有杂音的,对于有杂音的比如test里的数据识别效果很不好;无需在虚拟机下运行,因为没有封装
  11. 非常好的博客教程,语音模型用的transforer,但是模型需要自己去训练,可以后续尝试https://blog.csdn.net/chinatelecom08/article/details/85013535

总结:

语音识别太难了
模型速度:最重要,硬件层面,包括麦克风转换速度,声卡转化速度和搭载模型的运算器速度。其次,模型层面,针对深度学习模型,合理简化模型结构,特别是卷积运算部分。
第三是网络速度,主要体现在bs架构的web应用中,需要在网络中传输语音流以及字符流,受网络因素影响。
设备影响很大,我在自己高性能电脑上比普通电脑快,能感知到速度变化;模型层面,减少卷积运算可以提速,但是明显影响质量,不可取。
模型准确率受环境和情感的影响,强噪音,回响等
准确率提升方法总结:
1.在选择声源数据时 利用麦克风阵列束形成、语音增强、回声消除、声源定位等方法提高准确率
2.前馈型序列记忆神经网络FSMN,增加了一个“记忆块”的模块来存储对判断当前语音帧有用的历史信息和未来信息,实现语音识别中的“端到端”建模。
长段音频识别方法:
1.长音频识别方法构建深度学习神经网络声学模型,通过特征提取来获取语音信息,利用反映识别对象语言的结构特性,从语音本质出发去提取特征信息,通过学习数据获取部、目标标签构成部和声学模型构建部、语音输入部、目标标签预测部和解码部
2.LSTM + CTC:对语音进行帧切割,然后进行特征提取,比如线性预测方法LPC,把一震波形变成一个多维向量。用LSTM + CTC将声学特征转换为音素,即声学模型部分。然后通过语言模型等解码技术转换为可以识别的文字。

你可能感兴趣的:(语音识别初识(记录自己的学习过程))