语音合成基本参数

基频参数

基本概念

声带每开启和关闭一次的时间就是基音周期(pitch period),倒数即为音频频率(pitch frequency)[1]。 
基音频率取决于声带的大小、厚薄、松紧程度,以及声门上下之间的气压差的效应等。最低可达80Hz,最高可达500Hz,老年男性偏低,小孩女性偏高。它反映了声调的变化。

常用方法

常用的有自相关方法和倒谱方法 
Autocorrelation Function(ACF)运算可以用于寻找周期信号的周期。因为周期信号的自相关函数也是周期信号,而且周期一致。比如YIN算法[2]就是使用的自相关方法。 

rt(τ)=∑j=t+1t+Wxjxj+τ

W表示相关函数的窗口,τ
表示相关函数的延时。
DIO

World里面使用DIO[3][4]提取pitch,相比之前的方法速度更快。主要分为三步: 
1. 使用不同截止频率的低通滤波器进行滤波 
如果滤波后的信号只包含一个周期T0
的信号,即为pitch。由于pitch未知,会使用多个不同截止频率的滤波器。 
2. 计算F0候选以及置信度 
取四个周期,计算每个周期的zero-crossing/peak/dip intervals应该一致,以此为标准计算置信度。 
 
3. 选取置信度最高的频率作为最后的pitch
 

 spectral envelope参数

基本概念[1]


spectral envelope的三个性质: 
- 包络线连接峰值,并且紧紧包裹幅度谱 
- 包络线不能震荡太剧烈,需要平滑 
- 包络线不能有corner

语音信号可以模拟为激励脉冲序列与声道冲激响应的离散卷积,对于浊音信号 y(t)
可以简化为基音周期为T0
脉冲串 
和声道冲激响应h(t)
的卷积: 

y(t)=h(t)∗∑n=−∞∞δ(t−nT0)

Y(ω)=2πT0H(ω)∑n=−∞∞δ(ω−nω)

上式中的H(ω)
即为需要估计的频谱包络;δ(ω)
是频谱的谐波部分。
常用方法[1]

LPC

linear predictive coding一开始用于语音的传输压缩,基本思想是n时刻的信号s(n)
是s(n−p−1)
到s(n−1)
的线性组合: 

s^(n)=∑i=1pais(n−i)

e(n)=s^(n)−s(n)

要求预测误差e
最小,这样一帧的信号s
可以用e
和对应的LPC常数a
来表示,由于e
比较小,所以可以用更少的bit来表示,实现了信号的压缩。可以用下面的滤波器对来表示编解码的过程。 

从另外一角度理解,analysis filter的作用是压缩输入信号的高幅值的频率分量,而synthesis filter的作用是放大这些分量,所以在一定程度上面synthesis filter体现了包络的信息。 
缺点是包络有可能包含将peak之间的噪声部分,尤其当两个peak间距比较大的时候(f0比较大),如下图。 

cepstrum

倒谱分析属于同态解卷积的方法,对于卷积信号,不能通过线性方法进行分离,可以通过FFT变为乘积信号,取log将乘积信号变为加性信号,IFFT变换获取倒谱,通过简单的低通滤波即可获得最后的频谱包络。 
假设两部分对应的时域信号分别是h(n)和e(n),那么满足: 

x(n)=h(n)∗e(n)

X(k)=H(k)E(k)

此时我们是无法区分开h(n)和e(n)。 
对频域两边取log: 
log(X(k))=log(H(k))+log(E(k))

然后进行反傅里叶变换: 
IDFT(log(X(k)))=IDFT(log(H(k)))+IDFT(log(E(k)))

假设此时得到的时域信号如下: 
x′(n)=h′(n)+e′(n)

虽然此时获得时域信号x’(n)即为倒谱,已经和原始的时域信号x(n)不一样,但是可以把时域信号的卷积关系转化为了线性加关系。 
对应上图的频域信号,可以拆分成两部分的乘积:频谱的包络和频谱的细节。包络部分对应的是频谱的低频信息,而细节部分对应的是频谱的高频信息。倒谱分析已经将两部分对应的时域信号的卷积关系转化为了线性加关系,所以只需要将倒谱通过一个低通滤波器即可获得包络部分对应的时域信号h’(t)。
CheapTrick[2]

