基于 SOLA—FS 的女生音
频采集及变调的实现
目录:
1. 课题研究目标
2. 课题使用工具
3. 课题技术线路
4. 课题实现的原理
4.1 声音的采集
4.2 声音的处理
4.2.1 音频变调的基本原理
4.2.2 几种变调方法的比较
4.2.3 变调算法研究与功能实现
4.2.4 时长规整
4.2.5 具体时长规整的程序
5.总结
1.课题研究目标
利用 matlab 对女生音频信号进行采集及处
理,实现声音变调从而达到女生声音变成男生声
音。
2.课题使用工具
Matlab
3.课题技术线路
由分析可知女生的声音音调比男生的高,所
以要想达到女生声音变成男生的声音就是要对元
声音文件进行降调处理。
起初,我们按照以往的印象,认为只要先将
男生的声音信号进行傅里叶变换,通过低通滤波
器。然后将其进行频谱搬移,使其搬移到女生的
频率附近。最后再通过一个带通滤波器 。但是
实际的效果并不是很明显,于是我们参阅了网上
相关的文章,再根据自己的想法编写了一个采集
及分析、处理音频信号的程序。
首先, 要对声音信号进行采集。Matlab 的
数据采集工具箱提供了一整套命令和函数,通过
调用这些命令和函数,可直接控制声卡进行数据
采集。Windows 自带的录音机程序也可驱动声卡
来采集语音信号,并能保存为 wav 格式文件,供
matlab 相关函数直接读取,写入和播放。
其次, 以 wav 格式音频信号作为分析处理的
输入数据,先将 wav 格式音频信号经 wavread 函
数转换成 matlab 列数组变量;用 matlab 进行数
据分析和处理,从而达到变调的目的;处理后则
可用 wavread 转换成 wav 格式文件或用 sound,
wavplay 等函数直接回放。
4.课题实现的原理
4.1 声音的采集
本程序使用MATLAB自带的函数,可以对音频信号
进行采集,并且设定相关的采集方式。具体的程序如
下:
(1)建立设备对象,进行初始化。MATLAB将声卡等
设备都作对象处理,通过对对象的操作来作用于硬件
设备,并同时建立起模拟信号采集的对象:
ai=analoginput('winsound',0);%模拟信号输入函数,
ai为模拟信号输入对象,‘winsound '为声卡的驱动程
序,0为配置的设备ID号。
ch=addchannel(ai,1);%设置采集音频的通道
Fs = setverify(ai,'SampleRate',8000);%设置音频
信号采集的采样频率为8000
set(ai,'SamplesPerTrigger',3*Fs);%设置每次触
发后采
集音频信号的长度为3*Fs,即3秒。
set(ai,'TriggerRepeat',0);%设置连续采集的次
数,"0"为不重复,即只触发一次。
set(ai,'TriggerDelay',0);%设置延长的时间长短
set(ai,'TriggerType','Software');%设置音频信
号采集的触发方式
set(ai,'TriggerCondition','Rising');%当采集到
具有正斜率的信号,且超过一定的临界值时触发。
set(ai,'TriggerConditionValue',0.1);% 设
置音频信号采集的触发临界值
set(ai,'TimeOut',5);value);%设置超时等待的
时间长短,即5秒。
start(ai);%启动设备对象,开始采集数据
try
[data time]=getdata(ai);
catch
time=0;
data=0;
disp('超时!请重新运行!');
End
%以上为异常处理,处理超时的情况。
4.2 声音的处理
处理方法分为两个步骤:声音变调和时长规整
4.2.1.音频变调的基本原理
目前国际上普遍采用的音阶(音程)划分定律法
是 12 平均律。12 平均律是将一个纯八度音分为 12
个均等的部分(即 12 个半音)。根据 12 平均律,总
1
2 倍。一个纯
音列中各音级的物理振动频率相差 12
八度频 率相差两倍。如果将声音各频率成分的振
1
动频率升高 12
2 倍时,就相当于音调升高了一个半音;
1
如果将声音各频率成分的振动频率降低 12
相当于音调降低了一个半音。
2 倍时,
假设原音频信号的频率为 f, 变调后的频率为 f′,
则它们应满足式(1)的关系:
1
f′=f× 12
2 , i=±1, ±2, ±3
(1)
当 i>0 时为升调, 反之为降调。
4.2.2几种变调方法的比较
改变音频采样率
改变 WAV 文件的头文件信息,以改变播放的采
样率。这种方法实际上和硬件实现变调的方法相类
似。采样率提高,播放时间拖长,产生降调的效果;
采样率降低 时效果相反。为了保持播放时间不变,
需要把音频数据分成若干帧。对于升调,则要把 每
帧 最后一部分复制并补到该帧之后;对于降调,则
把每帧数据最后部分删除。这个方法的不足之处在
于: 升调时每帧之间是连续的,但在帧内由于补上
了一段数据, 在帧内会出现一处不连续。降调时帧
内的数据是连续的, 但每帧之间由于有部分数据被
删除也会导致不连续。因此,声音的音质会受到较
大的影响,会出现沙沙声和喀嚓声。
线性内插法
在频域上用线性内插的方法来实现声调的变
化。这种方法的缺点在于:内插会 引入不需要的频
率,特别是在某些能量大的频点。假设要两倍频,将
会引入一些能量为原频点能量一半的频率分量,这
些频率分量会大大影响音频的音质,而且与原来有
用的频率靠得很近,如果要进行滤波也比较麻烦。
另外,这种方法需要进行傅立叶变换及其反变换,运
算量较大。
频域搬移法
与第二种方法相比,该方法不会引入新的频率
分量。但是,其实现的变调效果会带有金属声。原
因在于频率的搬移并不是频率的线性变化。
4.2.3 变调算法研究与功能实现
本课题通过改变声音的采样频率来达到变调的
目的。
改变采样率的方法有很多,可以通过抽值和插值
的方法来实现采样率的改变。从频谱上来看,增采
样可以实现频谱的压缩,从而起到降调的作用,而降
采样则有升调的作用。当变调后的频率 f 与原频率
f0 之比非整数时,可以将内可以将内插与抽取结合
起来实现。
通过资料的查询和整理,男女的基频如下所
示:
正常成年男声:0~200Hz;
正常成年女声:200~450Hz;
经过整理统计可知
女声基频=男声基频*1.5。
本课题使用的是通过抽值与插值的方式改变
声音的采样率来达到基频的改变。
用整数 D 对语音信号序列进行抽取 将采样
频率变为原来的 1/D;然后再将的抽样频率提高
到 I 倍,即对信号序列插值。让 I/D=3/2,从而
达到频谱宽度为原来的 2/3;
4.2.4 时长规整
通过抽值插值来压缩频谱也使播放时间发生
改变,因此通过时长规整的方式来使播放时间恢
复到原来。
本程序使用的是用 SOLA-FS 算法来达到时长
规整。
SOLA-FS( Synchronized Over Lap- and-
Add- Fixed Synthesis)该算法可以在不改变音
调的情况下,对音频数据的长度进行改变。与传
统的 SOLA 算法相比,SOLA- FS 算法的输入和输
出信号均采用固定的位移间隔,能使计算相关性
和交叉渐变过程的运算量大幅降低, 从而便于硬
件的实时实现。
SOLA-FS 算法:
算法中的参数:
1) W:窗长度(Window Length)。它代
表了接受处理的语音信号的最小长度。
2) Sa:分析延时(Analysis shift)。
它代表了依次截取并进行处理的语音段首地址之
间的间隔。
3) Ss:综合延时(Synthesis shift)。
依次输出的语音段首地址之间的间隔。