【语音变速】语音变速变调【含Matlab源码 2110期】

在这里插入图片描述

⛄一、获取代码方式(附实验报告)

获取代码方式1:
完整代码已上传我的资源:【语音变速】基于matlab语音变速变调【含Matlab源码 2110期】
点击上面蓝色字体,直接付费下载,即可。

获取代码方式2:
付费专栏Matlab语音处理(初级版)

备注:
点击上面蓝色字体付费专栏Matlab语音处理(初级版),扫描上面二维码,付费29.9元订阅海神之光博客付费专栏Matlab语音处理(初级版),凭支付凭证,私信博主,可免费获得1份本博客上传CSDN资源代码(有效期为订阅日起,三天内有效);
点击CSDN资源下载链接:1份本博客上传CSDN资源代码

⛄二、部分源代码

%
% ct1
clear all,close all, clc;

% 定义常数
FL = 80;                % 帧长
WL = 240;               % 窗长
P = 10;                 % 预测系数个数
[s,fs] = audioread('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);       % 汉明窗

% 依次处理每帧语音
for n = 3:FN

    % 计算预测系数(不需要掌握)
    s_w = s(n*FL-WL+1:n*FL).*hw;    %汉明窗加权后的语音
    [A E] = lpc(s_w, P);            %用线性预测法计算P个预测系数
                                    % A是预测系数,E会被用来计算合成激励的能量

    if n == 27
    % (3) 观察预测系统的零极点图
        zplane(1,A);
    end
    
    s_f = s((n-1)*FL+1:n*FL);       % 本帧语音,下面就要对它做处理

    % (4) 用filter函数s_f计算激励,注意保持滤波器状态
	[exc1,zi_pre] = filter(A,1,s_f,zi_pre);
    
    exc((n-1)*FL+1:n*FL) = exc1; %计算得到的激励

    % (5) 用filter函数和exc重建语音,注意保持滤波器状态
	[s_rec1,zi_rec] = filter(1,A,exc1,zi_rec);
    
    s_rec((n-1)*FL+1:n*FL) = s_rec1; %计算得到的重建语音

    % 注意下面只有在得到exc后才会计算正确
    s_Pitch = exc(n*FL-222:n*FL);
    PT = findpitch(s_Pitch);    % 计算基音周期PT(不要求掌握)
    G = sqrt(E*PT);           % 计算合成激励的能量G(不要求掌握)

    		
	%方法3:本段激励只能修改本段长度
	tempn_syn = [1:n*FL-last_syn]';
	exc_syn1 = zeros(length(tempn_syn),1);
	exc_syn1(mod(tempn_syn,PT)==0) = G; %某一段算出的脉冲
	exc_syn1 = exc_syn1((n-1)*FL-last_syn+1:n*FL-last_syn);
	[s_syn1,zi_syn] = filter(1,A,exc_syn1,zi_syn);
	exc_syn((n-1)*FL+1:n*FL) =  exc_syn1;   %计算得到的合成激励
	s_syn((n-1)*FL+1:n*FL) = s_syn1;   %计算得到的合成语音
	last_syn = last_syn+PT*floor((n*FL-last_syn)/PT);
	
    % (11) 不改变基音周期和预测系数,将合成激励的长度增加一倍,再作为filter
    % 的输入得到新的合成语音,听一听是不是速度变慢了,但音调没有变。
	FL_v = floor(FL/v);
	tempn_syn_v = [1:n*FL_v-last_syn_v]';
	exc_syn1_v = zeros(length(tempn_syn_v),1);
	exc_syn1_v(mod(tempn_syn_v,PT)==0) = G; %某一段算出的脉冲
	exc_syn1_v = exc_syn1_v((n-1)*FL_v-last_syn_v+1:n*FL_v-last_syn_v);
	[s_syn1_v,zi_syn_v] = filter(1,A,exc_syn1_v,zi_syn_v);		
 	last_syn_v = last_syn_v+PT*floor((n*FL_v-last_syn_v)/PT);   
    exc_syn_v((n-1)*FL_v+1:n*FL_v) =exc_syn1_v;  %计算得到的加长合成激励
    s_syn_v((n-1)*FL_v+1:n*FL_v) = s_syn1_v;   %计算得到的加长合成语音
    
    % (13) 将基音周期减小一半,将共振峰频率增加150Hz,重新合成语音,听听是啥感受~
	PT1 =floor(PT/2);   %减小基音周期
    poles = roots(A);
	deltaOMG = 150*2*pi/8000;
	for p=1:10   %增加共振峰频率,实轴上方的极点逆时针转,下方顺时针转
		if imag(poles(p))>0 poles(p) = poles(p)*exp(j*deltaOMG);
		elseif imag(poles(p))<0 poles(p) = poles(p)*exp(-j*deltaOMG);
		end
	end
	A1=poly(poles);
	if n==27
		figure;
		zplane(1,A1);
	end
	
	tempn_syn_t = [1:n*FL-last_syn_t]';
	exc_syn1_t = zeros(length(tempn_syn_t),1);
	exc_syn1_t(mod(tempn_syn_t,PT1)==0) = G; %某一段算出的脉冲
	exc_syn1_t = exc_syn1_t((n-1)*FL-last_syn_t+1:n*FL-last_syn_t);
	[s_syn1_t,zi_syn_t] = filter(1,A1,exc_syn1_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

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.
[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab领域

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值