MATLAB变声器
男声变女声matlab程序
exc = zeros(L,1);%激励信号(预测误差)
zi_pre = zeros(P,1);%预测滤波器的状态
s_rec = zeros(L,1);%重建语音
zi_rec = zeros(P,1);
%合成滤波器
exc_syn = zeros(L,1);%合成的激励信号(脉冲串)
PT = findpitch(s_Pitch);%计算基音周期PT
G = sqrt(E*PT);%计算合成激励的能量G
tempn_syn = [1:n*FL-last_syn]';
exc_syn1 = zeros(length(tempn_syn),1);
exc_syn1(mod(tempn_syn,PT)==0) = G;%某一段算出的脉冲
[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;%计算得到的合成语音
%载入声音
[s,fs,nbits] = wavread('222');
%播放原始声音
sound(s,fs,nbits);
FL = 80;%帧长
WL = 240;%窗长
P = 10;%预测系数个数
s = s/max(s);%归一化
L = length(s);%读入语音长度
FN = floor(L/FL)-2;%计算帧数
exc_syn1 = exc_syn1((n-1)*FL-last_syn+1:n*FL-last_syn);
matlab男声变女声课程设计
matlab男声变女声课程设计一、课程目标知识目标:1. 学生能理解声音信号处理的基本原理,掌握声音信号的数字化表示方法。
2. 学生能掌握MATLAB软件中与声音信号处理相关的函数和工具箱的使用方法。
3. 学生能了解声音转换技术的原理,特别是男声变女声的技术实现方法。
技能目标:1. 学生能够运用MATLAB软件进行声音信号的读取、处理和输出。
2. 学生能够独立操作MATLAB软件中的声音信号处理工具箱,实现男声变女声的音效处理。
3. 学生能够通过实践操作,培养解决问题的能力,提高编程技能和动手能力。
情感态度价值观目标:1. 学生在课程学习中,培养对声音信号处理的兴趣,激发探究精神。
2. 学生通过课程实践,学会尊重他人,关注性别平等,培养正确的价值观。
3. 学生在团队合作中,提高沟通与协作能力,培养集体荣誉感和责任感。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程为信息技术类选修课程,旨在提高学生对声音信号处理的了解,锻炼编程实践能力。
2. 学生特点:学生为高中年级,具备一定的计算机操作基础和编程能力,对新鲜事物充满好奇心。
3. 教学要求:结合学生特点,课程设计注重实践操作,以案例教学为主,使学生在动手实践中掌握知识技能,同时注重培养正确的价值观。
将目标分解为具体的学习成果:1. 学生能够独立完成MATLAB软件的安装与配置,掌握基本操作方法。
2. 学生能够运用所学知识,编写程序实现男声变女声的音效处理,并对处理结果进行评价。
3. 学生能够撰写课程报告,总结学习收获,分享实践经验。
4. 学生在课程结束后,能够主动关注声音信号处理领域的发展动态,提高自身综合素质。
二、教学内容1. 声音信号处理基本原理- 声音信号的数字化表示- 声音信号的时域与频域分析2. MATLAB软件基础操作- MATLAB软件的安装与配置- 基本命令与函数的使用3. 声音信号处理工具箱介绍- MATLAB中声音信号处理工具箱的安装与调用- 常用函数及其功能介绍4. 男声变女声技术实现- 声音转换技术的原理与分类- 男声变女声的算法实现及参数调整5. 实践操作与案例解析- 声音信号的读取、处理和输出- 男声变女声音效处理的实际操作步骤- 案例分析与评价6. 课程总结与拓展- 课程报告撰写与分享- 声音信号处理领域的发展动态- 相关拓展阅读资料推荐教学安排与进度:第一课时:介绍声音信号处理基本原理,学习声音信号的数字化表示方法。
MATLAB变声程序代码
% ct1clear 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); % 汉明窗% 依次处理每帧语音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);ends_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% 的输入得到新的合成语音,听一听是不是速度变慢了,但音调没有变。
男声变女声matlab程序
% 载入声音[s,fs,nbits] = wavread('222');%播放原始声音sound(s,fs,nbits);FL = 80; % 帧长WL = 240; % 窗长P = 10; % 预测系数个数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); % 合成滤波器的状态% 变速不变调滤波器(假设速度减慢一倍)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会被用来计算合成激励的能量s_f = s((n-1)*FL+1:n*FL); % 本帧语音,下面就要对它做处理%用filter函数s_f计算激励[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL) = exc1; %计算得到的激励%用filter函数和exc重建语音[s_rec1,zi_rec] = filter(1,A,exc1,zi_rec);s_rec((n-1)*FL+1:n*FL) = s_rec1; %计算得到的重建语音s_Pitch = exc(n*FL-222:n*FL);PT = findpitch(s_Pitch); % 计算基音周期PTG = sqrt(E*PT); % 计算合成激励的能量Gtempn_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);%男声变女声PT1 =floor(PT/2); %减小基音周期poles = roots(A);deltaOMG =150*2*pi/fs;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);endendA1=poly(poles);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%绘图plot(s_syn_t),xlabel('n (samples)'), ...ylabel('Amplitude'), title('变换后语音信号'),...xlim([0,length(s_syn_t)]);%播放改变后的声音sound(2*s_syn_t);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findpitch函数% 计算一段语音的基音周期function PT = findpitch(s)[B, A] = butter(5, 700/4000);s = filter(B,A,s);R = zeros(143,1);for k=1:143R(k) = s(144:223)'*s(144-k:223-k);end[R1,T1] = max(R(80:143));T1 = T1 + 79;R1 = R1/(norm(s(144-T1:223-T1))+1);[R2,T2] = max(R(40:79));T2 = T2 + 39;R2 = R2/(norm(s(144-T2:223-T2))+1);[R3,T3] = max(R(20:39));T3 = T3 + 19;R3 = R3/(norm(s(144-T3:223-T3))+1);Top = T1;Rop = R1;if R2 >= 0.85*RopRop = R2;Top = T2; endif R3 > 0.85*RopRop = R3;Top = T3; endPT = Top;return。
MATLAB变声器
MATLAB变声器电子工程学院摘要语音信号处理中的变声处理已经有了比较成熟的算法,本文阐述了变声算法的基础原理,利用数字滤波器,自相关法,LPC,LPC系数求根法等方法在MATLAB上改变语音信号的基频和共振峰以实现变声,并总结了现有变声算法的缺陷,对用不同的变换域能否改进变声算法做了粗略分析。
关键词:变声算法,LPC,变换域目录研究背景 (3)变声原理 (3)语音基本概念 (3)变声原理 (4)变声过程 (5)分帧处理 (5)计算LPC系数 (5)计算原始激励 (6)计算基音周期 (6)计算激励能量 (7)合成脉冲序列 (7)更改声道参数 (7)合成变声语音 (8)程序设计 (8)传统变声算法缺陷 (9)合成激励与原始激励差别较大 (9)不能实现定向变声 (10)实现定向变声的猜想 (11)小波域是否存在恒定音色参数粗略分析 (11)统计上的变换是否利于寻找恒定音色参数猜想 (11)下一步研究计划 (12)研究背景语音信号是人们日常生活中十分常见的信号,语音也是人与人之间传递信息的一种十分重要的方式。
随着智能终端以及互联网的普及,语音信号大量地以数字形式出现,语音信号处理变得越来越重要,变声处理是语音信号处理的基础之一,所以在这样的大背景下,研究变声算法并改进变声算法是很有意义而且有必要的。
另一方面,传统的变声算法是对发声过程的简单模拟进行语音合成,在模拟过程中改变参数以实现变声,而传统的变声算法存在一些缺陷,若要改进变声算法使其更灵活有效,那么细致的研究传统的变声算法是很有必要的。
变声原理语音基本概念1. 声道:声道是很多动物及人类都有的一个腔室,从声源产生的声音经由此处滤出。
人的声道包括声道则包括喉腔、咽头、口腔和鼻腔。
2. 基音:一般的声音都是由发音体发出的一系列频率、振幅各不相同的振动复合而成的。
这些振动中有一个频率最低的振动,由它发出的音就是基音,其余为泛音。
发音体整体振动产生的音,叫做基音,决定音高;发音体部分振动产生的音,叫做泛音,决定音色;基音和泛音结合一起而形成的音,叫做复合音,日常我们所听到的声音多为复合音。
基于matlab的变声器设计与实现
文章主题:基于MATLAB的变声器设计与实现在音乐和语音处理领域,变声器是一种常见的设备,它可以改变声音的音调和音色,为音乐创作和语音处理带来了更多的可能性。
在本文中,我们将探讨基于MATLAB的变声器设计与实现,从原理到具体实现,为读者带来深入了解和实践指导。
一、变声器的原理和应用变声器是一种可以改变声音频率和谐波结构的设备,它在音乐创作、电子音乐制作以及语音处理中有着广泛的应用。
通过改变声音的音调和音色,变声器可以为音频增加特殊效果,为音乐创作和语音处理带来更多可能性。
二、MATLAB在音频处理中的应用MATLAB作为一种强大的科学计算软件,拥有丰富的音频处理工具和函数库,可以方便地进行音频数据处理和分析。
在音频处理中,MATLAB可以实现音频的读取、录制、分析、处理和合成,为音频处理带来了极大的便利。
三、基于MATLAB的变声器设计1. 我们需要了解音频信号的基本特性,包括音频信号的采样和量化过程,以及MATLAB中的音频数据表示方式。
2. 我们需要设计变声器的算法,包括音频信号的频率变换、时域变换和谐波结构的改变。
3. 接下来,我们可以使用MATLAB编写变声器的代码,包括音频信号的读取、处理和输出,以及界面设计和交互操作。
4. 我们还可以对设计好的变声器进行优化和测试,以确保其性能和效果达到预期的要求。
四、实现和应用通过上述步骤,我们可以在MATLAB中成功设计并实现一个变声器,可以对音频进行实时处理和效果展示。
在使用过程中,我们还可以根据具体音频的特点和需求,调整变声器的参数和效果,以获得更加理想的音频处理效果。
五、个人观点和总结基于MATLAB的变声器设计与实现,不仅可以帮助我们更好地理解音频处理的原理和方法,还可以为音乐创作和语音处理带来更多的可能性。
通过学习和实践,我们可以更深入地了解音频处理的相关知识,并掌握MATLAB在音频处理领域的应用技巧,为自己的学习和工作增添新的动力和乐趣。
基于MATLAB GUI的变声器设计与实现
1 关于MATLAB 和 GUI 的概念和含义分析1.1 关于MATLAB 的概述MATLAB 是两个词组组合而成的,这两词组分别是matrix 和laboratory。
其用汉语可以翻译成为矩形实验室或者矩形工厂。
其原理或者功能是,MATLAB 能够将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,这便为我国的科学研究、工程设计以及必须进行有效数值计算的众多科学领域带来了一场全新的变革,其成功为这些科学领域提供了一种全面且科学的解决方案,并且成功突破了传统非交互式程序设计语言(如C、Fortran)编辑模式的局限性。
总而言之,MATLAB 是能够在一定程度上作为代表当今国际科学计算软件水平的一个重要产物。
1.2 关于 GUI 的概述关于 GUI,其英文全称为Graphical User Interface。
为了应用方便,都习惯性使用其简称—— GUI。
GUI 用汉语翻译称为人机交互图形用户界面设计。
从理论层面来进行解释,其主要指的是采用图形方式显示的计算机操作用户界面。
GUI 和传统意义上所使用的计算机命令界面相比较,其最大的一个优势或者特点便是其所具备的图形界面。
但从视觉上来分析,图形界面要比命令界面更具有可接受性,更能够吸引住大众的目光。
2 基于MATLAB GUI 的变声器设计为了实现变声的目的,从男声变女声、女声变男声、老人变童声等需要在分析语音信号参数的过程当中适时采用短时自相关法提取语音信号的基音周期。
与此同时,也会应用到LPC 即倒谱分析法分析共振峰的范围,然后再通过MATLAB 编写程序来对语音参数进行修改,进而使其更加接近想要的声音的范围,构置GUI 界面。
2.1 关于变声原理分析一般情况下,在进行性别变声的过程中,我们需要考虑的因素主要包括几个方面,诸如基音的周期、基音的频率、共振峰的频率等等,其主要变化诸如以上几个因素的频率来实现声音的转变。
MATLAB 变音文档
《数字信号处理B》课程项目实施报告题目:数字音效处理器组号: 91任课教师: 方勇组长: 11123701 马骁成员:11123802 梅烜玮成员: 11120989 毛顺亿成员: 11120991 程佳静成员: 11123627 肖淞联系方式:二零一三年10月19日摘要:本论文介绍了在matlab平台下的数字音效处理的实现。
主要使用了matlab中的GUI、FDAtools、audio函数、fft函数、filter函数等制作了图形用户界面、声音的采集和播放、信号在时域和频率的多种处理、滤波器的制作和应用。
通过对声音的时域和频域分析,利用梳状滤波器、IIR2阶滤波器、信号加权线性叠加算法、频域差值算法等理论工具最后实现出对声音的均衡、变声、回声和混音的音效处理。
关键字:数字音效处理、滤波器、matlab目录项目分工 (2)摘要 (3)目录 (4)一、课程项目实施方案 (5)数字音效处理器概述 (5)1.2 设计平台Matlab简介 (5)设计思想 (5)功能指标 (5)1.5 功能原理概述 (5)回声简介 (5)1.5.2 混音音效简介 (6)1.5.3 男女变声简介 (6)1.5.4 均衡器简介 (7)二、系统设计及可行性分析 (7)2.1 系统综述 (7)音频的采集与播放 (8)去噪数字滤波器的设计 (8)音效算法以及理论分析 (11)2.4.1 回音的实现方法和理论分析 (11)混音实现方法和理论分析 (13)2.4.3 男女变声实现方法和理论分析 (13)均衡器 (20)2.4.5 GUI设计 (21)三、系统性能与结果分析 (22)3.1 算法性能和结果分析 (22)3.1.1 回音音效处理 (22)3.1.2 混音音效处理 (25)3.1.3男女变声 (25)3.1.4均衡器 (27)对项目进行所遇到的问题的分析和解决 (30)问题 (30)3.2.2 理论分析问题 (30)参考文献 (32)附录1 组员心得 (33)附录2源程序 (35)一、课程项目实施方案数字音效处理器概述数字音效处理器,是用数字音频信号处理技术来提升和达到各种声音效果的电子装置或者音频变换系统,包括均衡器(EQ)、数字混响器、立体声、特殊音效器等。
基于MATLAB算法的数字变声器
基于M A T L A B算法的数字变声器Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】基于MATLAB算法的数字变声器【摘要】变声器的原理是通过改变输入声音频率,进行改变声音的音色、音调,使输出声音在感官上与原声音不同。
变声器是借助对声音音色和音调的双重复合改变,实现输出声音的改变。
通过自己发声,共振峰频率的改变是基于重采样实现的。
同时用LPC倒谱分析法分析共振峰的范围,通过MATLAB编写程序并构置GUI界面。
实验中通过MATLAB软件对采集来的语言信号进行频谱分析,讨论不同人之间的噪音源参数和共振峰参数,通过对不同人语言信号频率和幅度的改变来实现不同人之间的语音转换。
【关键词】短时自相关法; LPC倒谱;语音信号; matlab GUI;1引言随着生活水平的提高,科技的不断进步,很多人为了娱乐,从而希望改变自己的声音;还有如今的许多的访问节目为了保护被访问者,都对声音进行了相应的处理。
本设计通过编写matlab程序,借助对声音音色和音调的双重复合改变,实现输出声音的改变。
共振峰频率的改变是基于重采样实现的,从重采样原理知道,这也同时印发了基频的变化,为保证基频变化和共振峰频率变化的独立、互不相关,在基频移动时必须考虑抵消重采样带来的偏移,理论上只要基频检测足够精确,确实可以保证基频改变和共振峰频率改变间的互不相关。
保证变声效果的自然度主要是没有采用基因检测将基因移动和共振峰变化彻底隔离的缘故。
本次课程设计就是运用我们所学到的理论知识,用MATLAB软件来实现对语音信号的变声处理,理论联系实际,从而更好地掌握以及运用所学习的知识。
2数字变声器的原理与算法基本原理语音科学家将人类发声过程视作一个由声门源输送的气流经以声道、口、鼻腔组成的滤波器调制而成的。
人类语音可分为有声语音和无声语音,前者是由声带振动激励的脉冲信号经声腔调制变成不同的音,它是人类语言中元音的基础,声带振动的频率称为基频。
语音信号变调处理matlab
语音信号变调处理在数字信号处理领域有着广泛的应用,它可以用于音乐制作、语音合成、变声器等方面。
在本文中,我将介绍如何使用MATLAB来进行语音信号的变调处理,包括信号的采样和重放、信号的频谱分析以及频率域的信号处理等内容。
一、信号的采样和重放在进行语音信号的变调处理之前,我们首先需要对语音信号进行采样和重放。
MATLAB提供了丰富的信号处理工具箱,可以很方便地实现信号的采样和重放操作。
以下是一个简单的MATLAB代码示例:```MATLAB读取语音文件[x, fs] = audioread('input.wav');播放语音信号soundsc(x, fs);```在上面的代码中,我们首先使用audioread函数读取了一个名为input.wav的语音文件,并将其存储在变量x中。
我们使用soundsc函数对语音信号进行了重放操作,其中fs表示了语音信号的采样频率。
二、信号的频谱分析对语音信号进行频谱分析是进行语音信号变调处理的重要步骤之一。
通过频谱分析,我们可以了解语音信号的频率成分,并作出相应的处理。
MATLAB中有许多用于频谱分析的函数和工具,比如fft函数、spectrogram函数等。
以下是一个简单的频谱分析MATLAB代码示例:```MATLAB计算语音信号的FFTX = fft(x);绘制语音信号的频谱图f = (0:length(X)-1)*fs/length(X);plot(f, abs(X));xlabel('频率/Hz');ylabel('幅度');```在上面的代码中,我们使用了fft函数对语音信号进行了傅里叶变换,得到了语音信号的频谱。
我们使用plot函数绘制了语音信号的频谱图,并通过设置坐标轴标签使得图像更加直观和易读。
三、频率域的信号处理频率域的信号处理是进行语音信号变调处理的核心步骤之一。
在MATLAB中,我们可以利用频谱的特性对语音信号进行频率域的处理,比如频率的平移、缩放、滤波等。
matlab变声器课程设计
matlab变声器课程设计一、课程目标知识目标:1. 理解Matlab编程基础,掌握其音频处理功能;2. 学习并掌握数字信号处理中音频变声的基本原理;3. 了解不同声音变换技术的应用场景及其效果。
技能目标:1. 能够使用Matlab编写简单的音频读取、播放程序;2. 能够运用Matlab进行音频信号的时域、频域分析;3. 能够独立设计并实现基础的变声器程序,完成声音的变调、变速等效果。
情感态度价值观目标:1. 培养学生对音频信号处理的兴趣,激发其探索精神;2. 增强学生团队协作意识,提高沟通与表达能力;3. 引导学生正确看待变声技术,培养其遵守网络道德和法律法规的意识。
课程性质:本课程为实践性较强的选修课程,结合Matlab软件与数字信号处理理论,旨在提高学生的实际操作能力和创新能力。
学生特点:学生具备一定的编程基础,对新鲜事物充满好奇,喜欢动手实践。
教学要求:注重理论与实践相结合,鼓励学生自主探究,关注学生个体差异,提供个性化指导。
通过课程学习,使学生能够将所学知识应用于实际问题解决中,提高其综合素质。
二、教学内容1. Matlab编程基础:- 变量、数据类型及运算符;- 程序控制结构;- 函数编写与调用。
2. 音频处理基本理论:- 音频信号的数字化;- 音频信号的时域和频域分析;- 变声技术原理。
3. Matlab音频处理工具箱:- 音频文件的读取与播放;- 音频信号的编辑与处理;- 音频效果器的应用。
4. 变声器设计与实现:- 变调技术;- 变速技术;- 声音特效添加。
教学内容安排与进度:第一周:Matlab编程基础及音频处理基本理论;第二周:音频处理工具箱的使用方法;第三周:变声器设计原理及实例分析;第四周:学生动手实践,完成变声器设计与实现;第五周:成果展示与评价。
教材章节及内容:第一章:Matlab编程基础;第二章:数字信号处理基础;第三章:音频信号处理;第四章:Matlab音频处理工具箱;第五章:音频变声器设计与实现案例。
matlab女声变男声程序
matlab女声变男声程序返回列表发新帖回复查看: 823|回复: 3|关注: 0打印上一主题下一主题 [未答复] MATLAB做女生变男声的程序 [复制链接] hoaei新手5 麦片财富积分0502主题5帖子最佳答案发消息电梯直达跳转到指定楼层 1#2013-10-17 19:32:12 | 只看该作者回帖奖励发表于我在做一个女声变男声的程序想法是将女生的音谱向左压缩7/8,使得基频也随之改变,变成女声基频的7/8,最后是有男声的声音,但是男声似乎被截掉了一些语音信号。
比如女生原话是(“请问你是谁啊”),可男声却是(“请问你是谁”),(“啊”)没有了,同时处理后的男声语音文件播放时,还隐约能听到一些女声的声音。
以下是代码:<blockquote>%变声2复制代码其中qu_wan_ting是原始音频文件,参看附件,pinpuyasuo是一个子函数,可以对一个矩阵进行线性压缩,若a=[1 2 3 4 5 6], 如果压缩比为3:6,压缩后a=[2 4 6]; 压缩比若为4:6,则a=[1.5 3 4.5 6],不过由于这是对经过fft的频谱进行压缩的,所以这个函数还是左右对称压缩的。
以下是压缩函数代码:%频谱压缩function [hw2,num]=pinpuyasuo(hw,kn,km)N=length(hw);hw2=hw;for i=1:N/2n=fix(i*km/kn);xiaoshu=(i*km/kn-n);if(n>N/2)break;endtryhw2(i)=hw(n)*(1-xiaoshu)+hw(n+1)*xiaoshu;catchhw2(i)=hw(n)*(1-xiaoshu); endhw2(N-i+1)=hw(N-n+1)*(1-xiaoshu)+hw(N-n)*xiaoshu; endnum=i;end复制代码qu_wan_ting.mat193.23 KB, 下载次数: 47 原始女声音频文件分享到:女声变男声不知道为什么代码不见了,补发一下 %变声2clear allload qu_wan_ting;[m,n]=size(y1);%y1是音频文件t=1:m;N=2^ceil(log2(m));fs=11025;hw=fft(y1,N);HW=abs(hw);W=(0:N-1)*fs/N;figure(1);subplot(211);plot(W,HW);title('1')axis([0,fs,0,20]);[hw2,num]=pinpuyasuo(hw,17,22);%hw2(num/2:N-num/2+1)=hw2(num/2:N-num/2+1)*0; subplot(212);plot(W,abs(hw2));axis([0,fs,0,20]);y2=ifft(hw2);y2=real(y2);%./abs(real(y2)).*abs(y2);y2=y2(1:max(t)); y2=guiyihua(y2)/2;figure(10);subplot(211); y1=guiyihua(y1)/2; plot(t,y1); subplot(212); plot(t,y2);wavplay(y2,fs); 复制代码回复此楼支持举报探索者~新手6 麦片财富积分0502主题23帖子最佳答案发消息3#发表于 2013-12-9 17:23:51 | 只看该作者你是想问什么,你的变声代码第28行“y2=guiyihua(y2)/2;”,"guiyihua"是什么,回复此楼支持举报 qsj8362234入门141 麦片财富积分5050021主题1004帖子31最佳答案QQ发消息关注者: 14#发表于 2013-12-9 17:47:52 | 只看该作者'阿'是单音信号吧,可以单独看看这个音的频谱。
男声变女声matlab程序
% 载入声音[s,fs,nbits] = wavread('222');%播放原始声音sound(s,fs,nbits);FL = 80; % 帧长WL = 240; % 窗长P = 10; % 预测系数个数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); % 合成滤波器的状态% 变速不变调滤波器(假设速度减慢一倍)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会被用来计算合成激励的能量s_f = s((n-1)*FL+1:n*FL); % 本帧语音,下面就要对它做处理%用filter函数s_f计算激励[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc((n-1)*FL+1:n*FL) = exc1; %计算得到的激励%用filter函数和exc重建语音[s_rec1,zi_rec] = filter(1,A,exc1,zi_rec);s_rec((n-1)*FL+1:n*FL) = s_rec1; %计算得到的重建语音s_Pitch = exc(n*FL-222:n*FL);PT = findpitch(s_Pitch); % 计算基音周期PTG = sqrt(E*PT); % 计算合成激励的能量Gtempn_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);%男声变女声PT1 =floor(PT/2); %减小基音周期poles = roots(A);deltaOMG =150*2*pi/fs;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);endendA1=poly(poles);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%绘图plot(s_syn_t),xlabel('n (samples)'), ...ylabel('Amplitude'), title('变换后语音信号'),...xlim([0,length(s_syn_t)]);%播放改变后的声音sound(2*s_syn_t);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findpitch函数% 计算一段语音的基音周期function PT = findpitch(s)[B, A] = butter(5, 700/4000);s = filter(B,A,s);R = zeros(143,1);for k=1:143R(k) = s(144:223)'*s(144-k:223-k); end[R1,T1] = max(R(80:143));T1 = T1 + 79;R1 = R1/(norm(s(144-T1:223-T1))+1); [R2,T2] = max(R(40:79));T2 = T2 + 39;R2 = R2/(norm(s(144-T2:223-T2))+1); [R3,T3] = max(R(20:39));T3 = T3 + 19;R3 = R3/(norm(s(144-T3:223-T3))+1); Top = T1;Rop = R1;if R2 >= *RopRop = R2;Top = T2;endif R3 > *RopRop = R3;Top = T3;endPT = Top;return。
数字信号处置——matlab变声器
数字信号处置——matlab变声器2021-07-09 07:44:20| 分类:| 标签:|举报|字号大中小定阅成效不行。
项目目标:把自己(男)的声音别离变成小孩的声音、女人的声音和老人的声音。
变声原理:语音科学家将人类发声进程视作一个由声门源输送的气流经以声道、口、鼻腔组成的滤波器调制而成的。
人类语音可分为有声语音和无声语音,前者是由声带振动鼓励的脉冲信号经声声调制变成不同的音,它是人类语言中元音的基础,声带振动的频率称为基频。
无声语音那么是声带维持开启状态,禁止振动引发的。
一样来讲,由声门振动决定的基频跟说话人的性别特点有关,如下表,而无声语音那么没有表现那个特点。
说话人的个性化音色和语音的另外一个声学参数——共振峰频率的散布有关。
儿童由于声道短,其共振峰频率高于成年人,成年女性的声道一样短于成年男性,因此女性的共振峰频率一样高于男性。
由上可知,在进行性别变声时,要紧考虑基频和共振峰频率的转变。
当基频伸展,共振峰频率也同时伸展时,可由男声变成女声,女声变成童声;反之,基频收缩,共振峰频率也同时收缩时,那么由童声变女声,女声变男声。
为了取得自然度、真实感较好的变声成效,基频和共振峰频率通常必需各自独立地伸缩转变如以下图:共振峰频率的改变是基于重采样实现的,从重采样原理明白,这也同时引发了基频的转变,为保证基频转变和共振峰频率转变的独立、互不相关,在基频移动时必需考虑抵消重采样带来的偏移,理论上只要基频检测足够精准,确实能够保证基频改变和共振峰频率改变间的互不相关。
设计方案:1录入自己(小孩、女人、老人)的一段声音2用MATLAB做fft取得其频谱3做fft频谱分析4搬移和改变基频、语速,实现变声%读取语音信号[s fs nbits] = wavread('f:\data\');s=s/max(s); %归一化%sound(s,fs)L = length(s) % 读入语音长度S=fft(s,L);%画图:原始信号figure(1)subplot(2,1,1);plot(s);title('原语音信号波形'); subplot(2,1,2);plot(abs(S));title('原语音信号频谱');%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%下面变声会用到的,没有的话变声可不能成功的,自己单独保留为m函数文件,上面的程序要挪用的% 计算一段语音的基音周期function PT = findpitch(s)[B, A] = butter(5, 700/4000);s = filter(B,A,s);R = zeros(143,1);for k=1:143R(k) = s(144:223)'*s(144-k:223-k);end[R1,T1] = max(R(80:143));T1 = T1 + 79;R1 = R1/(norm(s(144-T1:223-T1))+1);[R2,T2] = max(R(40:79));T2 = T2 + 39;R2 = R2/(norm(s(144-T2:223-T2))+1);[R3,T3] = max(R(20:39));T3 = T3 + 19;R3 = R3/(norm(s(144-T3:223-T3))+1);Top = T1;Rop = R1;if R2 >= *RopRop = R2;Top = T2;endif R3 > *RopRop = R3;Top = T3;endPT = Top;return以下是整理的变声的完整程序:[s,fs,nbits] = wavread(‘’); % 载入语音sFL = 80; % 帧长WL = 240; % 窗长P = 10; % 预测系数个数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); % 合成滤波器的状态% 变速不变调滤波器(假设速度减慢一倍)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会被用来计算合成鼓励的能量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); % 计算基音周期PTG = sqrt(E*PT); % 计算合成鼓励的能量G%本段鼓励只能修改本段长度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);% (13) 将基音周期减小一半,将共振峰频率增加150Hz,从头合成语音(男声变女声)PT1 =floor(PT/2); %减小基音周期poles = roots(A);deltaOMG =150*2*pi/fs;%下面为女声变男声,要用的话把上面一段换成以下三行% PT1 =floor(2*PT);% poles = roots(A);% deltaOMG =*2*pi/fs;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);endendA1=poly(poles);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%这是画图的,自己改plot(s_syn_t),xlabel('n (samples)'), ...ylabel('Amplitude'), title('变换后语音信号'),...xlim([0,length(s_syn_t)]);%=s_syn_t; %要保留数据就把改成自己的% guidata(hObject,handles);sound(2*s_syn_t);%播放改变后的声音%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%下面变声会用到的,没有的话变声可不能成功的,自己单独保留为m函数文件,上面的程序要挪用的% 计算一段语音的基音周期function PT = findpitch(s)[B, A] = butter(5, 700/4000);s = filter(B,A,s);R = zeros(143,1);for k=1:143R(k) = s(144:223)'*s(144-k:223-k); end[R1,T1] = max(R(80:143));T1 = T1 + 79;R1 = R1/(norm(s(144-T1:223-T1))+1); [R2,T2] = max(R(40:79));T2 = T2 + 39;R2 = R2/(norm(s(144-T2:223-T2))+1); [R3,T3] = max(R(20:39));T3 = T3 + 19;R3 = R3/(norm(s(144-T3:223-T3))+1); Top = T1;Rop = R1;if R2 >= *RopRop = R2;Top = T2; endif R3 > *RopRop = R3;Top = T3; endPT = Top; returnrefer:1.。
变声器设计方案
MATLAB变声器的设计前言随着生活水平的提高,科技的不断进步,很多人为了娱乐,从而希望改变自己的声音;还有如今的许多的访问节目为了保护被访问者,都对声音进行了相应的处理。
本设计通过编写MATLAB程序,修改相关声音参数,使其频率发生相应的变化,在输出时达到变声。
1 变声原理在进行性别变声时,主要考虑基音周期、基频和共振峰频率的变化。
其中男生、女生和和童声的基频、共振峰的关系如图1所示;基音周期改变时,基频、共振峰同时变化,若伸展既有男变女、女变童,反之亦可。
本实验是基于男生录制的声音进行相关参数提取,修改接近图12 提取参数基于短时自相关法的基音周期估值进行自相关的计算,通过MATLAB编程采用自相关算法可以实现基音周期的估值,即对语音信号进行低通滤波,然后进行自相关计算。
在低通滤波时,采用巴特沃斯滤波器。
2.1.1 构建巴特沃斯低通滤波器根据人的说话特征设定相应指标参数,对本段语音设计算出巴特沃斯模拟滤波器的阶数N 为5,3dB截止频率,算出0.175,归一化低通原型系统函数为其中,,.将将带人中,得到低通滤波器,根据设定的滤波器编写MATLAB程序,当信号经过低通滤波器后,对原始信号滤波产生结果如图2所示,低通滤波后,保留基音频率,然后再用2kHz采样频率进行采样,采样序列为x(n),后进行下一步的自相关计算。
图22.1.2语音信号的短时自相关函数定义语音信号的自相关函数如下:其中k为信号延迟点数;为语音信号;N为语音帧长度。
经过低通滤波之后,取160个样点数,帧长取10ms,对每帧语音求短时自相关,取得自相关最大点数,自相关函数在基音周期处表现为峰值,这些峰值点之间的间隔的平均值就是基音周期,从而估计出基音周期,但是由于图中存在野点,编写MATLAB程序除去野点算出对应基音周期如图3所示,设基音周期值为PT,调动PT,接近女声,设新的为PT1;图32.2 LPC倒谱法提取共振峰通过线性预测分析得到合成滤波器的系统函数为:H(z)=其中h(n)为冲击响应,为预测系数。
基于MATLAB GUI的变声器设计与实现
基于MATLAB GUI的变声器设计与实现
孟若兰;刘艳丽;陈锦苗;李昊天;王琪瑶
【期刊名称】《电子测试》
【年(卷),期】2018(000)017
【摘要】现阶段计算机在我国信号处理领域中的应用范围已经越来越广泛,基于MATLAB GUI的变声器设计便是当前专业领域最受关注的一个焦点问题,本文将对此议题进行深入的分析与探究.
【总页数】2页(P19-20)
【作者】孟若兰;刘艳丽;陈锦苗;李昊天;王琪瑶
【作者单位】承德医学院生物医学工程系,河北承德,067000;承德医学院生物医学工程系,河北承德,067000;承德医学院生物医学工程系,河北承德,067000;承德医学院生物医学工程系,河北承德,067000;承德医学院生物医学工程系,河北承
德,067000
【正文语种】中文
【相关文献】
1.基于MATLAB GUI的数字滤波器设计与实现 [J], 韩芝侠;王强;脱慧
2.基于MATLAB GUI图像处理系统的设计与实现 [J], 厉俊
3.基于MATLAB GUI图像处理系统的设计与实现 [J], 厉俊
4.基于Matlab GUI的计算方法实验系统设计与实现 [J], 王际朝;张健;阮宗利
5.基于MATLAB/GUI的光伏电池工程用数学模型仿真系统的设计与实现 [J], 吴春芳
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB变声器电子工程学院摘要语音信号处理中的变声处理已经有了比较成熟的算法,本文阐述了变声算法的基础原理,利用数字滤波器,自相关法,LPC,LPC系数求根法等方法在MATLAB上改变语音信号的基频和共振峰以实现变声,并总结了现有变声算法的缺陷,对用不同的变换域能否改进变声算法做了粗略分析。
关键词:变声算法,LPC,变换域目录研究背景 (3)变声原理 (3)语音基本概念 (3)变声原理 (4)变声过程 (5)分帧处理 (5)计算LPC系数 (5)计算原始激励 (6)计算基音周期 (6)计算激励能量 (7)合成脉冲序列 (7)更改声道参数 (7)合成变声语音 (8)程序设计 (8)传统变声算法缺陷 (9)合成激励与原始激励差别较大 (9)不能实现定向变声 (10)实现定向变声的猜想 (11)小波域是否存在恒定音色参数粗略分析 (11)统计上的变换是否利于寻找恒定音色参数猜想 (11)下一步研究计划 (12)研究背景语音信号是人们日常生活中十分常见的信号,语音也是人与人之间传递信息的一种十分重要的方式。
随着智能终端以及互联网的普及,语音信号大量地以数字形式出现,语音信号处理变得越来越重要,变声处理是语音信号处理的基础之一,所以在这样的大背景下,研究变声算法并改进变声算法是很有意义而且有必要的。
另一方面,传统的变声算法是对发声过程的简单模拟进行语音合成,在模拟过程中改变参数以实现变声,而传统的变声算法存在一些缺陷,若要改进变声算法使其更灵活有效,那么细致的研究传统的变声算法是很有必要的。
变声原理语音基本概念1. 声道:声道是很多动物及人类都有的一个腔室,从声源产生的声音经由此处滤出。
人的声道包括声道则包括喉腔、咽头、口腔和鼻腔。
2. 基音:一般的声音都是由发音体发出的一系列频率、振幅各不相同的振动复合而成的。
这些振动中有一个频率最低的振动,由它发出的音就是基音,其余为泛音。
发音体整体振动产生的音,叫做基音,决定音高;发音体部分振动产生的音,叫做泛音,决定音色;基音和泛音结合一起而形成的音,叫做复合音,日常我们所听到的声音多为复合音。
3.共振峰:共振峰是指在声音的频谱中能量相对集中的一些区域,共振峰是语音音质的决定因素,反映了声道(共振腔)的物理特征。
声音在经过共振腔时,受到腔体的滤波作用,使得频域中不同频率的能量重新分配,一部分因为共振腔的共振作用得到强化,另一部分则受到衰减,得到强化的那些频率在时频分析的语图上表现为浓重的黑色条纹。
由于能量分布不均匀,强的部分犹如山峰一般,故而称之为共振峰。
在语音声学中,共振峰决定着元音的音质,在计算机音乐中,共振峰是决定音色和音质的重要参数。
4,短时平稳特性:语音信号是一种随时间而变化的信号,主要分为浊音和清音两大类。
浊音的基音周期、清浊音信号幅度和声道参数等都随时间而缓缓变化。
由于发生器官的惯性运动,可以认为在一小段时间里(一般为10~30ms)语音信号的频域特性近似不变,即语音信号具有短时平稳性。
因而处理语音信号之前要把语音信号分为一些短段(称为分析帧),然后再来进行处理。
人声和乐器声的产生需要两个阶段,一个是发声系统,如人的声带或乐器的振动簧片,另一个是共鸣系统。
乐器不同的共鸣系统使其在一定频域中的语音信号的振幅得以突出,这样,这些区域就产生了这个乐器所特有的共振峰值,这些共振峰值同共鸣体的大小、形状的材料密切相关。
由于乐器的结构是稳定的,因此在乐器发出的所有音调中,不论基频如何,都会表现出相同的共振峰值,只不过其显著性有强有弱罢了。
这就可以解释为什么同一乐器所发出的不同音调具有相同的音质。
在语音声学中,人声也同样受自身生理如鼻孔、咽腔、口腔大小的影响有自身的共振峰区。
人在说话的过程中,正是通过利用这些共鸣空间的形状和大小不同的变化(例如改变嘴形),以能改变声音的共振峰说出不同的元音。
我们之所以能够区分不同的人声、元音,主要也是依靠它们的共振峰分布的位置。
简单来讲不同的人说同一句话的共振峰不同,同一个人说不通的话共振峰也不同。
变声原理变声是通过改变人声的基音频率和共振分分布以达到变声的目的,其具体过程是是模拟人声的发声过程,以脉冲信号代替声带振动,以FIR滤波器代替声道,用脉冲信号通过FIR滤波器进行语音合成。
首先对原始语音信号进行分解,然后得出原始激励参数(基音周期和激励能量)和声道参数(共振峰分布),用得出的参数构建激励和滤波器,再根据变声需要更改参数,就可以达到变声的目的。
过程如下变声过程●分帧处理语音信号具有短时平稳特性,所以在处理之前要进行分帧处理,将一段长的语音信号分解为10~30ms的语音信号逐段进行处理。
语音信号的分帧是采用可移动的有限长度窗口进行加权的方法来实现的。
一般每秒帧数约为33~100帧,视实际情况而定。
分帧一般要采用交叠分段的方法。
如图所示,这是为了使帧与帧之间平滑过渡,保持其连续性。
前一帧和后一帧的交叠部分称为帧移,帧移与帧长的比值一般取为0~0.5。
在程序中对语音信号加Hamming窗处理,方法是用窗序列沿着语音样点值序列逐帧从左向右移动。
●计算LPC系数线性预测编码(LPC)是主要用于音频信号处理与语音处理中根据线性预测模型的信息用压缩形式表示数字语音信号谱包络(en:spectral envelope)的工具。
它是最有效的语音分析技术之一,也是低位速下编码方法高质量语音最有用的方法之一,它能够提供非常精确的语音参数预测。
LPC就是根据之前的P个信号构建滤波器,对之后的信号进行预测。
MATLAB中就有LPC函数,其形式为:[A,E]=lpc(s_w,P);其中A是LPC预测系数,用来构建滤波器,E是预测误差,在后面会用来计算激励能量,s_w是语音信号,P是预测阶数。
●计算原始激励用得到的LPC系数构建滤波器,对语音信号进行逆滤波就可以得到语音信号的激励,另外应该注意在系数变化的情况下连续滤波,需要维持滤波器的状态不变,要利用filter函数的和参数。
程序如下[exc1,zi_pre] = filter(A,1,s_f,zi_pre);exc1就是原始激励,用于计算基音周期。
●计算基音周期程序中用自相关法计算基音周期。
如果s(n)是一个周期为P的信号,则其自相关函数也是周期为P的信号,且在信号周期的整数倍处,自相关函数取最大值。
语音的浊音信号具有准周期性,其自相关函数在基音周期的整数倍处取最大值。
计算两相邻最大峰值间的距离,就可以估计出基因周期。
其实现代码如下function PT=findpitch(s)[B,A]=butter(5,700/4000);s=filter(B,A,s);R=zeros(143,1);for k=1:143R(k)=s(144:223)'*s(144-k:223-k);end[R1,T1]=max(R(80:143));T1=T1+79;R1=R1/(norm(s(144-T1:223-T1))+1);[R2,T2]=max(R(40:79));T2=T2+39;R2=R2/(norm(s(144-T2:223-T2))+1);[R3,T3]=max(R(20:39));T3=T3+19;R3=R3/(norm(s(144-T3:223-T3))+1);Top=T1;Rop=R1;if R2>=0.85*RopRop=R2;Top=T2;endif R3>0.85*RopRop=R3;Top=T3;endPT=Top;return● 计算激励能量激励能量G 用于构建脉冲序列时当作脉冲序列的振幅,激励能量和线性预测误差E 和基音周期PT 有关,其公式为G = sqrt(E*PT);● 合成脉冲序列合成的脉冲序列可根据变声的需要更改原始的基音周期PT ,如PT1 =floor(PT/2);而后以PT1为周期,G 为振幅构建脉冲序列,作为合成语音的激励● 更改声道参数利用LPC 求根法以更改共振峰分布。
具体过程为,对由线性预测系数A 构成的多项式求根,而共振峰频率F 和频谱宽带B 和这些根有对应关系。
设i i i i e r z θ⋅=为一个根,则其共轭值i i i i e r z θ-⋅=也是一个根,i 对应的共振峰频率F 和3dB 带宽B 存在以下关系:i θπ=i TF 2 i T B r e i =-π所以T i πθ2F i = T r i πln B i -=其中T 是采样周期。
在程序中,我们只更改共振峰频率,程序如下poles = roots(A);deltaOMG =100*2*pi/fs;for p=1:10if imag(poles(p))>0poles(p) = poles(p)*exp(peak*1j*deltaOMG); %peak 是变声系数 elseif imag(poles(p))<0poles(p) = poles(p)*exp(-peak*1j*deltaOMG);endendA1=poly(poles);A1是更改过声道参数的线性预测系数,用以构建滤波器合成变声语音。
合成变声语音用脉冲序列作为激励,A1作为滤波器参数,合成变声语音,[s_syn1_t,zi_syn_t] = filter(1,A1,exc_syn1_t,zi_syn_t);程序设计利用MATLAB的GUI进行程序设计,结果如下:从图中可看出,经过变声器处理以后,语音信号的频域发生了很明显的变化,共振峰发生明显的移动。
从听觉角度来说,变声效果也比较明显。
传统变声算法缺陷传统的变声算法形成时间较早,是对发声系统粗略的模仿实现语音合成,虽然能实现明显的变声效果,但还存在一些缺陷,这里只针对研究开发过程中发现的不足来说。
合成激励与原始激励差别较大合成激励是以原始激励的基音周期为周期的脉冲序列,忽视了原始激励中的泛音频率,而语音信号中泛音频率也是决定声音音色的重要因素,所以对泛音的忽视直接影响了变声效果。
完成变声器的编程之后,我尝试用基音周期不变的合成激励与原始的声道参数进行语音合成,对比合成语音和原始语音,结果如下可以很明显地看出合成激励和原始激励在频谱上有较大区别,而从听觉上而言,虽然能听出二者音色相似,但用合成激励合成的语音中有较多杂音。
从这个简单的实验可以看出,激励中的泛音对语音信号也有着相当重要的作用,当激励中去除泛音时,对语音信号的频谱分布和听觉上有着较大影响。
所以变声算法中,只考虑基音来构建合成激励是有很大缺陷的。
不能实现定向变声所谓定向变声,是指把一个人的声音定向地变成另一个人的声音。
每个人都有自己独特的音色,也就意味着每个人的声音信号有独特且恒定的参数存在,一开始我猜想是这个参数便是共振峰分布,后来发现,虽然不同的人说相同的话的语音共振峰确实有明显的区别,但是同一个人说不同的话共振峰的区别也非常大,下图分别是同一个人读“为中华崛起而读书”和“现在开始录音”的时域和频域图:可见共振峰分布并不相同,其实每个元音的共振峰分布本来就不一样,这就意味着,共振峰分布不仅决定了音色,也决定了语音内容。