任务
其他模型的局限: 只能将声音转换成训练数据中出现的说话人, 缩小了VC的使用范围。
任务: 源说话人和目标说话人可以不出现在训练数据中, 只用一个样本就能进行语音转换。
实现方法
实例规范化说话人和说话内容。
简介
一般VC的目的是将语音信号的语言内容部分保留, 将非语言信息进行转换。非语言信息一般指的是说话人身份, 口音,发音等部分。 VC对一些下游的任务(如多说话人的语音合成, 表达性语音合成, 语音增强, 发音正确)来说是非常有用的。
之前的工作可以分为两种类型:监督和无监督。
监督的语音转换已经取得了不错的效果, 但是需要目标和源话语之间在帧级别上的对齐关系。如果目标域和源域之间有比较大的偏差会严重影响语音转换, 并且收集平行语料是很费时间的, 因此如果将灵活地应用在其他领域, 一般不使用监督的语音转换。
无监督的语音转换不需要收集平行语料。 一些工作尝试引入ASR系统来帮助无监督VC, 将语音先转换为音素序列, 然后再在目标域中合成语音, 这些方法的局限性在于转换的效果极大依赖于ASR系统的准确度。 其他的工作利用生成模型(如VAE,GAN)来做无监督VC, 这些工作将VC当做是一个域之间的映射问题, 将语音在不同域中进行转换。 这些方法的局限是无法合成在训练出现中从未出现的说话人的声音。
语音信号固有地包含静态信息和语言信息。 静态部分如说话人, 声学信息等与实践无关,仅在整个话语过程中发生变化; 而语言部分是每隔几帧都在发生剧烈变化。 因此可以假设一个话语可以分解为说话人表示和内容表示。为了将话语中说话人表示和内容表示分离开来, 模型由三个部分组成: speaker encoder, content encoder 和 decoder。
模型
假设
p
(
z
c
∣
x
)
p(z_c|x)
p(zc∣x)是条件独立的高斯分布,
p
(
z
c
∣
x
)
=
N
(
E
c
(
x
)
,
I
)
p(z_c|x)=\mathcal N(E_c(x),I)
p(zc∣x)=N(Ec(x),I). 重构损失为:
L
r
e
c
(
θ
E
s
,
θ
E
c
,
θ
D
)
=
E
x
∼
p
(
x
)
,
z
c
∼
p
(
z
c
∣
x
)
[
∣
∣
D
(
E
s
(
x
)
,
z
c
)
−
x
∣
∣
1
]
L_{rec}(\theta_{E_s}, \theta_{E_c}, \theta _D)= \mathbb E _{x \sim p(x), z_c \sim p(z_c|x)}[||D(E_s(x),z_c)-x||_1]
Lrec(θEs,θEc,θD)=Ex∼p(x),zc∼p(zc∣x)[∣∣D(Es(x),zc)−x∣∣1]
在训练时, 从
X
\mathcal X
X中均匀采样一个x(即
p
(
x
)
p(x)
p(x)是在
X
\mathcal X
X上的均匀分布). 为了使后验概率和先验概率匹配, 需要最小化KL散度损失。 因为这里已经假设了方差为1, 所以这里KL散度可以等价于L2正则化项:
L
k
l
(
θ
E
c
)
=
E
x
∼
p
(
x
)
[
∣
∣
E
c
(
x
)
2
∣
∣
2
]
L_{kl}(\theta_{E_c}) = \mathbb E_{x \sim p(x)}[||E_c(x)^2||_2]
Lkl(θEc)=Ex∼p(x)[∣∣Ec(x)2∣∣2]
目标函数为:
m
i
n
θ
E
s
,
θ
E
c
,
θ
D
=
λ
r
e
c
L
r
e
c
+
λ
k
l
L
k
l
min_{\theta _{E_s},\theta _{E_c}, \theta_D}=\lambda _{rec}L_{rec} + \lambda _{kl}L_{kl}
minθEs,θEc,θD=λrecLrec+λklLkl
Instance Normalization (IN)
发现在content encoder 引用Instance normalization 而不需要用仿射变换能将speaker information和 content information分离开来。
instance normalization:
M: 卷积层输出的feature map
M
c
M_c
Mc: 第c层的channel, W维的向量
第一步: 计算第c个channel的均值和标准差
μ
c
=
1
W
∑
w
=
1
W
M
c
[
w
]
σ
c
=
1
W
∑
w
=
1
W
(
M
c
[
w
]
−
μ
c
)
2
+
ϵ
\mu _c = \frac{1}{W} \sum_{w=1}^{W} M_c[w]\\ \sigma _c = \sqrt {\frac{1}{W} \sum _{w=1}^W (M_c[w]-\mu _c)^2+\epsilon}
μc=W1w=1∑WMc[w]σc=W1w=1∑W(Mc[w]−μc)2+ϵ
第二步:计算Instance normalization
M
c
′
[
w
]
=
M
c
−
μ
c
σ
c
M_c^{'}[w] = \frac{M_c-\mu _c}{\sigma_c}
Mc′[w]=σcMc−μc
关于instance normalization 可参考的文章:
https://zhuanlan.zhihu.com/p/57875010
https://my.oschina.net/u/4135288/blog/4650633
https://zhuanlan.zhihu.com/p/158657861?utm_source=wechat_timeline
为了使speaker encoder 能够生成 speaker representation, 我们将speaker information中提取到的均值
γ
c
\gamma_c
γc和方差
β
c
\beta_c
βc输入到decoder的AdaIN层中,最终decoder的输入为:
M
c
′
=
γ
c
M
c
−
μ
c
σ
c
+
β
c
M_c^{'} = \gamma_c \frac{M_c-\mu _c}{\sigma_c}+\beta_c
Mc′=γcσcMc−μc+βc
这样能使得保留source utterance的语言信息, 又加入了target utterance的非语言信息。
实现
实验结果:
-
speaker embedding是否能将说话人区分开
-
语音转换是否相似
样例链接: https://jjery2243542.github.io/one-shot-vc-demo/.
代码链接:https://github.com/jjery2243542/adaptive_voice_conversion