天天看點

【信号處理】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 參考文獻

部分理論引用網絡文獻,若有侵權聯系部落客删除。

繼續閱讀