苹果接入GPT-4o,Siri史诗级加强背后的语音技术是如何实现的?

 


👉目录


1 语音的离散化:向 LLM 看齐!

2 让 LLM 理解语音 token!

3 LLM 如何合成语音:Zero-shot TTS

4 其他问题

5 对游戏配音业务的思考

6 全文总结




OpenAI 最新推出的生成模型 GPT-4o,带来了一系列震撼的功能,用技术彻底颠覆了产品形态。产品最大的亮点在于:以近乎完美的交互方式,为每位用户带来 GPT-4 级别的智能体验。

在语音方面,GPT-4o 做到了实时低延迟,平均响应时间与人类反应速度相当,输出的语音能够理解极度贴合对话上下文,能够理解人类的情感情绪,听觉质量上佳,与真人无异。这背后的技术实现,是怎么做到的?



在本周举办的苹果全球开发者大会 WWDC 上,苹果发布了其自研的「Apple Intelligence」AI,并宣布发布多年以来一直不温不火的 Siri 语音助手将接入改写了人机交互历史的 GPT-4o——打不过就加入。

马斯克在 X(原Twitter)上的连番炮轰,为这个新闻增添了又一轮热度,他表示倘若苹果在操作系统层面集成 OpenAI,他就将禁止其设备进入自己旗下的公司,指责苹果这是出卖用户数据。并且配了一张意味深长的图:


技术背后的八卦与口水战,看看就好,技术人还是要回归技术的本源,去了解那些真正底层的知识价值。为什么 GPT-4o 的出现改写了人机交互?又为什么 GPT-4o 的语音技术颠覆了此前所有的语音助手功能?本文作者将为你详细解析。


GPT-4o 是一个 any2any 的多模态模型,能够接受文本、音频、图像、视频等多模态输入,也能够生成包含文本、语音、图像和视频等混合内容的多模态输出。限于篇幅,本文主要谈谈语音多模态的实现,并分享一些对于语音研究未来发展的看法。
当我们主要关注文本和语音模态时,GPT-4o 其实就是一个语音语言模型(speech language model, SLM)。该 SLM 同时具备语音理解能力和语音合成能力,输入端和输出端均支持文本和语音的混合多模态。那么,这一 SLM 应该如何实现呢?在大语言模型(large language model, LLM)滥觞的今日,不难想到这样一种方法:将连续的语音数据离散化成如同单词(或者称 token,词元)一样的表示,并入到 LLM 的词表中,再走一遍训练 LLM 的老路。
基于上述思想来构建 SLM,需要解决以下几个问题:
  • 语音如何离散化?
  • 如何让 LLM 理解语音的 token?加入语音 token 之后,LLM 在语音数据的理解上是否具有涌现性?
  • LLM 如何合成/解码语音?

接下来,我们按图索骥,分别看看上述三个问题应该如何解决。看完现有的方案之后,也会谈谈一些关于工程实现的思考以及新兴语音技术对于游戏业务的影响。最后,我会给出一个完整的 roadmap 来收束全文。


01



语音的离散化:向 LLM 看齐!
在谈及语音离散化之前,我们先来看看语音和文本作为两种不同的模态,有什么区别,有什么联系。这直接关系到后文建模方法的选择以及离散化特征的关注点。
语音和文本的差别主要体现在:文本离散、序列短、信息密度高(几乎每个词都包含语义);语音则连续、序列长、信息密度低。语音序列长、信息密度低的特点,意味着语音数据有很大的压缩空间,这一点和图像非常类似。因此,一些用于图像的离散化压缩方法也可以用在语音上。
除了差异,语音和文本也有一定的联系:语音是文本的超集,既包含文本内容(说话人说了什么,也就是语义信息),也包含语音特有的音色、韵律、语速等声学信息(也叫做副语言)。既然语音包含文本,那么在 NLP 中预训练语言模型也可以用来建模语音中的上下文依赖关系,从而得到语音的离散化 token。基于这些方法得到的 token 主要包含语音的语义信息。
花开两朵,各表一枝。我们先来看看语音的语义 token 如何获取。
   1.1 语义 token:  用 MLM 建模语音的上下文依赖


