https://www.toutiao.com/a6714089773171999244/

介绍

到目前为止,我主要致力于生成人物的图像(或视频),但我希望他们一旦在屏幕上可见就会用对应的声音说话。所以这一次,当我发出另一个人的声音时,我进行了语音转换以转换为对应的声音,而在给出文本时,我使用文本转语音(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

[<链接不可显示,请自行搜索>] /lento-l/ut-paraphrase-sent075-phrase1

[<链接不可显示,请自行搜索>] /lento-l/ut-paraphrase-sent245-phrase1

綾波レイAyanami Rei

[<链接不可显示,请自行搜索>]/takashinose/status/1128333793360670725

实验

然后,我们实际构建了一个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 npdef f0_transform(src_f0, # Source语音的f0src_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_stdconverted_logf0 = normalized_logf0 * tgt_logf0_std + tgt_logf0_meanreturn np.exp(converted_logf0)
  • WORLD使用变换的频谱包络,基频和异步周期合成语音。

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

  • 批量大小为16
  • 优化方法是Adam(β1= 0.9,发电机α为0.0002,鉴别器为0.0001)
  • 对抗性损失,周期一致性损失和身份映射损失的系数分别为1.0,10.0和5.0。身份映射损失仅使用前20个时期。

结果

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

[<链接不可显示,请自行搜索>] /lento-l/two-sent075-phrase1

[<链接不可显示,请自行搜索>] /lento-l/two-sent245-phrase1

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

[<链接不可显示,请自行搜索>] /lento-l/one-sent075-phrase1

[<链接不可显示,请自行搜索>] /lento-l/sent245-phrase1

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

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

  • 使用少量非并行数据:

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

[<链接不可显示,请自行搜索>] /lento-l/atr-sent075-phrase1

  • 音质改善:

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

文本到语音转换

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

介绍

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

网络架构

Tacotron2的整体视图如下:

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

解码器部分是一个自回归模型,它可以从2个Layer Pre-Net→2个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的结果。让我们通过输入几个被认为合适的句子来看看它会是什么样的声音。

[<链接不可显示,请自行搜索>] /lento-l/l7rxdhhzpe8k

[<链接不可显示,请自行搜索>] /lento-l/aqckovrzawv5

[<链接不可显示,请自行搜索>] /lento-l/jce84jtbz4dm

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

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

在本文中,考虑到这些重音信息,我们重新设计了日语的Tacotron(这是Tacotron1而不是Tacotron2)。

[<链接不可显示,请自行搜索>] /lento-l/jce84jtbz4dm

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

总结

这次,我尝试使用CycleGAN VC2进行非并行数据语音转换,使用Tacotron2进行文本到语音转换,因为转换为指定声音的变换和合成过程。两者都取得了一定的成绩。特别是关于TTS,需要产生一种情绪化的声音,强调将合成方面的情绪展现给相应的声音,并且旨在进一步提升。

基于GAN的语音转换技术及语音合成TTS相关推荐

  1. 基于数据仓库和维度转换技术的广东电信公话IC话机话务动态分析系统

    本文发表于期刊<天津通信技术>2003年4期. 基于数据仓库和维度转换技术的广东电信公话IC话机话务动态分析系统 马根峰 (广东电信公用电话管理中心 广州 510635) 摘要   在电信 ...

  2. 使用基于GAN的过采样技术提高非平衡COVID-19死亡率预测的模型准确性

    作者|THILAKADIBOINA 编译|Flin 来源|analyticsvidhya 介绍 本文介绍了生成性对抗网络(Generative attersarial Networks,GAN)的使用 ...

  3. 【论文综述】基于深度学习语音分离技术的研究现状与进展

    基于深度学习语音分离技术的研究现状与进展 本文主要是针对单通道的监督性语音分离技术的综述,描述该技术涉及到的特征.模型和目标三个主要方面:并对语音分离的一般流程和整体框架进行了详细的介绍.归纳和总结. ...

  4. 基于AI的语音信号处理技术

    语音信号处理的目的就是在复杂的语音环境中提取有效的语音信息. 一.语音信号 技术思想及原理分析 语音唤醒的原理是让模型学习特定唤醒词的语音信号特征,当输入设备捕捉到一定阈值范围内的语音信号时,当前设备 ...

  5. 学习笔记:基于GMM的语音转换(超详细)

    基于高斯混合模型的语音转换(Voice conversion based on Gassian mixture model) 任务: 把说话人A的声音转换成说话人B的声音,保持语义信息不变. 实验部分 ...

  6. 百度语音转换技术,让失聪人和盲人独立对话成为可能!

    高大上吧,大家都习惯了用微信聊天发语音对话和语音转文字功能,这不就是耳聋和盲人对话的核心技术么,今天我们用百度技术带大家也实现这种功能,直接语音转文字.文字转语音的功能,实现一个自己的聊天工具,门槛就 ...

  7. 离线语音交互技术路线之语音合成(TTS)篇

      在ChatGPT大行其道之际,我心血来潮想要研究研究如何实现离线语音交互,把它和ChatGPT相结合,自己尝试实现个语音助手玩玩.本篇文章主要先从整体上分析了离线语音交互的技术实现路线,以及每个环 ...

  8. 车载c语言,Cerence推出语音克隆技术解决方案 定制个性化车载语音

    描述 人工智能让人们可以将出行助理的声音创建成自己的.爱人或朋友的声音 Cerence Inc. (NASDAQ: CRNC), AI for a world in motion, 近日推出了革命性的 ...

  9. ICASSP2023 | 基于多任务学习的保留背景音的语音转换

    在影视.有声书内容中,背景音是一种表现丰富的艺术形式.语音转换(Voice Conversion)如能将源说话人语音转换成目标说话人语音的同时,保留源语音中的背景音,将会提供更沉浸的语音转换体验.之前 ...

最新文章

  1. git怎样用idea拉代码_一款强大的 IDEA 代码生成器,学会用,真香!
  2. Centos系统中彻底删除Mysql数据库
  3. mysql 网站 数据库_mysql系统数据库
  4. 001 GIt的基本操作
  5. 【Vegas2008】7月19日-凉粉的做法
  6. Java 关键字—— static 与 final
  7. 数学系和物理系学生有什么差别?
  8. Codeforces 816C/815A - Karen and Game
  9. 关于缓存穿透,缓存击穿,缓存雪崩,热点数据失效问题的解决方案
  10. 了解更多关于11gR2 diskmon
  11. 【python初级】os.listdir返回目录中包含的文件以及文件夹的列表
  12. 如何做好新媒体软文营销推广
  13. Intel核芯显卡微架构浅析
  14. SEM数据分析之做好关键词报告
  15. 相敏检波电路matlab,一种消除分布电容影响的电阻测量方法
  16. python如何实现语音识别
  17. 学习过程中所遇到的问题及解决方法总结
  18. 微信公众号开发之生成并扫描带参数的二维码(无需改动)
  19. 软件工程(数据字典)
  20. matlab在天线方向图中的应用与研究,MATLAB在天线方向图中的应用与研究

热门文章

  1. 解决vue项目路由出现message: “Navigating to current location (XXX) is not allowed“的问题(点击多次跳转)
  2. 【学习笔记】前端开发面试锦集
  3. leetcode 78.不含重复元素数组的子集
  4. increment java_Java LongAdder increment()用法及代码示例
  5. 企业抖音蓝v怎么认证?详谈蓝v申请认证流程
  6. xtend怎么使用_Java替代Xtend又推出了另一个块摇摆更新
  7. 关于ios 卡顿检测分析
  8. HTML+js实现贪吃蛇小游戏(内含完整代码)
  9. asp.net房屋出租销售网
  10. 使用B站API:http://api.bilibili.com/x/space/upstat?mid=2026561407获取播放量、点赞量的返回报文中data数据缺失问题排查(已解决)