首页
学习
活动
专区
工具
TVP
发布

美少女声音之变换合成

介绍

到目前为止,我主要致力于生成美少女的图像(或视频),但我希望她们一旦在屏幕上可见就会用可爱的声音说话。所以这一次,当我发出另一个人的声音时,我进行了语音转换以转换为漂亮的声音,而在给出文本时,我使用文本转语音(TTS)来创建漂亮的声音。我将描述试验结果。

语音转换

介绍

有两种类型的语音转换数据。这是并行数据(源speaker和目标speaker 的说话内容一致,paired data)和非并行数据(源speaker和目标speaker的说话内容不一致,unpaired data)。每个功能如下所述。

使用并行数据的语音转换使用

发出相同语音的两种类型的语音作为训练数据。因为话语的内容是相同的,所以可以转换声学特征而不用担心语言特征。但是,有必要使用动态时间扭曲(DTW)等进行对齐,因为说话单词的时间由于说话速度的不同而发生偏移。在这种情况下,语音转换在某些情况下可能并不容易,因为在考虑数据集的准备时必须使用相同的单词。

使用非并行数据进行语音转换

如果两种类型的语音生成与以前相同的并行数据行,则使用两种类型的语音作为训练数据发出不同的行。在这种情况下,不需要对齐,并且比并行数据更容易收集数据集。

在这个实验中,我尝试使用后面的非并行数据转换语音质量。

网络架构

这次提到的论文是CycleGAN VC2。虽然CycleGAN用于转换非并行图像数据,但也有使用CycleGAN的方法用于音频。CycleGAN VC2是CycleGAN VC的扩展。所以,首先,我想谈谈CycleGAN VC。

CycleGAN VC的结构如下:

Takuhiro Kaneko, et al., “CycleGAN-VC: Non-parallel Voice ConversionUsing Cycle-Consistent Adversarial Networks”

CycleGAN中的Generator和Discriminator的结构没有太大变化。除了细节(Pixel Shuffler等)之外,不同之处在于Generator具有基于1D CNN的结构,并且门控线性单元(GLU)用于激活功能。由于音频与自然语言是相同的顺序数据,因此它使用1D CNN或GLU,其使用比图像更大的内核大小。

作为神经网络的输入,我们使用mel cepstrums(MCEP)来表示来自各种可能的语音特征的人类语音颜色。我们使用WORLD来提取24维MCEP并将其用作网络的输入。

最后,损失函数类似于CylceGAN。它使用对抗性损失,Cylce一致性丢失和身份映射丢失。在论文中,声称最后的身份映射损失保留了语言结构。

以上是CycleGAN VC的解释。以下结构是我们这次检查的CycleGAN VC2。

Takuhiro Kaneko, et al., “CYCLEGAN-VC2:IMPROVED CYCLEGAN-BASED NON-PARALLEL VOICE CONVERSION”

与CycleGAN VC不同,Generator具有2D-1D-2D CNN结构,而不是基于1D CNN的结构。在论文中指出,2D CNN广泛捕获特征,并且主要转换在1D CNN部分中完成。此外,PatchGAN用于Discriminator的事实也与CycleGAN VC不同。

此外,还存在用作损失函数的Adversalial损失的变化,这与CycleGAN VC不同。这是下图所示的两步对抗性损失。

Takuhiro Kaneko, et al., “CYCLEGAN-VC2:IMPROVED CYCLEGAN-BASED NON-PARALLEL VOICE CONVERSION”

如上图左图所示,在CycleGAN中使用的一步式对抗性损失中,只有转换目的地的正确数据才会遭受对手的损失,但在这两步的对抗性损失中,它会再次从转换目的地返回并使用正确的数据我将采取对抗性的损失。在论文中指出,这是为了减少循环一致性损失中使用的L1损失的过度平滑。

这完成了CycleGAN VC2的描述。然后我们继续进行实验。

数据集

我认为使用非并行数据进行语音质量转换需要大量数据,这次我使用JSUT的所有Basic 5000作为转换源的数据,并将綾波レイAyanami Rei(语音模仿)数据设置为转换目标的数据。綾波レイAyanami Ray数据集是语音模仿数据集,但包含大量数据,例如5089个句子,并且作为模仿语音的水平也非常高。这个数据集由日本的东北大学的Nose Taka副教授提供。非常感谢您借此机会。

JSUT