语音的语义建模方法,最常用到的就是 BERT 的 MLM 方法,比较经典的工作有三个:wav2vec 2.0[1]、HuBERT[2]和 w2v-BERT[3]。
类似于 BERT,wav2vec 2.0[1]在隐空间(latent space)随机 mask 了一定比例的语音输入,然后用基于对比学习的训练目标学习帧的表征。值得注意的一点是,对比学习中目标帧的离散化处理是一个非常巧妙的操作,它将无限的连续特征空间坍缩为有限的离散空间,让帧特征的鲁棒性更强了。这在语音领域上非常有用的 trick,允许模型接受带有噪声的语音作为输入。
图1:wav2vec 2.0 的模型架构
wav2vec 2.0 只是借用了 BERT 中 mask 的操作,训练目标大体上是基于对比学习的范式。那么,能直接用 BERT 的 MLM 建模目标来得到高质量的语音表征吗?其后的 HuBERT[2] 做的就是这个事情。HuBERT[2] 的核心点在于使用简单的 KMeans 聚类方法为语音数据抽取离散化的分类标签,也就是文中所说的 hidden unit/acoustic unit。有了分类标签,然后就是用 BERT 的 MLM loss 来学习语音数据中内在的上下文依赖关系。对于 KMeans 聚类对初始值和K值高灵敏的特点,作者设计了 ensemble 和 iterative refinement 方法予以解决。前者就是多个聚类模型 ensemble,后者就是先在基于 MFCC 的聚类标签上进行学习,学习到一定程度时,在模型学习到的表征重新聚类,再做一次 BERT 的学习。
图2:HuBERT 的模型架构
既然对比学习可以学习语音的语义表征,BERT 的 MLM 也可以,那将二者结合起来,会不会有互补的效果呢?w2v-BERT[3]做的就是这个事情。注意到:HuBERT 中语音的离散 token 不是端到端获得的,需要用 KMeans 算法对特征进行离线聚类,而 wav2vec 2.0 又正好提供了音频帧的量化离散表征,HuBERT 和 wav2vec 2.0 很容易就能缝合在一起。缝合的方法也是显然的:前面若干层做类似 wav2vec 2.0 的对比学习,学习出 HuBERT 要用的离散表征,然后在后面若干层做类似 HuBERT 的 MLM 训练。
图3:w2v-BERT 的模型架构
   1.2 声学 token:压缩+离散


上一部分介绍的预训练模型做的是上下文关系的预训练,学习到的表征主要包含与上下文相关的语义信息。要想将语音的 token 还原成为真正具有真人表现力的信号,还需要有包含音色、韵律、语速等副语言信息的声学特征。声学特征的学习在很大程度上参考了图像领域的工作,用到的主要是类似于 VQVAE[4]、VQGAN 等的离散化压缩方法,并针对语音数据的特性做了优化。这一部分比较经典的工作就是 SoundStream[5] 和 Encodec[6],二者的工作高度类似,我们放在一起来看。
说到压缩,最先想到的模型当然就是 AutoEncoder(自编码器)。为提升压缩效率,有利于数字传输和存储,以及离散化建模的要求,压缩模型中还需要包含量化(quantization),将连续的音频信号转换为离散的数值。基于上述考虑,模型大体上应该是 VQVAE[4] 的结构。为了平衡 VQ(Vector Quantization,向量量化)与音频实时高保真传输的矛盾,通常采用多个残差连接的 codebook 来进行量化,这个就是所谓的 RVQ(具体分析过程可以参见知乎文章)。采用 RVQ 的好处主要有两个:其一,区分不同 quantization block 的分工,第一个 block 包含最重要的语义信息,后续的 block 包含还原语音的副语言信息;第二,模型训练时可随机采样前面若干个 block 来训练,保持一定精度,实现对比特率的动态适应。
总而言之,SoundStream[5]/Encodec[6] 其实就是一个 RVQ-VAE,它们所建模的语音离散化 token 包含了层次化的语义信息和声学信息。
图4:Encodec 的模型架构
   1.3 语音的统一表征?


不难发现,虽然说 SoundStream[5] 和 Encodec[6] 这样的基于 RVQ-VAE 的压缩建模方法包含了语音的声学特征,但其中也不可避免地带入了语义特征。二者提取的实际上更像是一种语义特征和声学特征的混合体。基于此,SpeechTokenizer[7] 在二者的基础上,引入了语义引导信息来解耦语义特征和声学特征。语义特征和声学特征的解耦对于最终的语音合成有着相当的重要性。SpeechTokenizer 的具体做法是:使用 HuBERT[2] 的特征对 RVQ1 的特征做语义蒸馏,其余部分保留声学信息。
图5:SpeechTokenizer 的模型架构
   1.4 语音的其他表征:MEL依旧有用!


上述的语音离散表征,不管是基于 HuBERT[2] 的语义 token,还是基于 Encodec[6] 的声学 token,它们都是直接基于原始的音频波形抽取的。除此之外,也可以基于语音的中间表征来抽取。最典型的语音中间表征就是梅尔谱(MEL spectrogram,下文简称 MEL)。梅尔谱本身就对语音进行了压缩,将梅尔谱类比于图像,使用单码本的 VQ 也可以达到与 SoundStream 和 Encodec 那样类似的压缩程度。这种 MEL+VQ 的做法在各种语音合成模型中也相当常见。我们在语音合成部分会详细介绍。


02



让 LLM 理解语音 token!
有了上面所说的语义 token 和声学 token 之后,其实就可以利用它们来构建语音层面的语言模型了。比较经典的工作有:谷歌的 AudioLM[8] 和 AudioPaLM[9]、字节的 SALMONN[10]、复旦的 SpeechGPT[11]/SpeechGPT-Gen[12]/SpeechAlign[13]、阿里的 LauraGPT[14]和新加坡国立大学的 NextGPT[15]。它们的做法其实都大差不差,我们看几个就知道是怎么回事了。
   2.1 AudioLM:最初的 SLM