1. F0-adaptive windowing

参考pitch synchronous,语音分段的时候不再以传统的定长帧为单位,而是以f0对应的周期为单位,以保证波形和频谱的平滑连续。 
一般使用长度为3T0
的Hanning窗对语音进行切割,以当前时间点为中心,左右各取1.5T0
长度的语音。 

w(n)=0.5(1−cos(2πnN)),0≤n≤N

清音没有基频,一般使用一个适当的常数。
2. smoothing of the power spectrum

对于加窗以后的时域信号进行FFT获得对应的功率谱P(ω)
,由于后面第三步需要对功率谱取log操作,所以需要保证功率谱没有零值,这里在三角窗内对信号进行平滑 

Ps(ω)=32ω0∫ω03−ω03P(ω+λ)dλ
3. liftering in the quefrency domain

可以将功率谱看做是普通信号,求出信号的包络也就是找到信号的低频部分。 
1. 首先对上一步求出来的功率谱做反傅里叶变换 

ps(τ)=F−1[log(Ps(ω)]

2. 过滤得到信号的低频部分 
ls(τ)=sin(πf0τ)πf0τ

sinc函数第一个作用,相当于一个低通滤波器;第二个作用,它在nT0
点对应的幅值为0,相当于清除了原始周期脉冲串δ
的影响。 
3. spectral recovery 
lq(τ)=q0+2q1cos(2πτT0)

两个参数的经验值是1.18和-0.09。目的是为了消除前面平滑带来的畸变。 
4. 获取最后的频谱包络 
Pl(ω)=exp(F[ls(τ)lq(τ)ps(τ)])
参考文献

[1].Spectral Envelopes in Sound Analysis and Synthesis 
[2].CheapTrick, a spectral envelope estimator for high-quality speech synthesis

 

synthesis

基本概念

最小相位脉冲响应[1]可以保证波形在时域上基本不变。 
根据频谱包络求出最小相位响应(减弱时域信号的相位失真),然后IFFT还原为语音信号 
 
其中A
跟频谱包络有关

合成流程

合成[2]分为三步 
1. 根据f0
确定脉冲的位置 
对分帧的频谱插值获得脉冲对应的频谱spectrum
 
2. 时域周期信号 
2.1 求出频谱包络中周期部分,然后过最小相位脉冲响应 

period_spectrum=spectrum[i]⋅(1−aperiodic_ratio[i])

2.2 反傅里叶变换得到时域信号,并去除直流分量 
RemoveDC(IFFT(period_spectrum))

3. 时域非周期信号 
3.1 求出频谱包络中非周期部分,然后过最小相位脉冲响应 
aperiod_spectrum=spectrum[i]⋅aperiodic_ratio[i]

3.2 高斯白噪声的幅度谱 
noise_spectrum=FFT(noise)

3.3 获取最后的非周期时域信号 
IFFT(aperiod_spectrum⋅noise_spectrum)

4. 时域周期信号和时域非周期信号相加得到最后的合成信号
代码细节

GetTimeBase() 
synth->interpolated_vuv:voice的概率 
synth->pulse_locations:脉冲对应的时间 
synth->pulse_locations_index:脉冲对应的采样点 
1.线性插值的到每个sample对应的f0和vuv 
原来5ms对应一帧,有一个f0,扩展到每一个采样点一个f0,直接线性插值 
2.获取pulse location,参考wiki 
每个采样点对应的phase=2πf0fs
 
每个采样点对应的累积相位 
每个采样点对应的wrap_phase=total_phase mod 2π
 
每个采样点对应的wrap_phase[n]−wrap_phase[n−1]>π
即为新的pulse的起点

参考文献

[1].speech representation and transformation using adaptive interpolation of weighted spectrum vocoder revisited 
[2].https://github.com/mmorise/World
--------------------- 
作者:xmucas 
来源:CSDN 
原文:https://blog.csdn.net/xmdxcsj/article/details/72420382 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(语音合成)