綾波レイAyanami Rei

实验

然后,我们实际构建了一个CycleGAN VC2网络并使用MCEP作为输入来进行学习。由于处理在学习和推理之间变化,我们将首先描述流程。

训练

转换源语音数据被下采样到22050Hz,并且使用WORLD提取513维频谱包络,其中帧周期是5ms。

在使用WORLD的CodeSpectralEnvelope方法从频谱包络获得36维MCEP后,随机提取128个连续帧并用于网络输入。

类似地,确定转换目的地语音数据的36维MCEP,使用网络的输出计算损失函数,执行误差反向传播,并且更新网络的权重。

推理

预先获得转换源和转换目标的对数基频的平均值和标准偏差。使用WORLD从每1000个句子中提取基频,并将其作为对数并求出平均值和标准偏差。平均值和标准偏差稍后用于基频转换。

转换源语音数据被下采样到22050Hz,并且使用WORLD提取513维频谱包络,基频和异步周期,其中帧周期是5ms。

在使用WORLD的CodeSpectralEnvelope方法获得36维MCEP之后,使用从前面开始的128帧的学习模型进行转换。

使用WORLD的DecodeSpectralEnvelope方法将转换后的MCEP恢复为513维频谱包络。要转换的基频由如下所述的转换源和转换目标的对数基频的平均值和标准偏差计算如下。转换目标的异步周期性按原样使用转换源之一。

import numpy as np

def f0_transform(src_f0, # Source语音的f0

src_logf0_mean,#源语音日志的平均值(f0)

src_logf0_std, #源语音日志的标准差(f0)

tgt_logf0_mean,#目标语音对数的平均值(f0)

tgt_logf0_std, #目标语音日志的标准差(f0)

):

Normalized_logf0 =(Np.Ma.Log(Src_f0)- Src_logf0_mean)/ Src_logf0_std

converted_logf0 = normalized_logf0 * tgt_logf0_std + tgt_logf0_mean

return np.exp(converted_logf0)

WORLD使用变换的频谱包络,基频和异步周期合成语音。

另外,学习时的细节如下所示。

批量大小为16

优化方法是Adam(β1= 0.9,发电机α为0.0002,鉴别器为0.0001)

对抗性损失,周期一致性损失和身份映射损失的系数分别为1.0,10.0和5.0。身份映射损失仅使用前20个时期。

结果

这是JSUT-> 綾波レイ Ayanami Ray的转换结果。

你可以看到,如果你听到它,声音质量不是很清楚,但声音的语音内容不清楚。我认为这不是为了将话语内容保存为试图在双对抗步骤中使分布彼此过于接近,并将其恢复为与CylceGAN VC相同的一步式对抗性损失。结果如下。

如果您听,它可以看到语音质量发生变化,话语内容清晰。

这次,我使用CycleGAN VC2对非并行数据进行了语音转换。具有不同话语内容的数据可以用作学习数据。以下两点被视为下一个方向。

使用少量非并行数据

进行学习这次,使用大约5000个句子的大量数据来学习转换源和转换目标。但事实上,它可能不会被收集到这里。当Rei Ayanami的数据集为5000个句子 - > 500个句子时的语音质量转换结果如下所示,但是音质下降并且话语的内容变得不清楚。因此,我想考虑一种用较少数据学习的方法

音质改善

由于语音被转换回声学特征,它被转换回语音,因此它是一种机械语音,如合成语音。存在一种称为WaveCycleGAN的方法,其将合成语音转换为自然语音,并且存在可以考虑的各种方法,诸如基于语音波形的转换而不将其转换为声学特征。

文本到语音转换

由于使用源语音的信息执行语音转换,因此除了简单的语言特征之外还可以使用各种语音特征。但毕竟,我想从文本中产生声音作为理想。所以,这次,我使用Google的Tacotron2进行了文字转语音。

介绍

要从文本生成语音,请执行以下步骤:文本语言功能声音功能语音。有多种方法,例如直接将文本转换为语音并一次转换一步,此时引入了Tacotron 2,生成文本到声音特征量Mel谱图和Mel谱图到语音我正在分别做合成(声码器)。在论文中,声码器使用的是WaveNet而不是传统的Griffin-Lim 。由于WaveNet不是一个特别新颖的结构,我们将看一下从文本中生成mel谱图的部分。

网络架构

Tacotron2的整体视图如下:

