语音信号处理实验指导 下载本文

语音信号处理实验讲义

王艳芬 李剑 编

中国矿业大学信电学院

学生实验守则

一、学生进入实验室必须遵守实验室的规章制度,遵守课堂纪律,保持实验室的安静和整洁,爱护实验室的一切设施。

二、实验课前要认真预习实验指导书,写出实验预习报告,并经教师批阅后方可进行实验。

三、实验课中要遵守操作规程,不要带电连接、更改或拆除线路。线路接好后,经指导老师检查后,方可接通电源进行实验。对于软件上机实验,不得随意删改计算机中原有的文件。

四、学生实验前对实验所用仪器设备要了解其操作规程和使用方法,凡因不预习或不按使用方法进行操作而造成仪器设备损坏者,除书面检查外,按学校规定进行赔偿。

五、实验中主意安全,遇到事故应立即关断电源并报告教师检查处理。

六、实验完毕后要做好整理工作,实验数据必须经指导教师签阅后,才能拆除线路,并将仪器、设备、凳子等按规定放好,经同意后方可离开实验室。

七、因故缺课的学生可向实验室申请一次补做机会。无故缺课或无故迟到(15分钟以上)的不予补做,该次实验无成绩;累计三次者,该实验课以不及格论,并不得参加该门理论课程的考试。

八、实验室仪器设备不能擅自搬动调换,更不能擅自带出实验室。

信电学院专业实验中心

二零一一年九月

目录

实验一 语音信号得基音参数提取???????????????????????1 实验二 语音信号的谱分析??????????????????????????7 实验三 基于DTW算法的孤立字识别??????????????????????11

《语音信号处理实验讲义》是为了配合“语音信号处理”课程教学而编写的,适用于信息工程、电子科学与技术等专业。前修课程为“数字信号处理”。该课程总学时数为40学时,其中实验学时为8学时。

实验内容及参考学时安排如下:

实验一 语音信号的基音参数提取 (3个学时) 实验二 语音信号的谱分析 (3个学时) 实验三 基于DTW算法的孤立字识别 (2个学时)

实验一 语音信号的基音参数提取

一、实验目的

1.了解基音的基本概念以及清音与浊音的区别。

2.掌握几种基本的基音提取方法,熟悉自相关法、倒谱法和简化逆滤波法进行基音提取的matlab编程。

3.熟悉应用FFT对典型信号进行频谱分析的方法。 二、实验原理与方法

1.自相关法

利用浊音和清音的自相关函数不同的特点,检测出浊音自相关函数波形的峰值位置,就可提取出基音。

为了提高相关法检测基音周期的可靠性,首先应对原始信号进行预处理。方法要点:语音信号的低幅度部分集中了大量的共振峰信息,而高幅度部分包含了大量的基音信息。一般采用中心削波处理法来进行:中心削波处理是使用中心削波函数进行处理的,用以削除语音信号的低幅度部分,它是一种非线性处理方法。

其输入输出函数为

?x(n)?CL?y(n)?C[x(n)]??0?x(n)?CL?x(n)?CLx(n)?CL (1.1)

x(n)??CL其中削波电平CL一般取最大信号幅度的60%~70%。

为减少自相关计算中的乘法计算 ,可对中心削波函数进行修正:采用三电平中心削波。其输入输出函数为

?1?y(n)?C[x(n)]??0??1?x(n)?CLx(n)?CL (1.2) x(n)??CL经过上述预处理,就可以用自相关法检测基音周期了。 自相关函数为:

N?1?kRn(k)?m?0?[y(n?m)w'(m)[y(n?m?k)w'(m?k)] (1.3)

1

w(m)为窗函数。若采用直角窗,则自相关函数为:

N?1?kRn(k)?m?0?y(n?m)y(n?m?k) (1.4)

其中,y(n)为经过削波处理后的信号。

用自相关法进行基音提取的matlab编程的流程图为:

2.倒谱法