见名知义,AudioLM[8] 构建的是语音层面的语言模型——给定一段语音,模型预测后续的语音。输入侧和输出侧都只有语音模态。这个任务形式和 GPT-4o 非常类似,不会经历 ASR->LM->TTS 的过程,而是直接从语音上下文中推理语义信息,再结合声学信息合成贴合上下文的高表现力语音。而上文所述的语义 token 和声学 token 正好就能满足这个任务的要求。
AudioLM 的具体做法是:用 SoundStream[5] 提取声学 token,用 w2v-BERT[3] 提取语义 token,模型主体就是一个常规的 GPT,词表包含所有的声学 token 和语义 token。它的建模过程也相当有意思,有很大的参考意义:先做最重要的语义建模,然后先预测 SoundStream 的前若干层特征,建模粗糙的声学特征,在预测 SoundStream 的剩余层特征,建模声音的细节信息,最后基于所有的声学 token 还原为语音。这种层次化的建模在诸如 VALL-E[16] 这样的语音合成模型中也非常常见。
图6:AudioLM 的 tokenizer
图7:AudioLM 的建模流程
当然,AudioLM[8] 仅仅关注语音模态,LM 也很常规,不具备如同 GPT-4o 一样强悍的指令遵循能力和对话能力,语音对话的连贯性和表现力都相当弱。但这一工作仍然具有相当的启发性和开拓性,证明了:即使是常规的 LM,照样也能理解语音 token。
   2.2 AudioPaLM[9]:整合 LLM


这个就是 AudioLM 的后续了,谷歌将常规的 LM 替换成已经训练好的、具有强大文本理解能力和生成能力的大语言模型——PaLM-2[17],既继承了 AudioLM 保留副语言的能力,又融合了 PaLM-2 强大的语义理解能力和推理能力。而且,该模型的词表同时包含大语言模型的 token 和语音 token,可以同时做语音理解任务和合成生成任务,第一将这些任务整合在一个模型中进行解决。
不过,需要指出地是,文中的语音 token embedding 是直接输入到 Transformer 中的,并没有使用音频编码器做一次转换。而且,AudioPaLM 的训练更加接近文本多任务的 T5,并未用到复杂的、丰富多样的指令来表达任务的意图,还不能算是真正严格的 instruction fine-tuning。
图8:AudioPaLM 的模型架构
   2.3 SALMONN[10]:让LLM理解语音


这是字节跳动和清华大学电子系(也是我们实验室)的合作成果。虽然这个工作的目的是让 LLM 能够理解语音,还不能生成语音,但它的训练方法和 LLM 比较接近,而且在诸多语音相关的任务上都显示出了涌现性,可以用作 universal 的特征提取器,这对于构建高质量的、包含语音-文本多模态的指令微调数据集具有相当大的意义。
图9:SALMONN 的模型架构
   2.4 SpeechGPT/SpeechGPT-Gen/SpeechAlign:向LLM的训练方法看齐


这算是复旦大学邱锡鹏组在这个领域一个成系列的工作,我们一个一个来看。
SpeechGPT[11] 做的也是兼具语音理解能力和语音生成能力的多模态模型。在模型的训练上,SpeechGPT 大幅度向 LLM 看齐,使用了三段式的训练方法:第一阶段先做模态适应的预训练,其实就是拿 ASR 的语音数据来做预训练;第二阶段和第三阶段都是指令微调,不过根据指令模态的不同,细分为了跨模态的指令微调和模态链指令微调。指令微调的数据集都是来自 ASR 数据集。描述任务需求的指令由 GPT-4 生成。
在我看来,这个工作还是相当偏学术化的作品,文中有不少点都有值得商榷的地方:第一,语音的离散化仅仅用了 HuBERT[2],模型只能看到语音的语义特征,这对模型合成语音的音质和表现力有非常大的影响,demo 的语音也验证了我的判断;第二,指令微调数据集的构造上有问题。他们用的是 ASR 数据集,其实更好的选择应该是 TTS 数据集,可惜高质量的 TTS 数据集实在是太少了。ASR 数据集中的文本和语音可能并不是严格对齐的,GPT-4 产生的 meta-prompt 和语音本身的特征也有可能是对不上的,比如 prompt 要求大声朗读,但语音本身可能是特定低沉的。meta-prompt 本身就无法做到足够复杂丰富,不能描述到语音的一些细粒度信息。这一部分,最好要有像诸如 SALMONN[10] 这样的多模态语音理解模型的介入,像 DALLE3 一样丰富指令的多样性。至于语音方面,可以考虑引入 zero-shot 的语音合成模型或者变声模型来做合成数据。第三,文中的训练方法也没有与人类偏好做对齐。
图10:SpeechGPT 的模型架构
对于上面的第一个问题,作者在其后的 SpeechGPT-Gen[12] 中做了解决。解决思路的核心点就是:让模型不仅看到语音的语义 token,也要看到语音的声学 token。具体做法是:SpeechGPT 的 HuBERT 特征替换成了 SpeechTokenizer[7] 中的语义特征,用 SpeechGPT 这一 LLM 来自回归地建模语义特征,有了语义特征之后,再使用 Flow-Matching 这样的扩散模型来建模声学特征。这里选用 Flow-Matching 扩散模型,可能是受了 SD3 和 Voicebox/Audiobox 的影响。为了增强两阶段建模的依赖关系,作者将语义特征的先验信息注入到第二阶段扩散模型的先验分布中。可以看到,这里语音的解码其实也是一种层次化渐进式解码。
图11:SpeechGPT-Gen 的模型架构
SpeechAlign[13] 做的则是 SLM 与人类偏好的对齐,彻底地向 LLM 的训练方法看齐。该工作构建了对比 gold token 和合成 token 的 encodec 数据集,然后进行偏好优化来进行改进。使用的偏好优化方法包括 RLHF 和 Chain of Hindsight。
图12:SpeechAlign 的流程图
简单总结一下上面这些工作中值得关注的点:
  1. 要想让 LLM 输出上下文连贯的高表现力语音,必须要让 LLM 看到语义 token 和声学 token,只有语义 token,那语音就会显得呆板机械,只有声学 token,那语音就不知所云;
  2. LLM 的指令微调同样可以迁移到语音-文本多模态领域中,LLM 的指令微调同样可以带来如同 NLP 一样的涌现性;
  3. 高质量指令微调数据集的构建应该是最大的瓶颈!一下子让 LLM 同时做语音理解和语音生成,难度非常大。不如分步进行。
  4. 如果要分步进行的话,要先实现一个类似于 SALMONN[10] 那样的多模态理解模型和一个强大的 Zero-shot TTS 模型。前者用于给语音数据打上丰富的标签,可以是情感情绪、韵律、音高、语速,也可以是口音、意图和说话环境;后者则用于生成高质量的语音数据。毕竟,高质量的、文本和语音严格对齐的 TTS 数据实在是太少了,尤其是中文领域。有了这两个模型的加持,我们其实就能够构造出高质量的指令微调数据集。我不知道 OpenAI 是否有 SALMONN 这样的模型,但 OpenAI 的 OpenVoice 模型应该足够为其提供高质量的语音数据了。

