语音合成就是TTS。
语音合成系统通常包含前端和后端两个模块。 前端模块主要是对输入文本进行分析,提取后端模块所需要的语言学信息。对中文合成系统来说,前端模块一般包含文本正则化、分词、词性预测、多音字消歧、韵律预测等子模块。后端模块根据前端分析结果,通过一定的方法生成语音波形。传统TTS是基于拼接和参数合成技术,效果上同真人语音的自然度尚有一定差距,效果已经达到上限,在实现上也依赖于复杂流水线,比如以文本分析为前端的语言模型、语音持续时间模型、声学特征预测模型、将频谱恢复成时域波形的声码器(vocoder)。
近年来基于神经网络架构的深度学习方法崛起,使得原本在传统专业领域门槛极高的TTS应用上更接地气。端到端合成系统直接输入文本或者注音字符,系统输出音频波形。前端模块得到极大简化,甚至可以直接省略掉。端到端合成系统相比于传统语音合成,降低了对语言学知识的要求,可以方便的在不同语种上复制,批量实现几十种甚至更多语种的合成系统。借助于深度学习模型的强表达能力,端到端语音合成系统表现出令人惊艳的合成效果和强大丰富的发音风格与韵律表现力。2017年初,Google 提出了一种新的端到端的语音合成系统——Tacotron。Tacotron是一种端到端的TTS生成模型。所谓“端到端”就是直接从字符文本合成语音,打破了各个传统组件之间的壁垒,使得我们可以从<文本,声谱>配对的数据集上,完全随机从头开始训练。从Tacotron的论文中我们可以看到,Tacotron模型的合成效果是优于要传统方法的,声谱是什么?声谱就是声音,声音就可以发声,就是如此。
平均意见得分(MOS)mean option socre。
现在是学习它的train该怎么做。看它的,emmm,教程。
LJSpeech
This is a public domain speech dataset consisting of 13,100 short audio clips
of a single speaker reading passages from 7 non-fiction books. A transcription
is provided for each clip. Clips vary in length from 1 to 10 seconds and have
a total length of approximately 24 hours.
The texts were published between 1884 and 1964, and are in the public domain.
The audio was recorded in 2016-17 by the LibriVox project and is also in the
public domain.
好,现在怎么做呢?看来fastspeech是前端,multiGAN是后端,而且是端到端,感觉比较容易吧。
embedding表示的是一个mapping,是指将说话人的特征映射在一个超维空间中,特定说话人A的语音特征X只能被说话人A的语音特征Y所对应。
词嵌入可以做类比题 o v(“国王”) – v(“王后”) ≈ v(“男”) – v(“女”) o v(“英国”) + v(“首都”) ≈ v(“伦敦”) o 反映出语义空间中的线性关系 o词嵌入编码了语义空间中的线性关系, 向量的不同部分对应不同的语义 o 质疑:然而并没有什么x用? o 两个句子: A含“英国”,“首都”,不含“伦敦”;B含“伦敦” o 所有词的词向量的和表示句子 o 两个句子仍会比较相似
反正就是向量空间嘛,理解。
难道fastspeech仅仅是形成向量空间吗?感觉不像唉。。。
语音合成嘛,输入一条字符串,输出语音。但关键是个性化合成,那么就是一条字符串和一个语音特征,输出语音。之前的可以看成默认语音特征。然后怎么做呢?还有tensorflowtts是什么呢?
接下来还需要安装一下才能用
tensorflow-tts-preprocess
这个就能够使用了。但是,emmmm,就会有一些错误了。
当然,如果安装成功了,再跑一遍test。
- phone/sound
任何清晰的语音都是phone/sound - phoneme音素
能区分意义的最小声音单位
比如dog和fog中,d和f只要改变一个就改变了意义。 - voiced/unvoiced
声带振动/不振动
汉语中一般称这两个概念为浊音和清音
什么是语谱图。最通常的,就是语音短时傅里叶变换的幅度画出的2D图。语谱图的x是时间,y轴是频率,z轴是幅度。幅度用亮色如红色表示高,用深色表示低。利用语谱图可以查看指定频率端的能量分布。重要的是要注意到频率和时间值是离散的,每个代表一个“bin”,而振幅是实值。颜色显示在离散坐标(时间,频率)振幅的实值
窄带语谱图就是长窗条件下画出的语谱图。带宽小,则时宽大,则短时窗长,窄带语谱图的带宽小,那么在频率上就“分得开”,即能将语音各次谐波“看得很清楚”,即表现为“横线”。“横”就体现出了频率分辨率高。越分明说明分辨率越高。窗长,则傅里叶变换越有利,则分出的谐波越少,这就是越清晰。
类似的,宽带语谱图的时宽窄,那么在时间上就“分得开”,即能将语音在时间上重复的部分“看得很清楚”,即表现为“竖线”。“竖”就体现出了时间分辨率高。时间分辨率越高,谱图上的竖线看得越清楚。
基音周期表示声带的震动周期,每隔这么长时间(震动周期),有一个气流通过,“每隔”就体现了周期性,这就是基音周期,
- TTS
Text-To-Speech,语音合成,特指从文字合成出语音
- VC
Voice Conversion,声音转换,就是把一个人的声音转成另一个
- ASR
Automatic Speech Recognition,即语音识别,从语音到文字
研究表明,人类不会感知线性范围的频率。 我们在检测低频差异方面要胜于高频。 例如,我们可以轻松分辨出500 Hz和1000 Hz之间的差异,但是即使之间的距离相同,我们也很难分辨出10,000 Hz和10,500 Hz之间的差异。1937年,Stevens,Volkmann和Newmann提出了一个音高单位,以使相等的音高距离听起来与听众相等。 这称为梅尔音阶。
梅尔谱其实就是声谱,分词后的东西,tarcon后就变成梅尔谱,实际上就转换完毕了。数据集呢,是文本-声音文件,因此训练Tarcon,首先至少把声音文件转换成梅尔谱吧,这就是预处理。有了<文本,声谱>配对数据集形式后,我们可以训练了。
我们使用了nohup命令来屏蔽一切中断信号,同时将Python进程置于后台,这是由于训练过程十分漫长(一般收敛需要10个小时,得到好的效果需要2天),免得网络中断或者终端断开导致Python进程被杀死。训练过程中的输出将会保存在logs-thchs30目录下。
所谓对齐并不是一定要笔直的斜线,它只是代表编码器序列(文本)和解码器序列(声谱)是否对应起来,而且像素点越亮,效果越好。 对齐是声码器与解码器的对应。
第二个判断点是loss值,越小表明越接近地真值(ground truth),当然必须在收敛的前提下,loss会趋于稳定。在实际训练中有可能出现loss值很低,但是仍然没出现alignment的情况,这是是无法合成语音的。 当我们从训练日志上看到,loss值低于0.07的时候,基本表示学习收敛并且效果稳定了。可以杀掉后台Python进程,别担心,logs-thchs30目录下已经保存了之前训练过程中产生的模型,你可以从任意时刻生成模型随时恢复继续训练,比如我们需要从92K次迭代生成的模型基础上继续训练,命令行如下:。。。
好了,现在终于到了检验我们录音效果的时刻了!不过我们无法直接输入汉字文本,而是拼音标注,好在有开源项目python-pinyin帮我们搞定. 比如我们想合成一句“每个内容生产者都可以很方便地实现自我价值,更多的人有了微创业的机会。”我们使用python-pinyin输出的拼音标注拷贝到eval.py里,输入命令行:
> python3 eval.py --checkpoint logs-thchs30/model.ckpt-133000
一段时间后,就会在logs-thchs30目录下生成了eval-133000-0.wav,这就是我们想要的结果,一起来听听看吧~
但tensorflowtts是干什么的?哦,tensorflowtts相当于框架,什么tarcon,fastspeech都是里面的内容,就好像tensorflowtts是支付宝,tarcon,fastspeech是支付宝里面的各种金融小公司。但我们要实现个性化合成。
目标人只要少量语音,无需重新训练模型,即可抽取对应的Embedding,实现个性化合成。那么它作用于哪里呢?
FastSpeech2,它抛弃了Teacher-Student知识蒸馏框架降低训练复杂度,直接用真实的语音数据作为训练目标避免信息损失,同时引入了更精确的时长信息和语音中的其它可变信息(包括音高(Pitch)和音量(Energy)等)来提高合成的语音质量。那么它直接合成语音吗?那么它还需要melgan干什么?
声学特征,通常为Mel谱,输出是声学特征对应的语音波形。
个性化合成
Speaker Embedding大概是嵌入到fastspeech中,就是这样的。
目前大多数方法不是直接对原始时间音频建模,而是通过对原始音频信号进行较低分辨率表示后再进行建模。这就是梅尔谱。
选择这样的表示形式比使用原始音频更容易建模,同时也保留足够的信息再次转换回音频。这种低分辨率的表示我们称之为音频的中间形式,目前主流的中间形式表达有两种,对齐的语言特征[1] 和 Mel 频谱图[2]。由音频的中间形式转换为原始音频是一项很大的挑战,不过目前倒是已经有一些方法去实现这个转换。这个转换过程可分为三大家族:纯信号处理技术,自回归和非自回归神经网络。
纯信号处理:较早的 Griffin-Lim 算法 [3]使人们可以有效地将 STFT 序列解码回时间信号,而代价是要引入了伪像。
基于自回归神经网络模型:WaveNet [1]是一种完全卷积的自回归序列模型,可生成高度逼真的语音样本,该样本与原始音频在时间保持对齐为条件,同时它还能够生成高质量的无条件语音和音乐样本。SampleRNN [5] 是一种执行无条件波形生成的替代架构,该架构使用多尺度递归神经网络以不同的时间分辨率显式建模原始音频。WaveRNN [6]是一种基于简单单层递归神经网络的更快的自回归模型。然而,由于这些自回归模型必须依次生成音频样本,因此对这些模型的推论本质上是缓慢且效率低下的,所以自回归模型通常不适合实时应用。
基于非自回归神经网络模型:并行 WaveNet [7] 和 Clarinet [8] 将经过训练的自回归解码器提炼成基于流的蒸馏模型。WaveGlow [9]是一种非常高容量的生成流,由 12 个耦合和 12 个可逆 1×1 卷积组成,每个耦合层由 8 层膨胀卷积的堆栈组成。然而,这些基于非自回归模型的一大弊病就是训练成本太高,往往需要耗费长时间在训练上。
MelGAN 的优势:
1. MelGAN 是一种非自回归前馈卷积架构,是第一个由 GAN 去实现原始音频的生成,在没有额外的蒸馏和感知损失的引入下仍能产生高质量的语音合成模型。
2. MelGAN 解码器可替代自回归模型,以生成原始音频。
3. MelGAN 的速度明显快于其他 Mel 谱图转换到音频的方法,在保证音频质量没有明显下降的情况下比迄今为止最快的可用模型快 10 倍。
MelGAN 是基于 GAN 实现的,整体结构不难理解就是由生成器和判别器组成,生成器的输入是 Mel 谱图,经过一层 Conv 层后送到上采样阶段,经过两次 8× 后再经过两次 2×,每次上采样中嵌套残差模块,具体的设计目的我们后面详细展开。最后经过一层 conv 层得到音频输出,由于音频的 channel 表示为 1,所以最后一层的 channel 设为 1。对于判别器,则是采用多尺度架构,也就是除了对原始音频做判别,还对原始音频做降频处理后再馈送到判别器下进行判别,这里的降频方式采用 Avg pooling 方式。判别器的内部模块设计主要是卷积层和下采样层得到,后续做详细展开。GAN 的训练向来是不太稳定的,为了实现比较好的音频生成,作者也是在生成器和判别器的设计上下足了功夫。
GAN 在做图像生成的时候常常伴有棋盘状伪影的出现,这个对应到音频生成中表现为可听到的高频嘶嘶声,为了改善这种”伪影”现象,文章通过仔细选择反卷积层的内核大小和步幅来解决此问题,使用内核的大小为跨度的倍数(如果步长为 8,则内核大小则为 16),为了防止空洞卷积层导致的”伪影”,模型确保空洞随核大小的增长而增长,从而使堆栈的接受域看起来像一个完全平衡且对称的树,核大小则作为分支因子。