原始信号 选取合适的语音段 取信号绝对值的最大值 三电平削波 自相关计算 图1 自相关法基音提取的matlab编程流程图 浊音语音的复倒谱中存在峰值,其出现时间等于基音周期;而清音语音段的复倒谱则不出现这种峰值。利用这一性质可以进行清/浊音判断并估计浊音的基音周期。

这种方法的要点是计算出复倒谱后,进行解卷,提取出声门激励信息,在预期的基音周期附近寻找峰值。如果峰值超过了预先设定的门限,则语音段为浊音,而峰的位置就是基音周期的估计。如果不存在超过门限的峰值,则语音段定为清音。如果计算的是依赖于时间的复倒谱,则可估计出激励源模型及基音周期随时间的变化。

用倒谱法进行基音提取的matlab编程的流程图如图2所示:

对原始信号进行分帧处理时,要注意帧长和偏移量的选取,这两个参数会直接影响到最后的仿真结果。

3.简化逆滤波法

简化逆滤波跟踪算法是相关处理法进行基音提取的一种现代化的版本,是检测基音周期的一种比较有效的方法。这种方法先对语音波形降低取样率,进行LPC分析,抽取声道模型参数,然后利用这些参数用线性预测逆滤波器对原信号进行逆滤波,从预测误差中得到音源序列,再用自相关法求得基音周期。之所以用逆滤波,是因为它是将频谱包络逐渐平坦下去的过程。得到的线性预测误差信号只包含有激励

2

原始信号 将原始信号分帧 通过海明窗处理 进行FFT变换 取模求对数 反FFT变换 取模求得倒谱 图2 倒谱法基音提取的matlab编程流程图 的信息,而去除了声道影响,所以它提供了一个简化的频谱平滑器。

用LPC误差信号提取基音的优点是e(n)的频谱较平(其梳齿效应是由基音的周期性造成的,因为周期信号的频谱是离散的),因而共振峰的影响已去除。

设计截止频率为900Hz的切比雪夫2型低通滤波器 将信号通过低通滤波器处理 降低取样率5:1 求线性预测系数 LPC分析 自相关计算 内插1:5 图3 简化逆滤波法编程流程图 3

三、实验内容和步骤

要求同学在实验课前录制好声音。

(1) 使用录音软件或者Matlab函数,分别采集一段浊音和清音语音信号(是你自己说的,如:a,o,s等),采样率为8KHz,量化精度为16比特线性码,存在自己指定的目录下,例如D盘根目录下叫sound的文件夹中,录音文件名为yourfilename_a.wav,yourfilename_s.wav等。录音的软件和Matlab函数的使用见随后的附录。

(2) 根据语音信号的短时平稳特性,分析帧长取30ms(或10ms~50ms);

(3) 利用上述基音提取的三种方法(任选两种方法)的编程流程图(图1、图2和图3)编制浊音语音基音提取的matlab程序,上机调试给出相应波形,并根据图形,分析计算出基音周期。所用公式为:

Np?Tp/Ts?Tp*fs (1.5)

其中Np是基音脉冲处所对应的位置,fs是抽样频率,Tp是基音周期。

(4) 将语音信号换为清音语音,运行程序,与浊音语音的运行结果进行比较,并得出结论。

四、实验报告

(1) 简述实验目的和原理。

(2) 任选两种方法,按实验步骤附上自己编制的实验程序和运行结果,分析所得到的图形,计算

出基音频率。

(3) 分别将两种基音提取方法得到的清音语音与浊音语音的运行结果进行比较,写出结论。 (4) 写出自己的收获与建议。

附1:录音软件GoldWave的使用

使用步骤如下:

(1) 双击桌面上的GoldWave图标,打开GoldWave软件后,点击工具栏上的新建图标。 (2) 在新建声音对话框中选择声道数为单声道,采样速率为16000,初始化长度为4,点击“确

定”。

