基本概念[1]
spectral envelope的三个性质:
- 包络线连接峰值,并且紧紧包裹幅度谱
- 包络线不能震荡太剧烈,需要平滑
- 包络线不能有corner
语音信号可以模拟为激励脉冲序列与声道冲激响应的离散卷积,对于浊音信号
y
(
t
)
y(t)
y(t)可以简化为基音周期为
T
0
T_0
T0脉冲串
δ
\delta
δ和声道冲激响应
h
(
t
)
h(t)
h(t)的卷积:
y
(
t
)
=
h
(
t
)
∗
∑
n
=
−
∞
∞
δ
(
t
−
n
T
0
)
y(t)=h(t)*\sum_{n=-\infty}^{\infty}\delta(t-nT_0)
y(t)=h(t)∗n=−∞∑∞δ(t−nT0)
Y
(
ω
)
=
2
π
T
0
H
(
ω
)
∑
n
=
−
∞
∞
δ
(
ω
−
n
ω
)
Y(\omega)=\frac{2\pi}{T_0}H(\omega)\sum_{n=-\infty}^{\infty}\delta(\omega-n\omega)
Y(ω)=T02πH(ω)n=−∞∑∞δ(ω−nω)
上式中的
H
(
ω
)
H(\omega)
H(ω)即为需要估计的频谱包络;
δ
(
ω
)
\delta(\omega)
δ(ω)是频谱的谐波部分。
常用方法[1]
LPC
linear predictive coding一开始用于语音的传输压缩,基本思想是n时刻的信号
s
(
n
)
s(n)
s(n)是
s
(
n
−
p
−
1
)
s(n-p-1)
s(n−p−1)到
s
(
n
−
1
)
s(n-1)
s(n−1)的线性组合:
s
^
(
n
)
=
∑
i
=
1
p
a
i
s
(
n
−
i
)
\hat s(n)=\sum_{i=1}^{p}a_i s(n-i)
s^(n)=i=1∑pais(n−i)
e
(
n
)
=
s
^
(
n
)
−
s
(
n
)
e(n)=\hat s(n)-s(n)
e(n)=s^(n)−s(n)
要求预测误差
e
e
e最小,这样一帧的信号
s
s
s可以用
e
e
e和对应的LPC常数
a
a
a来表示,由于
e
e
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(n)=h(n)*e(n)
x(n)=h(n)∗e(n)
X
(
k
)
=
H
(
k
)
E
(
k
)
X(k)=H(k)E(k)
X(k)=H(k)E(k)
此时我们是无法区分开h(n)和e(n)。
对频域两边取log:
l
o
g
(
X
(
k
)
)
=
l
o
g
(
H
(
k
)
)
+
l
o
g
(
E
(
k
)
)
log(X(k))=log(H(k))+log(E(k))
log(X(k))=log(H(k))+log(E(k))
然后进行反傅里叶变换:
I
D
F
T
(
l
o
g
(
X
(
k
)
)
)
=
I
D
F
T
(
l
o
g
(
H
(
k
)
)
)
+
I
D
F
T
(
l
o
g
(
E
(
k
)
)
)
IDFT(log(X(k)))=IDFT(log(H(k)))+IDFT(log(E(k)))
IDFT(log(X(k)))=IDFT(log(H(k)))+IDFT(log(E(k)))
假设此时得到的时域信号如下:
x
′
(
n
)
=
h
′
(
n
)
+
e
′
(
n
)
x'(n)=h'(n)+e'(n)
x′(n)=h′(n)+e′(n)
虽然此时获得时域信号x’(n)即为倒谱,已经和原始的时域信号x(n)不一样,但是可以把时域信号的卷积关系转化为了线性加关系。
对应上图的频域信号,可以拆分成两部分的乘积:频谱的包络和频谱的细节。包络部分对应的是频谱的低频信息,而细节部分对应的是频谱的高频信息。倒谱分析已经将两部分对应的时域信号的卷积关系转化为了线性加关系,所以只需要将倒谱通过一个低通滤波器即可获得包络部分对应的时域信号h’(t)。
CheapTrick[2]
1. F0-adaptive windowing
参考pitch synchronous,语音分段的时候不再以传统的定长帧为单位,而是以f0对应的周期为单位,以保证波形和频谱的平滑连续。
一般使用长度为
3
T
0
3T_0
3T0的Hanning窗对语音进行切割,以当前时间点为中心,左右各取
1.5
T
0
1.5T_0
1.5T0长度的语音。
w
(
n
)
=
0.5
(
1
−
c
o
s
(
2
π
n
N
)
)
,
0
≤
n
≤
N
w(n)=0.5(1-cos(2\pi \frac{n}{N})), 0 \le n \le N
w(n)=0.5(1−cos(2πNn)),0≤n≤N
清音没有基频,一般使用一个适当的常数。
2. smoothing of the power spectrum
对于加窗以后的时域信号进行FFT获得对应的功率谱
P
(
ω
)
P(\omega)
P(ω),由于后面第三步需要对功率谱取log操作,所以需要保证功率谱没有零值,这里在三角窗内对信号进行平滑
P
s
(
ω
)
=
3
2
ω
0
∫
−
ω
0
3
ω
0
3
P
(
ω
+
λ
)
d
λ
P_s(\omega)=\frac{3}{2\omega_0} \int_{-\frac{\omega_0}{3}}^{\frac{\omega_0}{3}} P(\omega+\lambda)\, \mathrm{d}\lambda
Ps(ω)=2ω03∫−3ω03ω0P(ω+λ)dλ
3. liftering in the quefrency domain
可以将功率谱看做是普通信号,求出信号的包络也就是找到信号的低频部分。
- 首先对上一步求出来的功率谱做反傅里叶变换
p s ( τ ) = F − 1 [ l o g ( P s ( ω ) ] p_s(\tau)=\mathscr{F}^{-1}[log(P_s(\omega)] ps(τ)=F−1[log(Ps(ω)] - 过滤得到信号的低频部分
l s ( τ ) = s i n ( π f 0 τ ) π f 0 τ l_s(\tau)=\frac{sin(\pi f_0 \tau)}{\pi f_0 \tau} ls(τ)=πf0τsin(πf0τ)
sinc函数第一个作用,相当于一个低通滤波器;第二个作用,它在 n T 0 nT_0 nT0点对应的幅值为0,相当于清除了原始周期脉冲串 δ \delta δ的影响。 - spectral recovery
l q ( τ ) = q 0 + 2 q 1 c o s ( 2 π τ T 0 ) l_q(\tau)=q_0+2q_1 cos(\frac{2\pi \tau}{T_0}) lq(τ)=q0+2q1cos(T02πτ)
两个参数的经验值是1.18和-0.09。目的是为了消除前面平滑带来的畸变。 - 获取最后的频谱包络
P l ( ω ) = e x p ( F [ l s ( τ ) l q ( τ ) p s ( τ ) ] ) P_l(\omega)=exp(\mathscr{F}[l_s(\tau) l_q(\tau)p_s(\tau)]) 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