1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 语音变速和变调的实现

语音变速和变调的实现

时间:2023-07-19 17:42:50

相关推荐

语音变速和变调的实现

实现变声的效果主要有两种方式,一种是对语音的本身进行修改,通过修改语音的一些特性达到变声的效果;另一种则是语音克隆,直接将输入语音特性转化成模板的语音特性。这里我们介绍第一种方式,语音克隆后面有机会再介绍。其实如果没有特定的变声需求,直接用不同的采样率读取原来的文件就会产生变声效果。

基音同步叠加(Pitch Synchronous Overlap Add, PSOLA, 发音是:劈死欧拉)是一种将语音在频域(FD-PSOLA)或者时域(TD-PSOLA)进行调整的算法,经常用于语音波形合成,这里将其稍微修改用于语音变声。其主要原理是通过改变基频间隔的时间长度来调整音高,通过重复或者省略一些基音片段来调整音长,达到变速和变调的效果改变语音。PSOLA算法分为基音同步分析和标注、基音同步修改和基音同步叠加几个部分。下面分别进行介绍。

基音同步分析和标注

基音同步分析和标注是为了确定语音单元基音周期的位置,语音分为清音段和浊音段,对于不同的语音段标注方式也不同。对于浊音段进行正常的标注,对于清音段直接将其基音周期设定一个确定的常数。进行基音标注首先要求基音周期,这部分内容在花式估计基音周期里面已经介绍过了,这里就不再赘述。一般基音周期估计后一般会经过中值滤波进行平滑处理。至此,基音同步分析的过程就结束了。

下面介绍基于动态规划的标注过程。再获得每一帧的基音周期后,可以根据基音周期的值直接将语音分为浊音段和清音段。对每个浊音段进行如下的操作:

找出浊音段的最大峰值,该峰值对应的位置t就是一个基音脉冲的标注点

取出该浊音段最大峰值对应的基音周期T

在[t-1.5T, t-0.5T]和[t+0.5T, t+1.5T]范围内以t为中心向两边搜索,在搜索区间内选择三个峰值作为待定的基音标注位置,然后依此搜索当前浊音段

对所有候选位置基于动态规划求解最佳路径,使得相邻两帧之间的标注距离最短

对其他浊音段重复上述步骤

这里基音标注标注其实标注的是声道的脉冲响应,可以参考说话声音是如何产生的,如下图所示。

基音同步修改

在求出基音标注位置后,我们就可以对基音进行修改。音长可以通过插入、删除语音单元的同步标注点来实现;音高可以通过增加、减少语音单元同步标注点的间距来实现。我们标注好的基音周期如下图所示

如果我们不修改音高和音长,而只是单纯的叠加可以得到如下的波形,这个波形和原始语音波形相近。

如果我们减少一个周期,可以得到如下的波形,在时间维度上,波形变长意味着语音时间减少。

如果我们减少基音标注的间距,会使得基音变高,反之则会变低。如下所示。

(a)原始基音标注

(b)基音标注间距减少

(c)基音标记间距增加

基音同步叠加

经过上述两个步骤之后我们就可以开始最后的基音同步叠加了。这个过程类似于分帧加窗FFT后还原的过程,大家应该都比较熟悉了。其具体过程如下图所示。

本文相关算法基于Python实现,公众号语音算法组菜单栏点击Code获取相关代码和数据。

参考文献:

[1]./p/110278983

[2].MATLAB在语音信号分析与合成中的应用

[3].https://courses.engr.illinois.edu/ece420/sp/lab5/lab/

[4].http://speech.zone/td-psola-the-hard-way/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。