(3) 随后出现的蓝色工作区为声音波形显示区,工具栏上红色圆形图标为“开始录音”按钮。点

击红色圆形图标开始录制。

(4) 录制过程中要求环境噪声比较小,同时有效语音段声音的幅值不要小于0.2,也不要大于1。 (5) 录制完毕后,保存。

4

附2:Matlab录音程序示例

clear;clc;close all;

%清理命令窗口记录、清除工作空间变量、关闭图形 %采样速率为10KHz,采样长度为3秒

%录制采样精度为16位的声音,参见matlab的help文档

Fs=10000; N=1:3*Fs;

Sd=wavrecord(3*Fs,Fs,’double’);

wavwrite(Sd,Fs,’yourname_a.wav’); %将数据存储到当前目录下,文件名为yourname_a.wav

附3:Matlab调用wav文件的方法示例:

s=wavread(‘yourname_a.wav’); figure; plot(s); grid on; x=s(10000:10511):

%读取录音文件,参见matlab的help文档 %画出这段语音信号的波形

%根据波形位置,截取有效语音段中的51.2ms的数据

三种基音提取方法所需的有效语音长度不相同,学生需自行选择合适的语音长度,然后再进行处理。

附4:主要的matlab语句:

Sd=wavrecord(3*Fs,Fs,'double'); wavwrite(Sd,Fs,'d:\\a.wav');

% 采样率Fs,采样长度3倍,16位采样精度 % 将数据存储到D盘根目录下,文件名为a.wav

x=wavread('d :\\yourfilename.wav'); %读语音信号

[Max,I]=max(Z); r=xcorr(y);

% 取Z的最大值 % 求自相关函数

y=enframe(x ,N,n); % 将信号x分帧,enframe是分帧函数,N为帧长,n为偏移量

% n阶阻带衰减为Rs dB,归一化截止频率为Wn的切比雪夫

[b,a] = cheby2(n,Rs,Wn); 滤波器,b,a为滤波器的系数。 y=filter(m,n,x);

%对信号x进行滤波,滤波系数为m,n

z=decimate(y,5); a=lpc(z,4);

% 降低取样率5:1 % 求线性预测系数 % 内插1:5

z3=interp(z2,5);

附5: Matlab编程中常用的控制流结构

for 循环结构:

for x= array end

x为循环变量 array为循环数组 命令组

(commands)

if-else-end 分支结构

5

if expression1

判决表达式1

表达式为真时,执行commands1 判决表达式2

表达式1为假,而表达式2为真,执行commands2并结束此结构

(commands1)

elseif expression2

(commands2)

………

else (commandsk) end

当前面所有表达式均为假时,执行该组命令

附6: 录制声音文件

本讲义三个实验中需要同学们在实验前录制好声音文件。 (根据英语发音音标表)

长元音举例: /a:/ /o:/ /u:/ /e:/……

辅音包括清辅音和浊辅音两大类。发音时声带不震动、送气的叫清辅音;发音时声带震动、不送气的叫浊辅音。

辅音都是嗓音,这是因为发音时气流受到不同程度的阻碍,发出的音不像元音那样清脆悦耳。 浊辅音举例:/m/ /n/ /l/…… 清辅音举例:/s/ /t/ /p/……

根据实验需要,要求同学们录制至少四个声音文件:(采样率选为8KHz)

第一个声音文件包括前面给出得3个元音,3个浊辅音,3个清辅音,文件命名为:xxx_音标.wav; 第二个声音文件包括0到10,共11个汉语的数字音,文件命名为:xxx_数字.wav;

第三个声音文件内容是:姓名,中国矿业大学,李、张、刘、孙、王。文件命名为:xxx_姓氏1.wav; 第四个声音文件重复第三个声音文件的内容,文件命名为:xxx_姓氏2.wav。用于语音识别。 注意录制声音时,选择环境比较安静的时候。

