开会:
一组:进行顺利,有可能这周能搞出来;
二组:我们认为马尔可夫链理解得差不多了,主要理解了我们要用到的Viterbi 算法。
知乎 –> 还挺容易理解的。
难点在于卷积神经网络/循环神经网络,所以明天大家一起努力看卷积神经网络。这周出原型应该是99%不可能了。
大概知道要建立2个模型,然后可能分别使用马尔科夫链,得到最终结果。
一、实训平台
首先我们要通过卷积神经网络构建的网络层次对输入数据训练后建立声学模型,也就是将语音信号转换成拼音序列,那么最终转换成中文文本需要拼音转换成词组,如何构建拼音序列与词组间的映射。首先要制作一个汉语拼音字典,其中包含了拼音对应的所有汉字的列表,这里的数据不够完善所以识别的准确率会有一定的影响。
做自然语言处理有一个基本的步骤是词频统计,读取语言模型的文件,然而我们知道中文的词语有单音节词、双音节词和多音节词之分,如果要做词频统计的文本量足够大,而且我们只需要知道词频最高的几个词,我们通过大量文本来分别每2字词、3字词、4字词乃至5个及以上的字词做一个切分,这里我们只统计1个词、2个词的词频分别对应图如下。那么就可以生成一个带有词频标识的词典,而且可以发现,词频较高的字符块是真正的词的概率很高。
语音信号转换成拼音序列(CNN)
基于马尔科夫链实现拼音向文本的转变
从实验结果可以看出来语音识别的准确率比较好,平均的识别准确率能达到80%,然而语音转文字的效果就相对较差,而且拼音序列和汉字序列无法对应起来,原因有几个方面,
- 一个是文字并未包含在字典内,所以造成了识别数据的丢失
- 一个是识别的字的内容不对,这就跟词频有关系,想要改进语音识别效果的话可以在这两个方面进行完善。
二、绝佳的ASR学习方案:这是一套开源的中文语音识别系统
ASRT 是一套基于深度学习实现的语音识别系统,全称为 Auto Speech Recognition Tool,由 AI 柠檬博主开发并在 GitHub 上开源(GPL 3.0 协议)。本项目声学模型通过采用卷积神经网络(CNN)和连接性时序分类(CTC)方法,使用大量中文语音数据集进行训练,将声音转录为中文拼音,并通过语言模型,将拼音序列转换为中文文本。基于该模型,作者在 Windows 平台上实现了一个基于 ASRT 的语音识别应用软件它同样也在 GitHub 上开源了。
ASRT 项目主页:https://asrt.ailemon.meGitHub 项目地址:https://github.com/nl8590687/ASRT_SpeechRecognition
系统流程
1、特征提取:将普通的 wav 语音信号通过分帧加窗等操作转换为神经网络需要的二维频谱图像信号,即语谱图。
2、声学模型:基于 Keras 和 TensorFlow 框架,使用这种参考了 VGG 的深层的卷积神经网络作为网络模型,并训练。
CTC 解码:在语音识别系统的声学模型输出中,往往包含了大量连续重复的符号,因此,我们需要将连续相同的符号合并为同一个符号,然后再去除静音分隔标记符,得到最终实际的语音拼音符号序列。
3、语言模型:使用统计语言模型,将拼音转换为最终的识别文本并输出。拼音转文本本质被建模为一条隐含马尔可夫链,这种模型有着很高的准确率。
三、语音识别技术基础理解
预处理之后:
如何把矩阵变成文本?
//首先介绍2个概念
---音素:单词的发音由音素构成。对英语,一种常用的音素集是卡内基梅隆大学的一套由39个音素构成的音素集,参见The CMU Pronouncing Dictionary。
汉语一般直接用全部声母和韵母作为音素集,另外汉语识别还分有调无调,不详述。
---状态:这里理解成比音素更细致的语音单位就行啦。通常把一个音素划分成3个状态。
第一步,把帧识别成状态(难点)。
第二步,把状态组合成音素。
第三步,把音素组合成单词。
使用隐马尔可夫模型(Hidden Markov Model,HMM)
第一步,构建一个状态网络。
第二步,从状态网络中寻找与声音最匹配的路径。
搭建状态网络,是由单词级网络展开成音素网络,再展开成状态网络。语音识别过程其实就是在状态网络中搜索一条最佳路径,语音对应这条路径的概率最大,这称之为“解码”。路径搜索的算法是一种动态规划剪枝的算法,称之为Viterbi算法,用于寻找全局最优路径。
观察概率:每帧和每个状态对应的概率
转移概率:每个状态转移到自身或转移到下个状态的概率
语言概率:根据语言统计规律得到的概率
声学模型:第一步+第二步
语言模型:第三步