当前位置:文档之家› 语音识别字符分割算法_原创

语音识别字符分割算法_原创

5.设计方法
5.1概述
5.2硬件系统的设计
语音信号预处理
(1)预加重
预加重的目的是提升高频部分,使信号的频谱变得平坦,保持在低频到高频的整个频带中,能用同样的信噪比求频谱,以便于频谱分析或声道参数分析。

在计算机里用具有6dB/频程升高频特性的预加重数字滤波器来实现,一般是一阶的FIR数字滤波器:
为预加重系数,值接近于l,在0.9和1之间,典型值为0.94。

预加重的DSPBuilder实现:
为了便于实现,将上式中的一阶FIR预加重滤波器用差分方程表示为:
其中,为原始语音信号序列,N为语音长度,上面的公式显示其在时域
上的特性。

又因为0.94接近于15/16,所以将上面的式子变为
除以16可以用右移4位来实现,这样就将除法运算化简为移位运算,降低了计算复杂度。

在后面的模块设计中,也乘以或者除以一些这样的数,这些数为2的幂次,都可以用移位来实现。

预加重的硬件实现框图如下:
预加重实现框图
DSP Builder中的图形建模为:
预加重滤波器的DSPBuilder结构图
(2)分帧
语音信号是一种典型的非平稳信号,其特性随时间变化,其在很短的时间内是平稳的,大概为1小20ms,其频谱特性和物理特征可近似的看做不变,这样就可以采用平稳过程的分析处理方法来处理。

分帧的DSP Builder实现:
语音信号在10到20ms之间短时平稳(这样可以保证每帧内包含1一7个基音周期),也就是说选取的帧长必须介于10到20ms之间,此外,在MFCC特征提取时要进行FFT变换,FFT点数一般为2的幂次,所以本文中选择一帧长度为16ms,帧移为1/2帧长,这样一帧就包含了16KHz*16ms=256个点,既满足短时平稳,又满足FFT变换的要求。

由于采集的语音是静态的,语音长度已知,很容易计算出语音的帧数,但是在硬件上或实时系统中,语音长度是无法估计的,而且还要考虑存储空间的大小和处理速度,采用软件实现时的静态分帧方法是行不通的,可以利用硬件本身的特点进行实时的动态分帧。

为了使帧与帧之间平滑过渡,保持连续语音流的自相关性和过渡性,采用交叠分帧的算法。

帧移取1/2帧长,即128个数据点当作一个数据块。

FIFO1大小为一帧语音长度,分成两个数据块,预加重后的数据写入这个FIFO。

为了实现帧移交叠,在FIFO1读数据时,同时再用FIFO2保存起来,当FIFO的一块数据读完以后,紧接着从FIF22读出这一块的副本。

写入的一块数据,相当于被重复读出2次,所以FIFO1的读时钟频率设计为写时钟频率的2倍,而FIFOZ的读写时钟频率和FIFO1的读时钟频率相同。

分帧以后的数据在图中按时间标号为1、2、2、3.··…,1、2为第一帧,2、3为第二帧,以此类推。

分帧实现框图
FIFO1的写信号一直为1(写允许),等到写完第1块(128点)再允许读。

当FIFO1读第1块数据的时,FIFO2保存第1块的数据,两者时钟频率一致,同时FIF01也在写第2块数据。

FIFO1读完第1块数据,FIFO2里为第1块数据,FIFO1中第2块数据写了一半,此时禁止FIFO1读,并使能FIF02的读信号,从FIFO2中将第1块数据再读一遍,读完时第2块数据己经完全写入FIFO1,再允许FIFO1读,同时禁止FIF02读,如此循环。

图中,数据选择器就是为了实现两个FIFO的读出数据选通,第1次数据为FIFO1的读出内容,第2次数据为FIFO2读出内容,这样就实现将一块数据内容重复输出两次,读完两次的同时,写完下一块内容。

分帧的DSPBullder实现为:
分帧的DSPBuilder的结构图
Inc 模块是为了让FIFO1写入128个数据后才产生读使能信号,其时钟频率与写时钟相同。

Counter 是模256的计数器,当计数值在0到127之间时输出FIFOI 的值,128到255之间输出FIFO2的值,时钟频率与读时钟相同,为写时钟的两倍。

DMUX 为数据选择器。

分帧后,波形平滑了许多,略微有了一点延时,这是因为FIFOI 的读使能比写使能晚了128个采样点。

但这样实现的实时分帧,与静态分帧相比,速度提高了很多,有效的减少了存储空间的浪费。

(3) 加窗
加窗的目的是使主瓣更尖锐,旁瓣更低。

语音信号数字处理中常用的窗函数是矩形窗和汉明窗,本文选取的是汉明窗。

