You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
12 KiB
Markdown

2 years ago
# 15AI变声音频AI技术的集大成者
你好,我是建元。
AI技术在音频领域发展十分迅速。除了我们之前讲的降噪、回声消除以及丢包补偿等方向可以用AI模型来提升音质听感之外AI模型还有很多有趣的应用。其中比较常见的有ASRAutomatic Speech Recognition可以理解为语音转文字TTSText To Speech文字转语音和VPRVoice Print Recognition声纹识别等。
在之前讲音效算法的时候我们知道要做到变声需要改变整个语音信号的基频还需要改变语音的音色。传统算法是通过目标语音和原始语音计算出基频差距和频谱能量分布的差异等特征然后使用变调、EQ等方法来对语音进行调整从而实现变声Voice ConversitionVC
但这些特征的差异,在发不同的音,不同的语境中可能都是不一样的。如果用一个平均值来进行整体语音的调整,你可能会发现有的音变声效果比较贴近目标语音,而有的音,可能会有比较大的偏离。**整体听感上就会觉得变声效果时好时坏。**
甚至由于某些发音在改变了频谱能量分布后,共振峰发生了较大改变,连原本想表达的语意都发生了变化。所以为了获得比较好的变声效果,我们需要实时对语音做动态的调整,而这使用传统算法显然是无法穷尽所有发音、语境的对应变化关系的。
你可能已经发现了如图1所示如果我们可以做到语音转文字文字也可以转语音那么**结合声纹识别VPR把人声的特性加入到TTS之中是不是就可以实现变声的功能了**
先别急接下来我们就基于AI模型的变声算法的角度来整体认识一下这些常见AI算法背后的原理以及它们是如何组合、搭配实现变声功能的。
![图片](https://static001.geekbang.org/resource/image/0d/87/0d8f714257c3fff2c621080a31b94c87.jpeg?wh=1920x562 "图1 基于ASR、TTS、VPR的变声流程示意图")
我们不妨先从ASR算法来看看我们是如何实现语音转文字的。
## ASR
结合图2我们可以看一下ASR算法的基本原理。
语音信号需要转换为频谱信号或者我们之前讲过的MFCC来作为语音特征序列。然后我们根据特征序列推断出对应的音素序列音素在不同的语言中有很多不同的表达形式比如中文可以用汉语拼音来表示。最后根据音素和文字的映射字典lexicon就可以得到语言对应的文本了。
![图片](https://static001.geekbang.org/resource/image/ed/71/ed7cb9dyy4f11e3e5f8f9e034f098271.jpeg?wh=1771x838 "图2 ASR算法的基本原理")
**ASR在音频领域的研究一直都是比较火热的方向。**目前在工业界,使用的最多的是基于[Kaldi](https://github.com/kaldi-asr/kaldi) 开源框架的算法有兴趣的话可以通过链接了解一下。Kaldi模型以及其改进版本有很多这里我主要介绍一下常见的ASR模型的构建方法。
如图3所示为了实现比较准确的ASR系统我们需要构建两个主要的模型**声学模型Acoustic Model和语言模型Language model**。然后通过语言解码器和搜索算法Ligusitic Decoding and search algorithm结合声学模型和语言模型的结果综合选择出概率最大的文字序列作为识别的输出。其中声学模型主要是通过语音数据库训练得到而语言模型则主要是通过文本数据库训练得到。
![图片](https://static001.geekbang.org/resource/image/ea/4e/ea0e354a0e49c17eb4f9883b8432ee4e.jpeg?wh=1920x746 "图3 ASR模型构建方法")
这里你可能会有疑问,为什么我们不能从音频的特征信息直接得到文字输出,而需要这么一套相对复杂的模型系统呢?
这是因为同音字、同音词、谐音、连读等发音特性可能导致很多容易混淆的结果从而同一段语音可能会得到多个备选的文字方案。比如图2中根据音素序列可以得到“今天是几号”也可能是“今天十几号”或者“晴天是几号”等。这时除了声学模型音素读取需要较高的准确性外还需要语**言模型根据上下文的语境来对ASR的结果进行修正**。
其实最近这几年端到端的ASR的研究也有很多不错的进展。比如[ESPNet开源项目](https://github.com/espnet/espnet)里就整合了许多基于CTC、Transformer等技术的端到端开源模型有兴趣的同学可以通过链接自行了解一下。
## TTS
好的了解了ASR的基本原理后我们再来看看文字转语音TTS是如何实现的。
其实语音合成作为ASR的逆过程实现起来主要是先通过一个模型把文字转为语音的特征向量比如MFCC或者基频、频谱包络、能量等特征组合的形式然后再使用声码器Vocoder把语音特征转换为音频信号。
那说到TTS就不得不提及Google发表的两篇重要论文一个是[WaveNet声码器](https://arxiv.org/pdf/1609.03499.pdf),另一个是[声纹识别到多重声线语音合成的迁移学习](https://arxiv.org/abs/1806.04558)。其中WaveNet声码器首次把语音合成的音频结果提升到了和真人说话一样的自然度而VPR结合WavNet则是实现了端到端的文字到语音的生成。你可以在链接中找到这两篇论文。
WaveNet的基本思想是利用因果空洞卷积这种自回归的AI模型来逐点实现音频时域Wave信号的生成。用通俗一点的话来说就是**WaveNet是逐个采样点生成音频信号的**也就是说生成出的第k个点是第k+1个点的输入。这种算法极其消耗算力比如生成一秒48kHz采样的音频需要循环调用AI模型计算48000次才能完成但这样做得到的音频的效果自然度还是很不错的。
为了缩减算力同时保持模型生成的计算速度人们后续对其做了一系列的改进。于是就有了后来的Fast WaveNet、Parallel WaveNet、WaveRNN、WaveGlow和LPCNet等。
如图4所示Fraunhofer IIS和International Audio Laboratories Erlangen就曾联合发布过[一篇回顾的论文](https://xueshu.baidu.com/usercenter/paper/show?paperid=3b94d755401ea9ace11884cf7bfeafbd)主要分析了不同的Vocoder的MUSHRA评分。
![图片](https://static001.geekbang.org/resource/image/c7/a5/c7ffbb97e54ec2e3b637e7cbdee2a0a5.png?wh=1446x714 "图4 不同Vocoder的MUSHRA评分")
在实际使用中为了追求效果可以使用WaveRNN或者WaveGLOW这样效果比较好的模型。但这些模型在服务器端部署还行在移动端部署算力还是过大。移动端上LPCNet或者基于传统算法的World Vocoder是目前比较可行的TTS实现方式。
好的,讲完声码器我们再看看**多重声线语音合成的基本原理**。如图5所示要实现带有任意说话人音色的语音生成需要依赖3个主要的模块也就是 Speaker Encoder、Synthesizer和Vocoder这三个模块。
![图片](https://static001.geekbang.org/resource/image/3e/a7/3e5bc072bd28ed0023b344b1d69c4fa7.png?wh=1255x267 "图5 声纹识别到多重声线语音合成的迁移学习[br]图片来源 https://arxiv.org/abs/1806.04558")
其中说话人的音色和发音习惯等声纹信息可以通过一段事先准备好的说话人语料和一个Speaker Encoder说话人编码器来提取。说话人编码器其实就是我们之前说的VPR声纹识别技术常见的VPR技术有I-vector、x-vector、GE2E、Deep Speaker、RawNet等。
**VPR主要目的就是把说话人的声音特点编码成固定长度的向量SpeakerEmbeding**。好比我们一般用指纹来验证身份而VPR得到的声纹也可以用于身份识别。所以VPR技术其实除了可以用于TTS和变声也可以用于实现身份鉴定、声纹锁等功能。
Synthesizer合成器则是通过音素和声纹信息合成出声码器所需的语谱特征。由于图5中使用的是WaveNet系列的Vocoder所以需要的是对数梅尔谱log-mel spectrogram作为声码器的输入。合成器也有一些现成的框架可以使用比如Google的Tacotron、微软的Fastspeech等。其实合成器的原理都大致相同就是**利用AI模型对音素序列进行编码然后和声纹特征融合在一起再通过Decoder模型得到声码器需要的输入特征。**
## VC
好的在知道了ASR和TTS的基本原理以后现在我们来重新审视一下我们要做的AI变声任务。
假如你想把自己的声音变成目标A的声音只需要经过以下6个步骤
1. 录制一段A的声音
2. 通过VPR得到一个A的声纹Speaker Embeding
3. 录制一段自己的声音;
4. 用自己的声音通过ASR得到音素序列
5. 利用TTS的合成器把A的声纹和ASR得到的音素序列转换为声码器需要的特征
6. 利用声码器得到变声后的音频。
实际上利用上面的技术你只需要利用VPR提取任意目标的声音就可以灵活地实现任意目标声音的转换。但要实现这么一整套VC系统你需要同时实现ASR、TTS这两套可以说是音频领域最为复杂的AI模型。那和很多AI模型一样你可能会想有没有什么办法可以实现端到端的变声呢
答案是有的,尤其是**基于GANGenerative Adversarial Networks技术的变声模型**,例如[Cyclegan](https://paperswithcode.com/paper/maskcyclegan-vc-learning-non-parallel-voice)、[Stargan](https://paperswithcode.com/paper/stargan-vc-non-parallel-many-to-many-voice) 等模型,都在变声领域实现了端到端的变声方案,有兴趣的同学可以通过文稿中的链接了解一下。
## 小结
好的,今天的课程到这里就要结束了。我们来回顾一下这节课的内容。
相比于传统算法基于AI模型的变声可以动态地根据发音的内容来对语音进行调整从而实现更为自然且逼真的变声效果。基于AI的变声模型主要包括了三个模块ASR、TTS和VPR。
Kaldi是目前最流行的ASR框架。Kaldi利用声学模型和语言模型来综合分析提取语音中的音素和文字信息从而提升了文字识别的鲁棒性问题。而常见的端到端模型框架可以采用ESPNet等开源框架在实际使用中目前同等准确性和内容覆盖率的前提下端到端模型和Kaldi框架比较起来算力会更大一些。而且端到端模型如果要针对某个场景做定制时因为要重新训练模型所以受到数据的限制可能会更大一些所以端到端模型目前还没有得到大规模的使用。
TTS技术中WaveNet声码器已经可以让合成语音得到媲美真人声音的自然度。而基于VPR声纹的TTS技术可以实现语音音色根据目标声纹来任意替换这为后续的变声应用提供了一种比较方便的实现方式。
最后变声技术把ASR、TTS和VPR技术融合起来从而实现了高质量的变声系统。在实践中目前这种基于ASR、TTS和VPR的变声系统效果要优于传统音效算法和端到端的AI变声算法。但这套系统的算力、存储空间的复杂性还是很高的在部署和成本方面仍然有很多挑战。
## 思考题
这里留给你一道思考题,其实变声技术要实现实时的变声,依旧是一件极具挑战的事情,主要是需要在延迟和效果中做平衡。你可以思考一下,为什么离线的变声效果会优于实时在线变声,或者换句话说,为什么不引入延迟变声的效果就会变差呢?
你可以把你的答案和疑惑写下来,分享到留言区,与我一起讨论。我们下节课再见。