[github] Rayhane-mamah:Tacotron-2こちらのページより拝借しました。

分为编码器Encoder和解码器Decoder,编码器执行文本的特征提取,解码器产生梅尔谱图。

解码器部分是一个自回归模型,它可以从2个Layer Pre-Net2个LSTM Layers Linear Projection生成mel频谱图,每次一帧。此时,Attention Matrix是根据编码器的输出计算的。在这个Attention中,我们注意在哪个时刻读取哪个字符,因为读取的关于时序偏移的字符也会移位,因此Attention Matrix将在对角线中具有如下值:

另外,在2个LSTM layers之后存在分支,并且在Linear Projection之后,Sigmoid函数确定句子是否结束。在实验中,除了将句号放在句子的末尾之外,是否确定此停Stop Token是结束是多余的声音。在解码器中生成Mel谱图之后,我们将它与通过5 Conv Layer Post-Net的那个组合,并将其与残差结合以进一步改进它。这是从Tacotron2中的文本生成mel谱图的流程。在生成mel频谱图之后,通过声码器合成语音。

最后,对于损失函数,它采用了梅谱图和PostNet之前和之后的正确数据的均方误差。

数据集

作为数据集,我们使用了綾波レイAyanami Ray数据集的所有5089个句子以及语音转换。我也收到了日文文本对,所以我将它们转换成尽可能接近音素的字母表。

例)こんにちは(日本語表記)Konnichiha(ローマ字表記)Konnichiwa(音素に近づけた表記)

【 翻译:你好(日文版)Konnichiha(罗马)Konnichiwa(音素符号) 】

实验

这一次,我借用了NVIDIA的Tacotron 2实现而没有从头开始实现它。此实现与Tacotron 2相同,直到生成mel谱图,但在声码器部分使用WaveGlow。

Tacotron 2论文中描述的WaveNet声码器存在低速问题,因为它是一种高质量的自回归模型。因此我们的目标是加速Parallel WaveNet和WaveRNN,但它在质量上不如WaveNet。

WaveGlow可以并行化,因为它可以生成基于mel频谱图调节和基于流量的波形,并且在WaveGlow中描述为比WaveNet更快更高的质量。

借用实现的唯一变化是采样率为22050 Hz。在学习的时候,我用

LJ Speech Dataset中学到的东西作为体重的初始值。

另外,我还没有重新学习WaveGlow部分。已经在LJ Speech Datset中学习的模型按原样使用。因为我认为声码器不依赖于说话者而且没有必要重新学习。(Individually Glow仍然很难学习,也不想陷进去)

结果

我们来谈谈Text-to-Speech的结果。让我们通过输入几个被认为合适的句子来看看它会是什么样的声音。

如上所述,话语内容清晰,语音质量也适当綾波レイRei Ayanami。然而,有些事情,例如“友情不寻求奖励”和“爱情侦探Chika解决。”这些演讲是平坦的,不同于我们通常听到的有关口音的演讲。

日语是一种口音非常重要的语言。同一罗马字母表中的不同口音可能意味着不同的东西(例如Bridges和Samurai)。此外,重音可能会根据相邻的单词而改变。但是,这种重音信息不会出现在字符中。这次,我使用Tacotron2以数据驱动的方式猜测这些重音,但这意味着没有足够的数据。 在本文中,考虑到这些重音信息,我们重新设计了日语的Tacotron(这是Tacotron1而不是Tacotron2)。

[soundcloud]. lento-l: jce84jtbz4dm

具体地,如上图所示,不仅到目前为止从文本信息获得的音素嵌入,还有通过重音式嵌入和结合自我注意结构的重音。这些器件表明,与简单的Tacotron相比,评估指标MOS得到了改善。然而,重要的是要注意MOS低于基于结合这些想法的HMM的传统方法。作为未来的政策,信件的声音信息很少,因此在论文中指出我们打算将它们合并。我想在改进这里使用的实现的同时解决这些问题。

总结

这次,我尝试使用CycleGAN VC2进行非并行数据语音转换,使用Tacotron2进行文本到语音转换,因为转换为美少女声音变换和合成。虽然两者都取得了一定的成绩,但感觉就像一个人失踪了。特别是关于TTS,需要产生一种情绪化的声音,强调将合成方面的可爱性展现给漂亮的声音,并且旨在进一步提升。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191129A0PIS500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券