既然我们在上面的篇幅中论述了语音理解多模态模型的构建,那我们在下一部分就重点关注 zero-shot TTS 模型,它对高质量指令微调数据集的构建同样至关重要。同时,LLM 解码语音的方法也能从 zero-shot TTS 方案中得到不少的启发。


03



LLM 如何合成语音:Zero-shot TTS
前面说到,SLM 表中包含了语音的语义 token 和声学 token。语义 token 保证生成语音与对话上下文的连贯性,声学 token 保证了合成语音的质量和表现力。要想做到合成上下文连贯的高自然度语音,有两个问题必须要解决:
  1. 语音既有语义 token,又有声学 token,应该要如何解码成语音?
  2. SLM 在合成语音的过程中是否能够遵循多轮对话中的文本指令和语音指令?这个很重要!这允许模型根据用户的即时要求来生成语音回复。比如说,OpenAI 演示视频中出现的:“将语速提高两倍”、“采用更加机械化的语气”这样的要求。

对于第一个问题,以 VALL-E[16] 为代表的诸多 zero-shot TTS 模型给出了不同的解决方案,这些方案虽有不同,但也有不可忽视的共同点;对于第二个问题,以 VoiceLDM[18] 和 ParlerTTS[19] 为代表的 text/prompt-guided zero-shot TTS 工作给出了肯定的答案。简单解释一下 text/prompt-guided zero-shot TTS 是怎么回事,通常的语音合成就是将文本(transcription)转换成声音,该任务在 transcription 之外,又增加了 description 的输入,来描述合成语音的情感情绪、口音、语气、语速、音高、说话环境、氛围等等信息。我们逐个来看这些工作。
   3.1 Zero-shot TTS


