深度学习系列69:tts技术原理

2024-09-03 04:36

本文主要是介绍深度学习系列69:tts技术原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

tts为text-to-speech,asr为Automatic Speech Recognition,即speech-to-text。

1. 常用基础模型

下面介绍的deep voice是端到端生成语音的模型,后面两个是生成Mel谱,然后再使用vocoder生成语音的模型。

1.1 Deep voice

目前端到端的是主流,其整体流程如下图:
在这里插入图片描述

步骤1:语素转音素

在这里插入图片描述
用的比较多的是语素(phoneme)和字母(grapheme)。这里介绍语素为token的步骤:
· White Room - [ W,AY1, T, ., R, UW1, M,. ]
· Crossroads - [ K,R, AO1, S, R, OW2, D, Z, . ]
上述例子源自于CMU的音素字典,其中,音素旁边的1,2等数字表示应该发重音的位置,句号表示音间停顿。在大多数情况下,通过查询标准音素字典(比如CMU的音素字典),可以得到与输入文本一一对应的标签。
如果出现音素字典没有覆盖的词,Deep Voice使用神经网络来实现这个功能。准确来讲,它沿用过了Yao和Zweig在微软进行的Sequence to Sequence(Seq2Seq)的学习方法来进行文本对应的音素预测。

步骤2:预测每个音素的持续时间和基频

[IH1, T, ., W, AA1, Z, ., ER1, L, IY0, ., S, P, R, IH1, NG, .] -> [IH1 (140hz, 0.5s), T (142hz, 0.1s), . (Not voiced, 0.2s), W (140hz, 0.3s),…]
分割模型将每个音素发声的场景进行匹配,从而获取其对应的音频分割片段和其在音频中的发声位置。
在这里插入图片描述
对独立单个的音素而言,给定语音对应某个音素的概率在语音的发声正中最大;而对成对的音素而言,概率最大值出现在两个音素交界点上,因此分割模型的预测结果是因素对。
在这里插入图片描述

步骤3:将音素,持续时间和基频结合从而输出文本对应的语音

[IH1 (140hz, 0.5s), T (142hz, 0.1s), . (Not voiced, 0.2s), W (140hz, 0.3s),…] -> 音频
原始音频通常保存为16Bit规格 ,对每个时刻输出的可能值 ,softmax层将需要输出65536个值。先将 [-32768, 32767] 的范围线性压缩成 [-1, 1],然后再通过一个名为 μ-law 的算法,然后再将其拉回 [0, 255] 范围中。

1.2 Tacotron

Tacotron用的是一个典型的 Seq2Seq + Attention 的模型架构。它输出还会有个后处理(Post-processing)才会产生声音频谱(spectrogram),紧接着使用decoder生成声音。
在这里插入图片描述

步骤1:encoder生成向量

Encoder 的目的就是输入进一些字母和标点符号,输出一堆向量,类似于转为phoneme向量,告诉Decoder和注意力模块这些字母应该怎么发音。
在这里插入图片描述
对于 Encoder,我们也可以加上文法的信息。文法会将一句话切割成各类成分,比如主语宾语名词等,这将对一个句子的语气、停顿等起到作用。

步骤2:Tacotron Attention

attention模块的目的就是让机器能自动学习到每一个字母所代表的 embedding 在 decoder 那里会产生多长的声音讯号。而单调对应就意味着当我们将注意力可视化(x轴表示文字embedding,也就是编码器的输出,y轴表示音频,也就是decoder的输出),生成的可视化图案应该是呈对角线分布的。

步骤3. Tacotron Decoder

这里采用的Decoder其实就是Seq2Seq里面的Decoder,产生的vector就是Mel-spectrogram。在Decoder之后,Tacotron还有一个Post Processing(后处理模块),其第一代就是一个CBHG,第二代是一堆卷积层。它会把解码器输出的全部向量当作输入,然后再输出另外一排向量。
第一代的 Tacotron 用的是一个基于规则的 Vocoder,第二代就用上了 Wavenet。

1.3 Fast speech

Fast speech同样有 Encoder 转 character 为 embeddings,不同的是在编码器和解码器之间单独训练了 Duration 模块,可以预测每个 character 要念多长。这个 Duration 模块会输入一个单词嵌入,输出每个字符要说的长度。比如输出是2,它就要把当前的字符嵌入复制两次。
在这里插入图片描述
FastSpeech 使用了 Duration 模块的好处是,它不会像 Tacotron 或 基于 Transformer 的 TTS 那样,有一些发音上的瑕疵,比如结巴,跳过词汇没念,念错词汇的情况。直觉上看,FastSpeech 在 Duration 上做了一个更大的限制,来避开这些错误。

2. 常见Vocoder模型

Vocoder:当涉及语音合成时,vocoder是一个重要的组成部分,它负责将数字化的语音信号转换回可听的声音。Vocoder是“Voice Coder”的缩写,它是一种处理语音信号的算法或设备,用于分析和合成声音。它接收数字信号(通常是通过语音识别等手段得到的),并对其进行处理,使之变成人耳能够理解的声音信号。
首先我们大概讲一下 Vocoder 是干什么的。之前说过,一般在模型中操作的都是声谱 spectrogram,而 Vocoder 就是将 spectrogram 转为我们可以听的声音信号的。但是spectrogram只包含了振幅信息,不包含相位信息,无法直接还原为声音。
在这里插入图片描述
Griffin-Lim算法是一种启发式方法,用于估计音频信号的相位信息,从而实现从幅度谱(amplitude)重建时域波形(waveform)。这个算法特别适用于声音合成或音频重建的场景。这个算法的基本思想是:通过对幅度谱的估计和随机初始化重建频谱的相位,然后反转这些估计的频谱,再次应用STFT来获得新的时域波形。然后重复这个过程,迭代多次,希望最终获得合理的相位估计。不过它生成的语音听起来还是不太自然。
为什么 Vocoder 要单独拿来研究,而不是接在 TTS、VC 等模型后面直接做 End2End 训练呢?因为 Vocoder 是将频谱图转为波形的方式,只要生成的是频谱图,就可以使用 Vocoder,这使得其泛用性很高,而其他模型的生成目标就变成了生成频谱图,这会降低整个任务难度,使得它们能够更加专注于声音信号的处理。
下面是一些常见的vocoder
在这里插入图片描述
在这里插入图片描述

