1.背景语音是人类最自然的互动方式。计算机发明后,让机器“听懂”人类的语言,理解语言的含义,并做出正确的回答,成为人们追求的目标。这个过程主要使用了三种技术,即自动语音识别(automaticspeechrecognition,ASR)、自然语言处理(naturallanguageprocessing,NLP)和语音合成(speechsynthesis,SS)。语音识别技术的目的是让机器能够理解人类的语音,这是一个典型的交叉学科任务。2.概述语音识别系统模型由两部分组成:声学模型和语言模型。声学模型对应语音到音素的概率计算,语言模型对应音素到文本的概率计算。一个连续语音识别系统大致可以由四个部分组成:特征提取、声学模型、语言模型和解码部分。具体过程是先从语音数据中提取声学特征,然后通过模型训练和统计得到声学模型,作为识别的模板,将语言模型与解码处理结合起来得到识别结果。声学模型是语音识别系统的关键部分,其作用是描述声学单元产生的特征序列并对语音信号进行分类。我们可以使用声学模型计算观察到的特征向量属于每个声学单元的概率,并根据似然准则将特征序列转换为状态序列。本文数据集地址为清华大学THCHS30中文语音数据集。详细代码教程中文语音识别2.1特征提取神经网络不能将音频作为输入进行训练,因此第一步是从音频数据中提取特征。共性特征提取是基于人的发声机制和听觉感知,从发声机制到听觉感知来了解声音的本质。一些常用的声学特征如下:(1)线性预测系数(LPC),线性预测分析是模拟人发声的原理,通过分析声道中短管级联的模型得到。假设系统的传递函数类似于全极点数字滤波器,通常12~16个极点就可以描述语音信号的特征。所以对于n时刻的语音信号,我们可以用前一时刻信号的线性组合来近似模拟。然后计算语音信号的采样值和线性预测的采样值,让两者之间的均方误差(MSE)最小,就可以得到LPC。(2)PerceptualLinearPrediction(PLP),PLP是一种基于听觉模型的特征参数。该参数是相当于LPC的一个特征,是全极点模型预测多项式的一组系数。不同的是,PLP是基于入耳式听觉,通过计算应用于频谱分析,输入语音信号经过入耳式听觉模型处理,取代LPC使用的时域信号。这一优势有利于抗噪声语音特征的提取。(3)梅尔频率倒谱系数(MFCC),MFCC也是基于入耳式听觉的特点。梅尔频率倒谱频带划分是在梅尔刻度上等距绘制的,梅尔频率的刻度值与实际频率之间的对数分布关系更符合人耳的听觉特性,因此可以使语音信号有更好的表现。(5)基于滤波器组特征Fbank(Filterbank),Fbank特征提取方法相当于MFCC去掉了最后一步的离散余弦变换。有了MFCC特性,Fbank特性保留了更多的原始语音数据。(6)Spectrogram,频谱图就是语音频谱图,一般是对接收到的时域信号进行处理得到的,所以只要有足够时间长度的时域信号。频谱图的特点是观察语音不同频段的信号强度,可以看到随时间的变化。本文使用声谱图作为特征输入,使用CNN进行图像处理进行训练。频谱图可以理解为一段时间内频谱图的叠加,因此提取频谱图的主要步骤分为:分帧、加窗、快速傅立叶变换(FFT)。2.1.1读取音频第一步,我们需要找到scipy模块将音频转换成有用信息的方法,fs是采样频率,wavsignal是语音数据。我们数据集的fs都是16khz。importscipy.io.wavfileaswavfilepath='test.wav'fs,wavsignal=wav.read(filepath)2.1.2Framedandwindowedspeechsignalsarenotmacroscopiclystability,butmicroscopeicallystable,withShort-termstationary(within10-30ms,可以认为语音信号没有变成音素的读音),一般为25ms。为了处理语音信号,我们需要对语音信号加窗,即一次只处理窗口内的数据。因为实际的语音信号很长,我们不能也不必一次处理很长的数据。一个明智的解决方案是每次取一个数据,分析它,然后取下一个数据再次分析。我们的开窗操作指的是汉明窗操作。原理是将一帧中的数据乘以一个函数,得到一帧新的数据。公式如下。如何只取一份数据?因为后面我们会对汉明窗中的数据进行快速傅里叶变换(FFT),这里假设一个窗内的信号代表一个周期信号(也就是说窗的左右两端可以大致连续),而且通常是一个小的音频数据,没有明显的周期性。添加汉明窗后,数据更接近于周期函数。由于加入了汉明窗,只反映了中间的数据,两边的数据信息都丢失了,所以移动窗的时候会有部分重叠。当窗口为25ms时,步长可以为10ms(其中a的值一般取0.46)。公式为:代码为:importnumpyasnpx=np.linspace(0,400-1,400,dtype=np.int64)#返回区间w=0.54-0.46*np.cos(2*np.pi*(x)/(400-1))time_window=25window_length=fs//1000*time_window#framep_begin=0p_end=p_begin+window_lengthframe=wavsignal[p_begin:p_end]plt.figure(figsize=(15,5))ax4=plt.subplot(121)ax4.set_title('一帧原图')ax4.plot(frame)#添加窗口frame=frame*wax5=plt.subplot(122)ax5.set_title('经过hanmming')ax5.plot(frame)plt.show()图片效果为:2.1.3快速傅里叶变换(FFT)语音信号在时域上很难看出其特征,因此通常转换为频域的能量分布,因此我们对每一帧经过窗函数处理的信号进行快速傅里叶变换,将时域图像转换为每一帧的频谱,然后我们就可以将频率叠加起来每个窗口的频谱以获得频谱图。代码为:fromscipy.fftpackimportfft#进行快速傅立叶变换frame_fft=np.abs(fft(frame))[:200]plt.plot(frame_fft)plt.show()#取对数求dbframe_log=np.log(frame_fft)plt.plot(frame_log)plt.show()2.2CTC(ConnectionistTemporalClassification)说到语音识别,如果有一个clippedaudio的数据集和相应的transcription,我们不知道如何将转录中的字符与音频中的音素对齐,大大增加了训练语音识别器的难度。如果不对数据进行调整,则意味着一些简单的方法不能用于训练。对此,我们可以选择的第一种方法是制定一个规则,比如“一个字符对应十个音素输入”,但是人的语速差异很大,这种方法容易出错。为了保证模型的可靠性,第二种方法,即手动对齐每个字符在音频中的位置,训练好的模型表现更好,因为我们可以知道每个输入时间步长的真实信息。但它的缺点也很明显——即使有合适大小的数据集,这种方法仍然非常耗时。事实上,制定规则的准确性差、人工调试时间长的问题不仅仅出现在语音识别领域,其他任务,如手写识别、给视频添加动作标记等,也面临着这些问题。在这种情况下,这就是CTC派上用场的地方。CTC是一种让网络自动学习对齐的好方法,非常适合语音识别和手写识别。为了更形象的描述,我们可以将输入序列(音频)映射为X=[x1,x2,…,xT],对应的输出序列(转录)为Y=[y1,y2,…,yU].之后,字符与音位对齐的操作就相当于在X和Y之间建立了一个精确的映射。具体可以看经典的CTC文章。损失函数部分代码:defctc_lambda(args):labels,y_pred,input_length,label_length=argsy_pred=y_pred[:,:,:]returnK.ctc_batch_cost(labels,y_pred,input_length,label_length)解码部分代码:#num_resultis模型预测结果,num2word对应拼音列表。defdecode_ctc(num_result,num2word):result=num_result[:,:,:]in_len=np.zeros((1),dtype=np.int32)in_len[0]=result.shape[1];r=K.ctc_decode(result,in_len,greedy=True,beam_width=10,top_paths=1)r1=K.get_value(r[0][0])r1=r1[0]文本=[]foriinr1:text.append(num2word[i])返回r1,text[3.声学模型该模型主要使用CNN对图像进行处理,通过最大池化提取主要特征,加入定义的CTC损失函数进行训练。当有输入和标签时,模型结构可以自行设置。如果能够提高准确率,那是可取的。如果有兴趣,也可以加入LSTM等网络结构。关于CNN和pooling操作网上资料很多,这里不再赘述。有兴趣的读者可以参考之前的卷积神经网络AlexNet。代码:classAmodel():"""DocstringforAmodel."""def__init__(self,vocab_size):super(Amodel,self).__init__()self.vocab_size=vocab_sizeself._model_init()self._ctc_init()self.opt_init()def_model_init(self):self.inputs=Input(name='the_inputs',shape=(None,200,1))self.h1=cnn_cell(32,self.inputs)self.h2=cnn_cell(64,self.h1)self.h3=cnn_cell(128,self.h2)self.h4=cnn_cell(128,self.h3,pool=False)#200/8*128=3200self.h6=Reshape((-1,3200))(self.h4)self.h7=dense(256)(self.h6)self.outputs=dense(self.vocab_size,activation='softmax')(self.h7)self.model=模型(inputs=self.inputs,outputs=self.outputs)def_ctc_init(self):self.labels=Input(name='the_labels',shape=[None],dtype='float32')self.input_length=输入(名称='input_length',shape=[1],dtype='int64')self.label_length=Input(name='label_length',shape=[1],dtype='int64')self.loss_out=Lambda(ctc_lambda,output_shape=(1,),name='ctc')\([self.labels,self.outputs,self.input_length,self.label_length])self.ctc_model=Model(inputs=[self.labels,self.inputs,self.input_length,self.label_length],outputs=self.loss_out)defopt_init(self):opt=Adam(lr=0.0008,beta_1=0.9,beta_2=0.999,decay=0.01,epsilon=10e-8)self.ctc_model.compile(loss={'ctc':lambday_true,output:output},optimizer=选择)4。语言模型4.1统计语言模型简介统计语言模型是自然语言处理的基础。它是一种具有某些上下文相关特征的数学模型。它本质上也是一种概率图模型,广泛应用于机器翻译中。、语音识别、拼音输入、图片文字识别、拼写纠错、查找拼写错误和搜索引擎等。在很多任务中,计算机需要知道一个单词序列是否可以组成一个大家都能理解的有意义的句子,没有拼写错误,比如正如这些Bottomline:很多人可能并不清楚机器学习究竟是什么,但它实际上已经成为我们日常生活中不可或缺的重要组成部分。很多人不太清楚机器学习到底是什么,但它已经成为我们日常生活中不可或缺的一部分。人机到底能学什么,学什么,我不是太了解,但我常常认为,对于我们学生的日常生活来说,这并不重要,也不是不可或缺的。第一句符合语法规范,词义清楚,第二句意思还清楚,第三句意思模糊。这是从基于规则的角度来理解的。70年代以前,科学家们也是这么想的。后来,Jalinek使用一个简单的统计模型解决了这个问题。从统计的角度来看,第一个句子出现概率大,如,第二个次之,如,第三个最小,如。按照这个模型,第一个句子出现的概率是第二个句子的10的20次方,更不用说第三个句子了,所以第一个句子是最常识的。4.2模型建立假设S是由一系列单词w1,w2,...wn组成的生成句子,则句子S出现的概率为:由于计算机内存空间和计算能力的限制,我们显然需要更多合理的计算方法。一般来说,只考虑与前一个词的关系,就能有相当不错的准确率。在实际使用中,通常只考虑与前两个词的关系即可,极少数情况下只考虑与前三个词的关系。因此,我们可以选择采用如下公式:而P我们可以通过爬取数据和统计词频来计算概率。4.3拼音转文字的实现拼音转汉字的算法是动态规划,与求最短路径的算法基本相同。我们可以把中文输入看成是一个沟通问题。每个拼音可以对应多个汉字,每个汉字一次只能读一个音。从左到右把每个拼音对应的字符连起来,就成了一条信息。到图表。5.模型测试声学模型测试:语言模型测试:由于模型简单,数据集太少,模型效果不是很好。项目源码地址:https://momodel.cn/explore/5d5b589e1afd9472fe093a9e?type=app6。参考论文:语音识别技术研究进展与展望博客:ASRT_SpeechRecognition博客:DeepSpeechRecognition关于我们Mo(网址:momodel.cn)是一个支持Python的人工智能在线建模平台,可以帮助您快速开发、训练和部署模型。Mo人工智能俱乐部是由本站研发和产品设计团队发起,致力于降低人工智能开发和使用门槛的俱乐部。团队拥有大数据处理分析、可视化和数据建模经验,承接过多领域智能化项目,具备从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析和人工智能技术,并以此促进数据驱动的科学研究。目前俱乐部每周六在杭州举办以机器学习为主题的线下技术沙龙活动,不定期进行论文分享和学术交流。我们希望把对人工智能感兴趣的各界朋友聚集在一起,继续交流,共同成长,推动人工智能的大众化和普及化。