2023年以来,学术界和工业界出了不少具备 in-context learning(zero-shot/few-shot)能力的 TTS 模型。这些 TTS 模型通常会将低信息密度、长序列的连续语音数据压缩为高信息密度的 tokens 或者 latents(其实就是码本中具体的token embedding)。这些模型本质上做的事情就是:如何高效实现语音tokens/latents到音频波形的映射。
这些模型给出的解决方案基本上都遵循一个准则:语义 token 和声学 token 层次化解码,先语义后声学,或者先解码成 MEL 再后接声码器,并且非必要不做自回归(毕竟自回归上线虽高,但太吃数据了)!我们一个个来看。
基于声学 token 或语义 token 的工作
先是微软的 VALL-E[16]。这是 zero-shot TTS 的开山之作,首次在 TTS 任务上采用了上万小时的数据。它采用 Encodec 将语音转换为离散的 token,然后用 GPT 在 token 上做语言模型的任务。但是,语音毕竟不是文本,如果直接在语音的所有特征上都做自回归的话,那训练的成本会相当高。考虑到 Encodec RVQ 特征的层次性,低层特征表示语义内容这样的重要特征,高层特征则表征声学细节。前者具有比较强的上下文依赖关系,适合用自回归来建模,后者诸如音色这样的特征,具有全局性,用非自回归特征也可以搞定,所以就有了 VALLE 中自回归+非自回归的层次建模方式。
图13:VALL-E 的模型架构
尽管 VALL-E[16] 在用 GPT 建模 token 的上下文关系的时候,基于 token 的层次化特性做了分治处理,可能是限于当前语音数据集的规模(几万小时可能不够),这种 GPT 自回归的难度还是相当大的,解码过程存在常见的错误传播现象,鲁棒性非常差,极其不稳定。根据 Ilya Sutskever 此前对于自回归的论述,GPT 自回归相比于 BERT 这种双向结构是非常 data-hungry 的,万小时的数据可能不够。根据本人以及一些同行的经验,VALL-E 模型这一类的自回归模型,也包括 tortoise-tts[20] 和 xtts v2,要想显出威力,至少要有十几万小时的数据才行。
既然 GPT 自回归的难度这么大,就有不少人想方设法地来降低 GPT 学习的难度了。他们的解决方案也非常类似:给 GPT 提供额外的条件信息不就行了。比较典型的工作就是微软的 RALL-E[21] 和吉利的 HAM-TTS[22]。RALL-E 先生成了时长信息和音高信息,作为 GPT 自回归的先验,之所以会补充时长和音高,这大概是受到 FastSpeech2[23] 这样的非自回归模型的启发,这两个指标的引入,有助于提升合成的鲁棒性;HAM-TTS 则是补充了基于 HuBERT 的语义信息。值得注意地是,HAM-TTS 将模型的训练数据扩充到了65万小时,其中有50万小时的数据是合成数据。合成数据也能大幅度提升合成语音的音质。
图14:RALL-E 的模型架构,框出来的就是辅助信息
图15:HAM-TTS 的模型架构
说到 VALL-E 的后续改进,VoiceCraft 不得不提。我愿意称之为“优雅的 VALL-E”。它的优雅主要体现在两个方面:casual masking和delayed stacking。所谓的 causal masking,是为了用自回归 GPT 架构来做语音编辑任务,就是把被 mask 的部分移动到序列末尾去预测,一套架构同时做合成和编辑任务;所谓的 delay stacking,是为了适配自回归和 RVQ,通过 delay 错位让当前码本的 token 预测正好可以利用前面那些 token 的预测结果,比起 VALL-E 那样自回归和非自回归缝合在一起的结构要优雅不少。
图16:VoiceCraft 的建模流程
基于声学/语义 latents 的工作
我们通常所说的语音 token 是离散的。如果使用对应码本中的 embedding 来表示语音的话,它也可以是连续的低维度的 latent 变量。既然是低维度的连续 latent 变量,那图像合成领域中大火的 LDM(latent diffusion model,其实就是 stable diffsion 1&2 采用的模型)模型[]自然也可以用到语音的合成上。这方面的经典工作有很多,比如说:NaturalSpeech 2&3[25, 26]、AudioLDM 2[27]、VoiceLDM[18]。但这里面只有 NaturalSpeech2 用到了语音离散化部分提及的声学/语义 token,NaturalSpeech3 的属性分解形式的 VQ 更像是另一种形式的 RVQ。我们先来看 NaturalSpeech 2&3,其他的工作后面再来看。
首先是 NaturalSpeech 2[26],它基本上就是 VALL-E 的连续版本。它用的 latent 也是来自 Encodec,对其中不同层次的 latent 做了求和,然后将其作为扩散模型的训练目标。值得注意地是,扩散模型和 FastSpeech2 一样也用了时长和音高作为合成的先验条件。这一点也被后来的 RALL-E 采用。该工作中的扩散模型采用 WaveNet 实现,同时预测不加噪的 latent 和后验均值,和图像合成领域的扩散模型在实现方式上还是有所不同的。
图17:NaturalSpeech2 的模型架构
然后是 NaturalSpeech 3[26],还是非自回归的,而且非自回归的正统性味道更加浓厚,借用了不少 FastSpeech2 和 megatts1&2(后面会讲)[27, 28]的设计思想。像 megatts 1&2 一样,同样采用(自)监督信号对语音 token 编码的内容做了限制,而不再像是 VALL-E/NaturalSpeech2 那样一把抓。相应地,语音 token 化的方法也用 VQ 就行。具体而言,文章将语音信号分解为时长、内容、韵律和细节四个部分,然后每个部分用离散化的扩散模型来建模。不过,原文使用 GRL 来促进语音属性的分解,这一点的靠谱程度存疑。我也尝试过文章的 FACodec,但效果很差。三级扩散模型级联的结构,预测起来似乎也非常麻烦。
图18:NaturalSpeech3 的模型架构
基于 MEL 谱+VQ 的 TOKEN 的工作
当然,也有不少工作用了 MEL 谱作为中间特征,然后在梅尔谱的基础上,或是用 VQ 提供离散 token,或是用 CNN 来提取连续 latent。对于 MEL+VQ 的工作,有 tortoise-tts[20]、xtts 1&2、megatts1&2[28, 29]、base TTS[30]。对于 MEL+latents 的工作,有:AudioLDM 1&2[27]、StyleTTS 1&2[31, 32]。我们来简单看看是它们是怎么做的。
Tortoise-tts[20]。该工作是著名的开源英文 TTS 模型。其作者目前在 OpenAI 就职,同时也是 GPT-4o 的重要 Contributor(他自个儿在博客中说的)。Tortoise-tts 使用 MEL+VQVAE 的方法得到语音的 MEL token,然后对 MEL token 以及 text token 做 GPT 自回归建模。对于语音的解码,自然也是分为两步:先是用扩散模型将 MEL token 转换为 MEL 谱,这一步和文生图很像,用扩散模型是很自然的选择;然后用声码器将 MEL 谱转换为音频波形。tortoise-tts 和 VALL-E 的主体都是自回归建模,二者的不同主要在于 token 的不同。
图19:tortoise-tts 的模型架构
MegaTTS 1&2[28, 29]。字节跳动的 MegaTTS 系列对语音 token 编码信息做了显式的信息压缩处理,让语音 token 仅编码上下文依赖强的韵律信息,然后用 GPT 自回归来建模语音的韵律。对于其他方面的信息,模型的处理显得较为常规:音色一般具有全局性,使用单一的音色编码器从参考音频中提取就性;对于文本语义内容的处理,模型在很大程度上参考了非自回归的 FastSpeech 2。对于语音的解码,也是分为两步:先通过 MEL decoder 还原为 MEL 谱,然后通过声码器解码为音频波形。MegaTTS 2和1总体上类似,在音色编码(音素级编码、多条参考音频)、语音提示长度(扩展同 speaker 语音上下文长度硬 train,音频 prompt 长度更长)和时长建模(也用 GPT 自回归)上做了改进,同时堆了更大规模的数据。剪映的后端 TTS 模型用的就是 megatts2。该工作在各论文的评测中表现也都不错。
图20:megatts1 的模型架构
基于 MEL 谱+VAE 的 latents 的工作
AudioLDM 1&2[27]。AudioLDM 1&2 使用的语音 latents 是一致的,均通过 MEL+VAE 获得。既然是连续的 latents,使用扩散模型来建模也合情合理。解码过程也相当简单:VAE decoder 获得梅尔谱,然后用声码器转换为音频波形。该系列工作的核心创新点是利用多模态模型统一了扩散模型条件输入侧的信息:AudioLDM 1 用 CLAP 统一了文本模态和音频模态,用单模态的音频数据就能完成模型的训练;AudioLDM 2 则包含了图像、文本、转录文本等更多模态,模型泛用性也更强,既能做语音合成,也能做音乐生成、音频事件生成。
图21:AudioLDM 1 的模型架构
图22:AudioLDM2 的模型架构
StyleTTS 1&2[31, 32]。StyleTTS 系列的模型一众 zero-shot TTS 模型显得比较老派,整体结构基本上沿袭了非自回归的 FastSpeech 2,不同之处在于增加了基于参考音频抽取的风格信息。说是风格,其实跟 megatts 的音色很像。StyleTTS 2 的工作则将风格进一步拆分成声学风格和韵律风格。训练时的风格信息由音频提供,推断时的风格信息则由扩散模型提供。StyleTTS 2 通过一个扩散模型桥接了文本韵律和语音风格之间的联系,摆脱推断时对参考音频的依赖。不用参考音频其实对产品的意义还挺大的,要都用现实世界中真人尤其是名人的声音作为参考音频,那这势必会引起版权纠纷。这种纠纷在国内国外都有相关的事件。最近寡姐投诉 OpenAI 的事件就是一例。
图23:StyleTTS 1 的模型架构
图24:StyleTTS 2 的模型架构
   3.2 TTS 对指令的遵循