上课前请同学们把声音文件发送到共享邮箱:sound_cumt@163.com,密码:cumt12345,邮件名按以下方式命名为:04-1-07李大伟,以便实验三可以共享使用不同人的声音进行识别。

实验一上课前至少要录制一个元音,如 a:,和一个清音,如:s。

6

实验2 语音信号的谱分析

一、实验目的

1.了解复倒谱、倒谱以及同态分析的概念。 2.掌握用matlab编程进行倒谱分析的方法。 3.加深对语音信号数字模型的了解。 4.了解LPC谱的定义。

5.了解LPC谱与信号谱之间的区别。

二、谱分析原理与方法

1.倒谱分析

序列x(n)的倒谱c(n)为该序列的z变换的模的对数的逆z变换。定义式为:

c(n)=z?1??lnz(x(n))?? (2.1)

或表示成傅里叶变换形式

1c(n)=2??jwjwnlnX(e)edw ??? (2.2)

在具体实现时,用DFT代替傅里叶变换。类似地,这样得到的将是真实倒谱的混叠形式cp(n),它是真实倒谱的逼近。

对倒谱进行滤波,取出低时间部分(流程图中称为倒谱窗)进行进行逆特征系统处理,可以得到一个平滑的对数谱函数,这个对数谱函数显示了输入语音段的共振峰结构,同时谱的峰值对应于共振峰频率。通过此对数谱进行峰值检测,就可以估计出前几个共振峰的频率和强度。对于浊音的声道特性,可以采用前三个共振峰来描述;清音不具备共振峰特点。

根据倒谱分析过程的方框图画出倒谱分析的matlab编程的流程图。如图2.1所示。 2.LPC谱分析

当给定了一组预测器系数后,将z=e代入H(z),就得到语音产生模型的频率响应,即

jwH(ejw)?G1??aie?jwii?1p?GA(ejw) (2.3)

画出其频率响应特性,可以预料在共振峰频率上会出现峰值。

7

如果利用P个取样值来进行预测,则称为P阶线性预测。可AR模型,则

s(n)是一个P阶的

H(ejw)?S(ejw)22 (2.4)

jwjwH(e)S(e)是语音信号s(n)的傅里叶变换,H(z)式中 是模型的频率响应,可简称为LPC谱;

即信号谱,

S(ejw)2为功率谱。但是事实上,语音信号并非是AR模型,因此,

H(ejw)2只能理解成

S(ejw)2的一个估计。

原始信号 原始信号 汉明窗 求LPC系数 求功率谱 FFT变换 计算振幅 求LPC谱 对数变换 图2.2 LPC谱分析的matlab编程思路图 反FFT变换 高倒谱域部分 低倒谱域部分 峰值检测 倒谱窗 基音周期和FFT变换 清、浊判别 平滑谱 图2.1 倒谱分析的matlab编程流程图 P越大,LPC谱越能反映出语音短时谱的细节部分,但LPC谱的光滑度随之下降。由于我们的目的只是用LPC谱反映声道综合效应的谱的表示式,而具体的谐波形状是通过激励谱来控制的,因此LPC

8

谱只要能够体现出语音的共振峰的结构和谱包络就可以,因此从计算复杂性的角度分析,预测阶数P应该适中。根据LPC谱定义的原理画出LPC谱分析的matlab编程的流程图,如图2.2所示。

三、实验内容和步骤

(1) 分别采集一段浊音和清音语音信号(是你自己说的),采样率为8KHZ,量化精度为16比特线性码;

(2) 分析帧长取为30ms(或10ms~50ms);

(3) 根据语音信号倒谱分析和LPC谱分析的编程流程图(图2.1、图2.2)编制浊音语音信号谱分析的matlab程序,上机调试给出相应波形,并根据图形,观察共振峰情况;

(4) 将语音信号换为清音语音,运行程序,与浊音语音的运行结果进行比较,并得出结论。 (5) 在LPC谱分析中,改变阶数p (p分别等于4、8、12、40)时,观察对谱包络的影响,并与信号谱(DFT谱)进行比较。