因为矩形窗虽然有较高的频率分辨率,但它的频谱泄露比较严重,相比较来说,虽然汉明窗频率分辨率没有矩形窗高,但它有更平滑的底通特性,能够在较高程度上反映短时语音信号的频率特性。

汉明窗公式如下(其中N 为帧长):
0.540.46cos[2/(1)],01n N n N π--≤≤-
()n ω=
{
0,n else =
设分帧后的信号为S(n),加窗就是窗函数诚w(n)来乘分帧后的信号S(n),从而形成加窗语音信号()()()*s n s n n ωω=
加窗的DSP Builder 实现:
分帧后数据为8位定点QO(即8位有符号整数),三角余弦函数的范围为-1到1,可以用Q15来表示,但是Q15能表示的范围为一1到32767/32768之间,原则上应该用Q14表示,但从方便和总体精度考虑,仍然用Q15,+l 用32767来表示。

加窗后输出还是为8位定点QO 。

具体方法是:
窗函数采取查表的方法,表的大小为帧长(本文为256),将窗函数()n ω中 的0.08~1的值用Q15表示,其数值上相当于小32768(2的15次方),保存在 windowTable[]中,然后用预加重的信号s(n)乘以WindowTable[i]来计算加窗后的语音信号,得到加窗后的语音信号[]s i ω,仍然与预加重后的位数相同,公式如下:
[]()[]*[]15S i S i WindowTable i ω=>>
其实,分帧和加窗是同时进行的,分帧时只要找到与窗函数中对应点的关系,然后相乘就能得到加窗的数据,下图表示了预加重、分帧和加窗的时序关系:
预加重、分帧和加窗时序关系
由图知,真正的第1帧有效数据应该是在FIF01写信号有效的192个时钟期后产生。

加窗的主要运算对象是查找表,其DSPBullder实现如下:
加汉明窗的DSPBuilder 结构图
图中,Counter 为模256(窗长为256)个计数器,Incl 模块使其在192个点 之后才开始循环计数,这样每帧的数据点与窗函数的数据点就一一对应了。

hamming--table 的设置为:17964-15073*cos([0:2*pi/255:2*pi]),将0到2π分成255个区间,再将其余弦值放大了32768倍。

● 总线接口的设计
● 自定义指令
5.3软件系统的设计 ● 连续语音分割
该部分功能利用matlab 软件验证通过,并在nios II 编程实现。

包含有‘前’、‘退’、‘左’、‘右’、‘停’五个孤立字的连续语音信号波形如下图1所示:
1
2
3
4
5
6
7
x 10
5
-1-0.8-0.6-0.4-0.200.20.40.60.8
1
图1:连续语音信号波形
上述语音信号通过麦克风输入、采样量化后存储在DE1开发板上Rom 中,根据地址存储形象化如下:
图2:语音数据在rom 中的存储
对其处理步骤如下:
(1) 如图所示,L
为语音数据帧长,其大小根据经验值得到,与单个字语音信
息的长度、采样频率有关,L 取值的标准是能包含住各个字的语音信息长度。

对于本设计8KHz 的采样率,L 取11792。

∆可以根据情况进行取值,在这里取18。

对上述存储数据从首地址开始取数据,每隔∆个数据顺序取L 个数据存放到一数组中,由此可以得到一系列的数组,对于上述语音数据可以得到6000多个数组。

(2) 对上步中得到的数组分别进行取绝对值、求和,以存储先后为横轴,各数
组和为纵轴作曲线如下图3:
0100020003000400050006000
0.5
1
1.5
2
2.5
4
图3
(3) 如上图3所示,五个波形尖峰对应五个孤立字语音信息,分析可知这五个
尖峰值所对应的数组即为那五段有用语音信息。

按照步骤(1)的思路,从上图3曲线起点开始,取1000个数据点放到一个数组里面,求出该数组里面的最大值以及其所对应的位置。

若最大值满足阈值条件,则步进1000,从第1001个点再顺序取1000个点放到一个数组里面,重复上述操作。

若最大值不满足所设阈值条件,则步进1,从第2个点顺序取1000个点放到一个数组里面,重复上述操作。

这样即可求得到五段包含有用孤立字信息的语音信号。

所得结果通过matlab 仿真作图如下所示:
4
x 104x 104
x 104x 104
x 104x 104
x 104x 104
x 104x 104
图4:仿真结果图
图中第一行第一列为原始包含五个孤立字的语音信号波形,第二行到第六行左侧依次为‘前’‘退’‘左’‘右’‘停’的原始波形,右侧为通过上述方法提取出的对应孤立字的语音信号波形,由图可以看出,提取效果很好。

●端点检测
●Mfcc系数提取
●HMM训练模块
●语音识别模块。

相关主题