SLM 不仅要合成合乎上下文语义的高表现力语音,合成的语音还要符合用户的即时要求。一些 text-guided zero-shot TTS 的工作值得参考。这些工作一般都是在已有的 zero-shot TTS 模型或者 text-to-audio 模型上改造而来,同时吸收 transcription 和 description 两路条件。其中的重点还是在于数据集的构建。这方面的工作有:PromptTTS[33]、InstructTTS[34]、ParlerTTS[19]、VoiceLDM[18] 和 Audiobox[35]。我们主要谈谈 ParlerTTS 和 VoiceLDM。
ParlerTTS[19]。VALL-E/VoiceCraft 的增强版,通过 T5 编码器和 cross-attention 旁路引入了描述性文本的信息。该工作的目的是想使用自然语言 prompt 来指定说话风格和环境信息,摆脱对参考音频的依赖。描述性标签文本的收集过程也显得相当朴素:通过定制化的监督式模型获取语音数据的口音特征、录音质量特征、音高语速特征。然后用 LLM 将这些特征转换为自然语言的描述。在我看来,这个工作有这么几点局限性吧:其一,缺乏情绪标签;其二,语音描述性标签的收集并不具备通用性,较为繁琐,远不如一个强大的多模态语音理解模型来得实在。文章 demo 虽然达到了预期的效果,但场景似乎局限在朗读的情景中。
图25:ParlerTTS 的模型架构
   3.3 TTS 总结


