天天看点

【信号处理】Matlab实现语音变速变调

1 内容介绍

一种实现声音变速变调的系统,该系统由以下4个部分组成:输入缓存模块,将待处理声音信号数据读入缓存;变调处理模块,对声音信号进行变调处理以改变声音的音调;变速不变调处理模块,对声音信号进行变速不变调处理,以改变语速但音调不变;数据输出模块,把上述变速变调信号输出.变速不变调处理模块包括分割数据模块,采用窗口函数,根据变速系数从原始语音信号中提取出一串信号子系列(即小段声音);和连接数据模块,将这些信号子系列按它们的时间先后顺序连接起来就得到变速不变调信号.

2 部分代码

%

% ct1

clear all,close all, clc;

    % 定义常数

    FL = 80;                % 帧长

    WL = 240;               % 窗长

    P = 10;                 % 预测系数个数

    [s,fs] = wavread('sunday_2.wav');             % 载入语音s

s = s/max(s); %归一化

    L = length(s);          % 读入语音长度

    FN = floor(L/FL)-2;     % 计算帧数

% 预测和重建滤波器

    exc = zeros(L,1);       % 激励信号(预测误差)

    zi_pre = zeros(P,1);    % 预测滤波器的状态

    s_rec = zeros(L,1);     % 重建语音

    zi_rec = zeros(P,1);

% 合成滤波器

    exc_syn = zeros(L,1);   % 合成的激励信号(脉冲串)

    s_syn = zeros(L,1);     % 合成语音

last_syn = 0;   %存储上一个(或多个)段的最后一个脉冲的下标

zi_syn = zeros(P,1);   % 合成滤波器的状态

% 变调不变速滤波器

    exc_syn_t = zeros(L,1);   % 合成的激励信号(脉冲串)

    s_syn_t = zeros(L,1);     % 合成语音

last_syn_t = 0;   %存储上一个(或多个)段的最后一个脉冲的下标

zi_syn_t = zeros(P,1);   % 合成滤波器的状态

% 变速不变调滤波器(假设速度减慢一倍)

v=.5;

    exc_syn_v = zeros(v\L,1);   % 合成的激励信号(脉冲串)

    s_syn_v = zeros(v\L,1);     % 合成语音

last_syn_v = 0;   %存储上一个(或多个)段的最后一个脉冲的下标

zi_syn_v = zeros(P,1);   % 合成滤波器的状态

    hw = hamming(WL);       % 汉明窗

yn1_t,zi_syn_t);

exc_syn_t((n-1)*FL+1:n*FL) =  exc_syn1_t;   %计算得到的合成激励

s_syn_t((n-1)*FL+1:n*FL) = s_syn1_t;   %计算得到的合成语音

last_syn_t = last_syn_t+PT1*floor((n*FL-last_syn_t)/PT1);

    end

    % (6)  s ,exc 和 s_rec 的区别

figure;

subplot(3,1,1), plot(exc), xlabel('n (samples)'), ylabel('Amplitude'), title('激励信号');

subplot(3,1,2), plot(s), xlabel('n (samples)'), ylabel('Amplitude'), title('原语音信号');

subplot(3,1,3), plot(s_rec), xlabel('n (samples)'), ylabel('Amplitude'), title('重建语音信号');

figure;

subplot(3,1,1), plot(exc), xlabel('n (samples)'), ylabel('Amplitude'), title('激励信号'), xlim([15*FL+1,16*FL]);

subplot(3,1,2), plot(s), xlabel('n (samples)'), ylabel('Amplitude'), title('原语音信号'), xlim([15*FL+1,16*FL]);

subplot(3,1,3), plot(s_rec), xlabel('n (samples)'), ylabel('Amplitude'), title('重建语音信号'), xlim([15*FL+1,16*FL]);

sound(exc);

pause(2);

    sound(s);

    pause(2);

sound(s_rec);

pause(2);

%原始语音与合成语音的差别

figure;

subplot(3,1,1), plot(exc_syn), xlabel('n (samples)'), ylabel('Amplitude'), title('合成激励信号');

subplot(3,1,2), plot(s), xlabel('n (samples)'), ylabel('Amplitude'), title('原语音信号');

subplot(3,1,3), plot(s_syn), xlabel('n (samples)'), ylabel('Amplitude'), title('合成语音信号');

sound(s);

    pause(2);

sound(s_syn);

pause(2);

%变速不变调

figure;

subplot(3,1,1), plot(exc_syn_v), xlabel('n (samples)'), ylabel('Amplitude'), title('合成慢速激励信号') ,xlim([0,length(exc_syn_v)]);

subplot(3,1,2), plot(s), xlabel('n (samples)'), ylabel('Amplitude'), title('原语音信号'), xlim([0,length(s)]);

subplot(3,1,3), plot(s_syn_v), xlabel('n (samples)'), ylabel('Amplitude'), title('合成慢速语音信号'), xlim([0,length(s_syn_v)]);

sound(s);

    pause(2);

sound(s_syn_v);

pause(4);

   %变调不变速

figure;

subplot(3,1,1), plot(exc_syn_t), xlabel('n (samples)'), ylabel('Amplitude'), title('合成高调激励信号') ,xlim([0,length(exc_syn_t)]);

subplot(3,1,2), plot(s), xlabel('n (samples)'), ylabel('Amplitude'), title('原语音信号'), xlim([0,length(s)]);

subplot(3,1,3), plot(s_syn_t), xlabel('n (samples)'), ylabel('Amplitude'), title('合成高调语音信号'), xlim([0,length(s_syn_t)]);

sound(s);

    pause(2);

sound(s_syn_t);

3 运行结果

【信号处理】Matlab实现语音变速变调
【信号处理】Matlab实现语音变速变调
【信号处理】Matlab实现语音变速变调

4 参考文献

部分理论引用网络文献,若有侵权联系博主删除。

继续阅读