当前位置:文档之家› 语音合成实验报告

语音合成实验报告


单位样值响应图像如下:
Impulse Response (impz) 1.5
1
0.5
Amplitude
0
-0.5
-1
-1.5
0
20
40
60
80
100 120 n (smples)
140
160
180
200
频率响应图像如下:
40
Magnitude (dB)
20
0
-20
0
0.1
0.2
0.3 0.4 0.5 0.6 0.7 0.8 Normalized Frequency ( rad/sample)
练习题: 1.2.1 语音预测模型: (1) 给定 e(n) = s(n) –a1s(n-1)-a2s(n-2) 假设 e(n)是输入信号,s(n)是输出信号,上述滤波器的传递函数是什么?如果 a1 = 1.3789, a2 = -0.9506,上述合成模型的共振峰频率是多少?用 zplane,freqz,impz 分别绘 出零极点图,频率响应和单位样值响应。用 filter 绘出单位样值响应,比较和 impz 的是否相同。 答:按照 e(n)的表达式,两边进行 z 变换可得: 1 H(z) = 1−a 1 z −1 −a 2 z −2 当 a1 = 1.3789,a2 = -0.9506 时,利用 tf2zp 函数可以得出 H(z)的极点为:p1 = 0.6895+0.6894i, p2 = 0.6895-0.6894i,因为极点为一对共轭复数,故共振频率有一个, 即为此共轭复数的幅角的绝对值除以相应的系数,通过程序计算可得,共振系数为 f = 999.9447Hz,以下为命令窗的显示: Transfer function: 1 -----------------------------------1 - 1.379 z^-1 + 0.9506 z^-2 Sampling time: unspecified f= 999.9447 实现代码如下: clear all; close all; clc; a1 = 1.3789; a2 = -0.9506; a = [1,-a1,-a2]; b = 1; sys = tf(b,a,[],'Variable','z^-1'), %获取系统的传递函数 n = [0:199]'; [z,p,k] = tf2zp(b,a); f = angle(p(1))/2/pi*8000,
实验二 语音合成
背景知识: 从物理原理来看,语音信号是由肺挤压出的空气激励发声器官振动产生的。说 话时声带相互靠拢但不完全封闭,这样声门变成一条窄缝,当气流通过时其间压力 减小,从而声带完全合拢使气流不能通过;在气流被阻断时压力恢复正常,因而声 带间形成空隙,气流再次通过。这一过程周而复始,就形成了一串周期性的脉冲气 流送入声道。如图 1 所示。这个脉冲串的周期称为“基音周期” ,其倒数是“基音 频率” 。 男性说话时的基音频率在 60-200Hz 范围内, 女性和小孩在 200-450Hz 之间。 以上这种方式发出的音就是浊音。
(2) 阅读 speechproc.m 程序,理解基本流程。程序中已经完成了语音分帧,加窗, 线性预测和基音周期提取等功能。 注意:不要求掌握线性预测和基音周期提取的算法 原理。 答:已完成。 (3)运行该程序到 27 帧时停住,用(1)中的方法观察零极点分布图。 答:程序中实现代码的部分如下: if n == 27 % (3) 在此位置写程序,观察预测系统的零极点图 zplane(A,1); title('零极点分布图'); end 得到的零极点分布图如下:
Amplitude
0
20
40
60
80
100 120 n (samples) Comparison
11 -2 impz filter
Amplitude
0
20
40
60
80
100 120 n (samples)
140
160
180
200
从第 2 幅图可以看出,两个函数绘出的结果完全重合,说明得到的结果相同。
xlabel('n (samples)'); ylabel('Amplitude'); subplot(3,1,3); stem(s_rec/max(s_rec),'Marker','none'); title('signal s_rec'); xlabel('n (samples)'); ylabel('Amplitude'); figure; %绘出三个信号在1000-1200之间的波形 subplot(3,1,1); stem(s(1000:1200)/max(s(1000:1200)),'Marker','none'); title('signal s'); xlabel('n (1000-1200)'); ylabel('Amplitude'); subplot(3,1,2); stem(exc(1000:1200)/max(exc(1000:1200)),'Marker','none'); title('signal exc'); xlabel('n (1000-1200)'); ylabel('Amplitude'); subplot(3,1,3); stem(s_rec(1000:1200)/max(s_rec(1000:1200)),'Marker','none'); title('signal s_rec'); xlabel('n (1000-1200)'); ylabel('Amplitude'); end 试听得到的三段语音中,exc 信号较为模糊,噪声较大,但是能够分辨出讲话的内 容,而重建的语音信号 s_rec 与原来的语音信号 s 几乎没有发现区别,可见此法重 建的效果十分显著,同时通过 plot_task1 我也得到了三个信号的波形,从图像中也 能够直观的看出三个信号的联系与区别。 从图像中可以发现,s_rec 和 s 的波形几乎重合,从而重建后的语音能够如此逼真, 而激励信号 exc 只是保留了 s 的基本特征,如峰值的位置,波长,信息缺失严重, 然而,只要本质的信息保存下来,便不会影响重建语音信号的准确度,因为收发双 方均知道预测系数{ai},使得还原的声音能够高度精确,这样便达到能够节省带宽等 效果。
零极点分布图 1 0.8 0.6 0.4
Imaginary Part
0.2 0 -0.2 -0.4 -0.6 -0.8 -1 -1 -0.5 0 Real Part 0.5 1 10
(4) 在循环中添加程序:对每帧语音信号 s(n)和预测模型系数{ai},用 filter 计算激励 信号 e(n)。注意:在系数变化的情况下连续滤波,需维持滤波器的状态不变,要利 用 filter 的 zi 和 zf 参数。
答:程序中代码实现部分如下: s_f = s((n-1)*FL+1:n*FL);
% 本帧语音,下面就要对它做处理
% (4) 在此位置写程序,用filter函数s_f计算激励,注意保持滤波器状态 [Y_exc,zi_pre] = filter(A,1,s_f,zi_pre); exc((n-1)*FL+1:n*FL) = Y_exc; %将你计算得到的激励写在这里 (5) 完善 speechproc.m 程序,在循环中添加程序:用你计算得到的激励信号 e(n)和 预测模型系数{ai},用 filter 计算重建语音s(n)。同样要注意维持滤波器的状态不变。 答:程序中实现代码部分如下: % (5) 在此位置写程序,用filter函数和exc重建语音,注意保持滤波器状态 exc_f = exc((n-1)*FL+1:n*FL); [Y_rec,zi_rec] = filter(1,A,exc_f,zi_rec); s_rec((n-1)*FL+1:n*FL) = Y_rec; %将你计算得到的重建语音写在这里 (6)在循环结束后添加程序: 用 sound 试听(6)中的 e(n)信号, 比较和 s(n)以及s(n)信号 有何区别。对比画出三个信号,选择一小段,看看有何区别。 答:程序中部分实现代码如下: %画出信号s,exc,s_rec一段的波形 plot_task1(s,exc,s_rec); % (6) 在此位置写程序,听一听 s ,exc 和 s_rec 有何区别,解释这种区别 % 后面听语音的题目也都可以在这里写,不再做特别注明 sound(s/max(s),8000); pause(3); sound(exc/max(exc),8000); pause(3); sound(s_rec/max(s_rec),8000); pause(3); 其中 plot_task1 函数为专门的绘图函数,实现代码如下: function plot_task1(s,exc,s_rec) figure; %绘出三个信号的全时域图 subplot(3,1,1); stem(s/max(s),'Marker','none'); title('signal s'); xlabel('n (samples)'); ylabel('Amplitude'); subplot(3,1,2); stem(exc/max(exc),'Marker','none'); title('signal exc');
图 4 简化的语音生成模型 假设激励信号用 e(n)表示,语音信号用 s(n)表示,根据全极点模型表达式,有: s(n) = N k=1 a k s n − k + Ge(n) 从而我们可以用声管模型对激励信号进行滤波得到语音信号。 我们的分析和合成系统如图 5 所示:
相关主题