2.1 waveNet:PixelCNN自回归

其本质上就是一个自回归模型(autoregressive model),主要构成成分就是因果卷积网络(Causal Convolution Network)。我们首先看下wavenet的结构:
在这里插入图片描述
Causal Convolution(因果卷积):是卷积神经网络中的一种卷积操作,它具有一种“因果性”约束,即输出中的每个元素只能依赖于输入序列中其之前的元素。这种约束在处理时间序列数据时非常有用,因为它确保模型不会“未来”依赖于当前时间步之后的信息。
因果卷积存在的一个问题是它需要很多层,或者很大的卷积核来增大其感受野。例如,在上图2中,感受野只有5个单位 。(感受野 = 层数 + 卷积核长度 - 1)。因此WaveNet使用扩大卷积使感受野增大几个数量级,同时不会显著增加计算成本。
在这里插入图片描述
为了更方便快捷地计算,需要先对数据实施一个µ-law压扩变换,然后取到256个量化值。µ-law压扩变换算法如下:
在这里插入图片描述
这种编码方式能够在保留音频信号主要特征的同时,通过压缩和量化来减小数据量。
对于PixelCNN,在生成过程(推理过程)是序列处理的,此时需要逐个pixel进行预测,速度很慢,下面的FFTNet则将速度提高到logN级别。 ​

2.2 FFTNet:1*1核的自回归

FFTNet 和 WaveNet 一样也是自回归模型。不一样的是,它将其中的深度 CNN 改成比较简单的计算方式,输入的数据首先会被切成两段,分别为 xl 和 xr,通过不同的 CNN 再加起来得到 z,然后通过一个 ReLU,一个1×1 CNN,一个ReLU,得到新的 x,然后再进行和上面一样的操作。因为相加的操作,每通过一层,输入的数据大小就会减半,最后大小变成1的时候,这就是最终的输出。
在这里插入图片描述

2.3 waveglow:基于flow函数

在这里插入图片描述
从数学的角度来解释就是下面这样:
在这里插入图片描述
这里的z就是平均值为0,标准差为1的高斯分布。
在这里插入图片描述
在这里插入图片描述

2.4 HiFi-GAN:利用GAN优化

HiFi-GAN包括一个生成器和两个判别器,生成器的架构如下图所示,由多个MRF堆叠而成。MRF是用于上采样的反卷积运算模块。
在这里插入图片描述
因为语音信号是由不同周期的正弦信号构成,对周期信号进行建模对于生成实际的语音信号而言,十分重要。**因此,文章提出针对一个有多个鉴别器构成的大鉴别器,每一个小鉴别器固定获取某一周期的原始波形。**这个模型是模型合成真实声音的基础。
使用了两个判别器,一个是multi-period discriminator (MPD),用来识别语音中不同周期的信号,另一个是MelGAN中的multi-scale discriminator,用来应对超长数据。
MPD是由若干子鉴别器构成的,每一个子鉴别器只接受音频的等间距样本,这个间隔是由周期给出的。**子鉴别器主要是通过查看输入音频的不同部分,来获取彼此不同的隐式结构。**我们将周期设置为[2,3,5,7,11]来尽量减少重叠。如图二b中展示的一样,我们将一维的长度为T的原始音频数据转换为2维的数据,宽为p pp,长为T / p T/pT/p,然后对其使用二维卷积处理。MPD中每一个卷积层,我们将卷积核宽度设置为1,来单独处理某一個周期的样本。每一个子鉴别器是一个跨步卷积层,激活函数为 ReLU。然后,对MPD进行权重归一化,通过将输入数据转换成二维数据,而不是直接对周期信号进行采样,MPD的梯度可以传递到输入音频的所有时间步长。
在这里插入图片描述
MPD是检测不同周期的采样点,按照一定的空间间隔进行采样,本来就是离散的。MSD是对光滑的波形图进行整体卷积采样,是连续,是为了弥补MPD的离散的缺点。它是一个多尺度鉴定器,来实现对于音频序列的连续感知,由三个子鉴定器混合而成,每一个子鉴定器都是针对不同的输入尺度,分别是原始音频、2倍平均池化音频、4倍平均池化音频。
MB-iSTFT-HIFIGAN加上了诸多轻量化手段,概括来说就是用类似诸如短时FFT等工具代替卷积计算。

2.5 vocos:进行了相位预测

Vocos 是一款设计巧妙的快速神经声码器,它能够从声学特征中合成音频波形。利用生成对抗网络(GAN)的目标训练,Vocos 实现了仅通过一次前向传播即可生成音频波形的能力。与众不同的是,Vocos 不直接在时间域内建模音频样本,而是生成频谱系数,借助逆傅里叶变换快速重构音频。
与HiFigan比,显著的区别在于,vocos不仅对幅度谱进行预测,还要对相位进行预测,即图中希腊字母 ϕ \phi ϕ。主体结构中,采用ConvNeXt block(mobilenet方式),有一定的加速作用。也因为没有转置卷积,也不存在必须要用dilated卷积增加感受野的问题。这也是作者不采用dilated的原因。
在这里插入图片描述

这篇关于深度学习系列69:tts技术原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132040

相关文章

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N