林林总总说了这么多 zero-shot 的 TTS 方法,我想说明的结论有这么几点:
  1. 在 LLM 大行其道、scaling law 大显神威的时代,TTS 模型的训练数据规模已经突破了万小时,甚至达到了数十万小时的级别。在大数据的加持下,TTS 任务上也涌现出了 in-context learning 能力。
  2. 语音信息的解码通常都要层次化或者多步进行,不能一步到位。自回归、扩散模型和流匹配都能在 TTS 中发挥作用;
  3. 借鉴 NLP instruction fine-tuning 和文生图的经验,TTS 模型同样可以遵循文本指令或者语音指令,合成符合用户即时要求的语音,摆脱对参考音频的依赖,这或许也能规避一些知识产权的困扰(比如最近有名的寡姐投诉 OpenAI 事件)。同时,用户也能在对话过程中随时切换语音回复的风格,这一点在 OpenAI 的 demo 中有很明确的体现。另外,不知道大家有没有注意,GPT-4o 合成的语音是可以是放映所处的声学环境的:有一段语音背后似乎是有钢琴声的。
  4. text-guided zero-shot TTS 在模型架构上和 zero-shot TTS 有非常大的相似性。但训练数据可能较为缺乏。先开发 zero-shot TTS,再用类似 SALMONN 那样的多模态理解模型来打标签(类似 DALLE3 的做法),这样数据集构造方式,可能会是更好的选择。

另外,对于语音的解码方案,我倾向于是这样的:
  1. 如果要做流式推理,外接类似 HIFIGAN 这样的声码器的方式可能不是好的选择。HIFIGAN 并不天然支持流式解码。相反地,诸如 SoundStream 和 Encodec 这样的方法,同时有流式变体和非流式变体;
  2. 先做语义 token 的解码,这个解码大概率是自回归解码。语义 token 毕竟是建模上下文依赖关系,自回归方法已经在 NLP 上证明了这一点;
  3. 然后做声学 token 的解码,扩散或者 flow-matching 可能是更好的选择。扩散模型或者流匹配可以很好地修补语音的细节;

当然,除了上面讲到的,zero-shot TTS 还有很多值得研究的方法。限于篇幅,仅列举于此,不再详述:HierSpeech++[36]、base TTS[30]、Voicebox/Audiobox[35]、UniAudio[37]、Make-a-Voice[38] 等等。


04



其他问题
对于 GPT-4o 模型,如果仅仅聚焦于语音多模态,还有下面的问题值得关注:
语音交互如何做到低延迟?大概率要求流式切片处理,主要工作在于工程优化,用 C++ 重写算子。推理框架的话,用 tensorrt、mnn 这些都行。上下文所述的音频离散化方法,诸如 SoundStream 和 Encodec,其实也支持流式处理。
语音对话中的打断如何实现?个人认为有两种可能的方案:turn-based 和流式处理。所谓的 turn-based 方案,是比较工程化的,简答概括一下就是:检测是否有停顿,如果一段时间内没有声音,模型就开始返回语音回复。另一种流式方案,则是:模型一直在接受用户的流式语音输入,判断是否应该输出语音回复,一个充分训练的模型应该是能够准确预测出语音词表中的[START]和[END]的。


05



对游戏配音业务的思考
text/prompt-guided zero-shot TTS 方法对游戏的 AI 配音意义重大。主要体现在:
  1. 用自然语言提示去合成音色稳定的语音,摆脱对参考音频的依赖,在业务中能够更加灵活,至少比克隆已有人物/角色的语音的方式更加方便,更不容易出戏。举个例子,在开放世界剧情类游戏的研发阶段,我们会设定一些 profile 赋予 NPC,让玩家跟 NPC 聊天。我们曾经用克隆《原神》、《崩坏:星穹铁道》已有角色的方式赋予这些 NPC 角色语音,但放在那些欧美背景的 NPC 中,就是很有违和感,没有现实世界中的 accent,不够 decent。
  2. 剧情任务中的配音会更加真人化、更有沉浸感。过年期间过《崩坏:星穹铁道》花火和黑天鹅的同行任务的时候,部分 NPC 角色会有六公主的翻译腔,这是花火行于欢愉命途的恶趣味,空气中顿时充满了快活的味道。如果走 bv2、gsv 的语音克隆方案,应该是很难有这种效果的。而且,玩家在剧情任务中势必会经过不同的地势地貌,至少室内、室外的声音听起来是有不同的。室内的声音至少会有回响、混响的吧。这种感觉语音克隆方案也是无法做到的。




06