说明:倒谱分析有两种方法,一种是根据原理,按照图2.1的流程图,一步步编程实现,另一种方法可以利用matlab里的内部函数进行倒谱分析。下面给出内部函数的使用简介。 cceps

功能:计算复倒谱。 格式:xhat=cceps(x) [xhat,nd]=cceps(x) […]=cceps(x,n)

说明:xhat=cceps(x)返回实信号x的复倒谱,xhat也是实数序列。

[xhat,nd]=cceps(x)在计算复倒谱的同时还辨识出信号延迟的采样点位置nd。 rceps

功能:实倒谱的计算和最小相位重构。 格式: y=rceps(x) [y,ym]=rceps(x)

说明:y=rceps(x)计算信号x的实倒谱y。

[y,ym]=rceps(x)返回信号x的实倒谱y和最小相位重构信号ym。 icceps

9

功能:计算逆复倒谱。 格式:x=icceps(xhat,nd)

说明:x=icceps(xhat,nd)返回复倒谱xhat的逆变换x,nd为所要去除的时间延迟的位置。 lpc

功能:计算lpc系数。 格式:a=lpc(x,n)

说明:a=lpc(x,n)返回x的n阶LPC系数。 功能:计算lpc谱。

格式:p=20*log(abs(freqz(1,-a,length(x))) 说明:a是x的n阶LPC系数。

四、实验报告

1. 简述实验目的和原理。

2. 按实验步骤附上编制的实验程序和运行结果,分析所得到的图形。 3. 将清音语音与浊音语音的运行结果进行比较,写出结论。 4. 总结语音信号倒谱分析和LPC谱分析的特点。 5.收获与建议。

10

实验3 基于DTW算法的孤立字识别

一、实验目的及实验要求

1.了解语音信号处理在语音识别中的应用

2.掌握端点检测的原理,用Matlab编程实现语音信号的端点检测,从原始语音文件中提取有效语音段。

3.掌握采用模板匹配法的孤立字(词)识别系统的工作原理。结合DTW实验系统工具箱,通过编写主程序实现语音识别。

二、实验原理

详见清华大学出版社《Matlab扩展编程》(何英等编著)! 语音识别技术中,对孤立字+

+(词)识别的研究是最早的,也是最成熟的。孤立字识别系统,顾名思义是识别孤立发音的字或词。由于在孤立字识别中字之间有停顿,可使识别问题简化;单字之间的端点检测比较容易;单字之间的协同发音影响较小;一般对单字的发音都比较认真等,所以这种系统存在的问题较少,较容易实现。孤立字(词)识别系统可以用图3.1表示:

语音分析 输入语音 预处理器 训练 参考模式 识别字词 字词候选 后期处理 短时参数提取 模式识别 超音段特征提取 图3.1 孤立字(词)识别系统

首先语音信号经过预处理和语音分析部分变换成语音特征参数。模式识别部分是将输入语音特征参数信息与训练时预存的参考模型(模板)进行比较。由于发音速率的变化,输出测试语音和参考模板间存在着非线性失真,即于参考模式相比输入语音的某些音素变长而另一些音素却缩短,呈现随机变化。根据参考模式是模板还是随机模型,最有效的两种时间规整策略:一是动态时间规整技术(DTW);另一个是马尔可夫模型技术(HMM)。除了发音速率的变化外,相对于参考模式,测试语音还可能出现其

11

他的语音变化。后处理部分主要是运用语言学知识或超音段信息对识别出的候选词或字进行最后的判决。

本实验采用较简单的动态时间规整技术(DTW)来实现孤立字识别。实验的matlab程序由1个主程序和5个子程序或内部函数组成。程序用到了“0.1.2.3.4.5.6.7.8.9”十个语音。

1. 主程序为:DTWglc

图3.2为DTW主程序流程图。由参考模板计算、测试模板计算和识别三部分组成。 2. vad——端点检测程序

端点检测的目的是从包含语音的一段信号中确定出语音的起点和终点。有效的端点检测不仅能使处理时间减到最小,而且能排除无声段的噪声干扰,从而使识别系统具有良好的识别性能。传统的端点检测方法是将语音信号的短时能量与过零率相结合加以判断。

读入语音文件 计算参考模板端点检测x1,x2 利用x1,x2抽取有效语音段 计算原始语音的MFCC参数,保留到矩阵m循环n次计算参考语音模板 读入语音文件 计算测试模板端点检测x1,x2 利用x1,x2抽取有效语音段 计算原始语音的MFCC参数,保留到矩阵m循环n次计算测试语音模板 匹配测试模板和参考模板的距离得到n×n的矩阵 识别循环n2次得到n×n矩阵 循环n次,得出n个识别结果 根据最小距离筛选矩阵元素,输出识别结果 12 图3.2 DTW主程序流程图

图中,n为录制的语音文件数。

设定门限值及相关常量

否 否 语音段够长 是 调整状态值 图3.3端点检测流程图

本端点检测程序应用双门限法,结合过零率和短时能量进行可靠端点检测,其中过零率用于检测清音,短时能量用于检测浊音。在开始进行端点检测之前,首先为短时能量和过零率分别确定两个门限,

13

语音信号幅度归一化 计算过零率 计算短时能量 根据语音信号幅度调整门限 循环n次 语音段结束 选择语音段状态 准语音段 是否超过高门限 是 记录该点值并调整状态值 否 是否超过低门限 调整状态值 否 语音段 调整状态值 否 是否高于低门限 是 静音段够长 是 调整状态值

一个低门限和一个高门限。低门限数值较小,比较容易通过,对信号比较敏感;高门限数值比较大,信号必须达到一定强度,该门限才能被通过。低门限通过未必是语音段开始,可能是时间很短的噪声引起的。高门限超过基本可以确定是语音信号的起点。整个语音信号的端点检测分为四段:静音,过渡段,语音段,结束。程序中使用一个变量status来表示当前所处的状态。在静音段,如果能量或过零率超越了低门限,就应该开始标记起始点,进入过渡段。在过渡段中,由于参数的数值比较小,不能确定是否处于真正的语音段,只要两个门限值都回落到低门限以下,就将当前状态恢复到静音段,如果在过渡段中两个参数中的任意一个超过高门限,就可以确信进入语音段了。

当前状态处于语音段时,如果两个参数的数值降低到低门限以下,而且总的记时长度小于最短时间门限,则认为是一段噪声,继续扫描以后的语音数据,否则,就标记好结束端点,并返回。

端点检测流程图如图3.3所示。

为便于计算机处理,语音文件进入后先进行归一化处理。程序中需要设定六个门限值,如表1所示。

表1 端点检测程序中用到的参量

参量 短时能量高门限 短时能量低门限 过零率高门限 过零率低门限 静音段长度门限 说明 确定进入语音段 确定进入准语音段 确定进入语音段 确定进入准语音段 确定是否为静音段 参量 语音段长度门限 状态变量 语音段长度 静音段长度 说明 确定是否为语音段 记录当前帧状态 记录当前帧语音长 记录当前帧静音长 3. dtw——实现dtw算法的函数

程序中首先申请两个n*m的矩阵D和d,分别为累积距离和帧匹配距离,这里n和m为测试模板与参考模板的帧数。然后,通过一个循环计算两个模板的帧匹配距离矩阵d。接下来进行动态规划,为每个格点(i,j)都计算其三个可能的前续格点的累积距离D1,D2和D3。考虑到边界问题,有些前续格点可能不存在,因此要加入判断条件。最后利用最小值函数min,找到三个前续格点的累积距离的最小值作为累积距离,与当前帧的匹配距离d(i,j)相加,作为当前格点的累积距离。该计算过程一直达到格点(n,m),并将D(n,m)输出,作为模板匹配的结果。 4. mfcc——Mel频率倒谱参数的算法函数

LPC模型是基于发音模型建立的,LPCC(线性预测倒谱系数)也是一种基于合成的参数。这种参数没有充分利用人耳的听觉特性。人的听觉特性是一个非线性系统,它响应不同频率信号的灵敏度是不同

14

的,基本上是一个对数关系。MFCC是在mel 标度频率域提取出来的倒谱参数。mel 标度描述了人耳对频率感知的非线性特性,它与频率的关系可用式(3.1)近似表示:

Mel(f)=1127log(1+f/700) (3.1)

其中f 为频率,单位是Hz。

本实验优先采用MFCC参数作为语音特征参数。本函数计算了MFCC参数和一阶差分参数。 标准的MFCC参数只反映了语音参数的静态特征,而人耳对语音信号的同态特征更为敏感,而这种动态特性通常用差分倒谱参数来描述。

5. melbankm——直接计算语音信号的的MFCC参数

本函数为语音信号工具箱voicebox中提供的函数。 6. enframe——用于语音信号的分帧函数

程序中有关函数的功能说明见表2。 表2:部分函数说明

函数 f=wavread(path) m=mfcc(x) min() disp() sprintf() dist=dtw(t,r) 说明 指定语音文件路径,读出语音文件保存到矩阵f中 x输入语音 mfcc函数求取x的MFCC参数保存到矩阵m中 求取矩阵或向量的最小值 在命令窗口显示字符 把带格式的数字变成字符串 求取t,r的匹配距离 f=enframe(x,len,inc) x输入语音 len帧长 inc帧移 三、实验内容和步骤

1. 运行实验室提供的演示内容,观察输出结果; 2. 在以上基础上,修改程序,识别你自己的声音。 (1)录制语音文件

利用GoldWave或NGwave录音软件录制单字发音语音文件,以wav音频格式保存,共录制两组,一组用于计算参考模板,另一组作为测试模板用于语音识别。

录制语音时,为了能够在主程序中循环读入语音文件,文件名采用数字顺序命名。记录语音文件以及所对应的发音。记于表3中。

另外,录制语音时,注意调整合适的Mic音量,避免语音波形幅度过小,难于同噪声区分开。同时也要避免波形幅度过大,造成波形失真。 (2)调试端点检测程序

15

结合流程图读懂Matlab程序,先单独调试,记录并观察测试结果。

原始语音中检测出起始和终止端点后,用plot( )函数绘制原始语音文件波形图,检测得到的端点之间的语音波形图。对比图形,分析检测结果是否满意。 (3)调试DTW主程序

结合图3.2所示流程图修改和调试Matlab程序,加入DTW实验系统工具箱文件,调试运行程序。 (4)运行和测试系统

先把录制好的声音文件(自己录制的和其他同学录制的)制作成2组声音文件,再准备两个测试音文件。

例如第1组声音文件为10个wav文件,分别保存着同一个人0~9共10个发音;其使用的测试音文件保存着这个人另外发出的0~9中的任意一个发音。如测试音为“7”,检验程序是否能正确判断出与第1组声音中发“7”的文件相匹配。如匹配,则识别正确,反之,错误。可以多做几次。

第2组声音文件为10个wav文件,分别保存着10个人的同一个发音内容(如:“王”);其使用的测试音文件保存着那10个人中其中一个人(姑且称为A)发出的相同内容的发音。检验程序是否能在10个人中找出A。

在Matlab环境下运行程序,记录识别结果。分析识别结果,记于表4中。

表3录制的语音文件列表

录制者 男声1 内容标号 1 2 3 4 男声2 男声3 男声4 男声5 女声1 女声2 女声3 女声4 女声5 表4 语音识别结果

说话人 内容1 统计信息 正确数 错误数 识别率 内容2 内容3 内容4 16

注意:在调试程序时,把不同的语音输入系统后,若程序运行出错,有可能问题在于: [x1,x2]=vad(x); m=mfcc(x); m=m(x1-2:x2-2,:);

该程序先计算原始语音的MFCC参数,然后根据检测到的端点从MFCC参数矩阵中抽取语音段的参数。进行端点检测和求MFCC参数时,都要进行语音信号的分帧,为了保持各自的最佳效果,各自所取的帧长不同。在求MFCC参数时所得到的帧数要比端点检测中的多,出现检测到的端点超出MFCC参数矩阵边界的情况。为避免这种情况的发生,根据经验进行处理:x1-2,x2-2,然而这样的处理并非对于每个说话人都适应,故出现错误。要达到只保留有效语音段的MFCC参数的目的,可以用下边的代码实现: [x1,x2]=vad(x); x=x(x1*80:x2*80,:); m=mfcc(x);

先从原始语音段中截取有效语音段,再计算MFCC参数。

附:DTW主程序代码

disp('正在匹配模板参数.......')

for i=1:n

fname=sprintf('D:\\\\mysounds\\\\%d.wav',i-1); x=wavread(fname); [x1,x2]=vad(x); m=mfcc(x);

m=m(x1-2:x2-2,:); ref(i).mfcc=m; end

disp('正在计算模板的参数....'); for i=1:n

fname=sprintf('D:\\\\mysounds\\\\t%d.wav',i-1); x=wavread(fname); [x1,x2]=vad(x); m=mfcc(x);

m=m(x1-2:x2-2,:); test(i).mfcc=m; end

disp('正在进行模板匹配...') dist=zeros(10,10); for i=1:10 for j=1:10

dist(i,j)=dtw(test(i).mfcc,ref(j).mfcc);

17

end end

disp('正在计算模板匹配结果....') for i=1:10

[d,j]=min(dist(i,:));

fprintf('测试模板%d的识别结果为:%d\\n',i,j);

四、实验报告

1. 简述实验目的和原理。

2. 说明你录制的语音文件及波形。

3. 按实验步骤附上修改编制的实验主程序和运行结果,分析所得到的结果,计算出识别率。 4. 收获与建议。

参 考 文 献

[1] 赵力,语音信号处理,机械工业大学出版社,北京,

[2]张雄伟、陈亮、杨吉斌,现代语音处理技术及应用,北京,2003.8 [3]易克初、田斌、付强,语音信号处理,国防工业出版社,北京,2000.1 [4]姚天任,数字语音处理,华中科技大学出版社,武汉,2002.7 [5]杨行峻、迟惠生,语音信号数字处理,电子工业出版社,北京,1995.2 [6]姚天任、江太辉,数字信号处理,华中理工大学出版社,武汉,1988.6 [7]鲍长春,低比特率数字语音编码基础,北京工业大学出版社,北京,2001.8 [8]王伟,人工神经网络原理,北京航空航天大学出版社,北京,1995.6 [9]陈尚勤、罗承烈、杨雪,近代语音识别,电子科技大学出版社,成都,1991.5

[10]胡航,语音参数分析和提取的研究,华为科技基金项目研究报告,哈尔滨工业大学,2000.3 [11]陈永彬、王仁华,语音信号处理,中国科技大学出版社,合肥,1990.3 [12]阮沈勇等,MATLAB程序设计,电子工业出版社,北京 p1 [13] 胡航,语音信号处理,哈尔滨工业大学出版社,哈尔滨,2002.5 [14]李祖鹏等,一种语音段起止端点检测新方法,电讯技术 2000年第3期 [15]赵文,杨鉴等,孤立字词识别,计算机应用,第21卷2001.6 [16]何英等,Matlab扩展编程,清华大学出版社,北京,p340

[17]刘庆升,徐宵鹏等,一种语音端点检测算法的探究,计算机工程,第29卷第3期

18

[18]刘卫国,陈昭平等,Matlab程序设计与应用,高教出版社,北京,p38

19