全文总结
总结一下本文说谈的内容,我认为 GPT-4o 语音多模态的实现可能是走了以下的技术路线:
  1. audio & text tokenizer 的实现应该是语音离散化部分所用的技术,例如 SoundStream、Encodec、SpeechTokenizer,或者是 MEL+VQ 最后配合声码器来解码;参考 zero-shot TTS、AudioLM/AudioPaLM、SpeechGPT-Gen 等工作的结果,LLM 中语音 token 的解码应该是要走层次化或者多步的方法,先解码语义特征,再解码声学特征,或者是先解码 MEL,再加一个HIFIGAN 这样的声码器。另外,如果做 audio/speech/music 这样的通用声合成的话,可能也能通过 prompt 来控制。AudioLDM2 虽然做了这方面的工作,但 audio/music 和 speech 的参数其实是不一样的,说到底还不是同一个模型。
  2. 对于指令微调,数据集的构造非常重要,大概率要用到合成数据。其一,网络上高质量语音数据的量级远远不及文本,直接拿 ASR 数据来做肯定会影响模型合成语音的音质;其二,大语言模型合成的 instruction 往往触及不到语音的细粒度特征,这样的 instruction 其实无法准确详尽地描述 text 和 speech 之间的关系。因而,需要引入强大的 zero-shot TTS 模型合成高质量语音,然后用多模态语音理解模型来为合成语音打标签,当然也可以评分做筛选什么的。
  3. 最后是要让大模型的输出对齐人类的偏好。这方面的方法有很多,有 DPO、PPO 什么的,都可以用。

图27:全文总结,可能的 roadmap
作者也在知乎上发文解读语音相关技术,有兴趣的朋友们,欢迎前来关注。
作者主页链接:https://www.zhihu.com/people/wen-xue-zhi-45/posts

   参考文献


[1] Baevski A, Zhou Y, Mohamed A, et al. wav2vec 2.0: A framework for self-supervised learning of speech representations[J]. Advances in neural information processing systems, 2020, 33: 12449-12460.[2] Hsu W N, Bolte B, Tsai Y H H, et al. Hubert: Self-supervised speech representation learning by masked prediction of hidden units[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2021, 29: 3451-3460.[3] Chung Y A, Zhang Y, Han W, et al. W2v-bert: Combining contrastive learning and masked language modeling for self-supervised speech pre-training[C]//2021 IEEE Automatic Speech Recognition and Understanding Workshop (ASRU). IEEE, 2021: 244-250.[4] Van Den Oord A, Vinyals O. Neural discrete representation learning[J]. Advances in neural information processing systems, 2017, 30.[5] Zeghidour N, Luebs A, Omran A, et al. Soundstream: An end-to-end neural audio codec[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2021, 30: 495-507.[6] Défossez A, Copet J, Synnaeve G, et al. High fidelity neural audio compression[J]. arXiv preprint arXiv:2210.13438, 2022.[7] Zhang X, Zhang D, Li S, et al. Speechtokenizer: Unified speech tokenizer for speech large language models[J]. arXiv preprint arXiv:2308.16692, 2023.[8] Borsos Z, Marinier R, Vincent D, et al. Audiolm: a language modeling approach to audio generation[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2023.[9] Rubenstein P K, Asawaroengchai C, Nguyen D D, et al. Audiopalm: A large language model that can speak and listen[J]. arXiv preprint arXiv:2306.12925, 2023.[10] Changli Tang, Wenyi Yu, Guangzhi Sun, Xianzhao Chen, Tian Tan, Wei Li, Lu Lu, Zejun Ma, Chao Zhang. SALMONN: Towards Generic Hearing Abilities for Large Language Models[11] Zhang D, Li S, Zhang X, et al. Speechgpt: Empowering large language models with intrinsic cross-modal conversational abilities[J]. arXiv preprint arXiv:2305.11000, 2023.[12] Zhang D, Zhang X, Zhan J, et al. SpeechGPT-Gen: Scaling Chain-of-Information Speech Generation[J]
-End-原创作者|陈鑫
你对 GPT-4o 的语音技术有什么样的看法?欢迎评论留言。我们将选取1则评论,送出腾讯云开发者定制眼罩1个(见下图)。6月21日中午12点开奖。


📢📢欢迎加入腾讯云开发者社群,享前沿资讯、大咖干货,找兴趣搭子,交同城好友,更有鹅厂招聘机会、限量周边好礼等你来~


(长按图片立即扫码)




相关推荐

  • 如何实现一个合格的分布式锁(典藏版)
  • Vue反编译dist包到源码
  • 只用Tomcat,不用Nginx行不行?
  • TypeChat 入门指南
  • 技术大神云风已从阿里离职
  • 人与人的差距在于认知
  • Spring Boot集成Timefold Solver实现课程表编排
  • 两个 Python 整数之间是如何进行大小比较的?过程并不像我们想的那样简单
  • 23k star超火项目,请求优化写的一塌糊涂!我直接重构!
  • 线程池10连问
  • 吴恩达的新项目,我给加上了国产大模型 API
  • ChatGPT论文写作、数据分析,赠送1个月GPT-4会员账号
  • 唠唠最近的求职行情
  • 某大厂开始“捡漏”35+人员
  • 硕士毕业,要是没进大厂,没进华为,没干研发,是不是就和高工资无缘了?
  • 华为招聘宣讲现场,某同学提问:为什么加班这么多,华为主管回应称:想成世界第一,只能艰苦奋斗
  • 【云原生|K8S系列】StatefulSet特性解读与案例实操
  • 如何全面了解提示技术?马里兰大学等最新76页《提示报告:提示技术》系统综述
  • 视觉语言模型导论:这篇论文能成为你进军VLM的第一步
  • GPTs被终止!微软宣布删除所有GPTs数据