神经音频编解码器:如何将音频融入大语言模型
当前语音LLM的局限性
截至2025年10月,语音大语言模型表现仍不理想。多数LLM的语音接口工作流程是:将语音转写成文本,生成文本回复,再通过文本转语音朗读出来。这在许多场景下足够使用,但这只是包装,而非真正的语音理解。模型无法听出你声音中的沮丧并给予共情回应,无法在回答中强调重要词语,也无法感知讽刺语气。
确实存在一些原生理解和生成语音的LLM(如Gemini、ChatGPT的高级语音模式、Qwen、Moshi),但在实践中,它们要么不够智能,要么表现得像文本模型的包装。尝试用高音调问它们“我现在是用低音还是高音说话?”,它们都无法正确回答。
音频建模的挑战
为什么语音LLM落后于文本LLM?对于文本,我们几年前就发现,只需大量文本数据、大型Transformer模型和大量GPU,就能得到相当优秀的文本续写模型。为什么不能简单地将文本替换为音频,得到优秀的语音续写模型?
音频建模比文本更困难的原因在于:一秒钟音频包含数万个样本,却只对应几个单词。构建在这种长时间尺度上保持连贯的模型很困难,而且模型运行这么多步骤需要很长时间。
神经音频编解码器解决方案
解决方案是使用神经音频编解码器压缩音频。通过编解码器,我们可以将音频转换为更大的离散标记,训练模型预测这些标记的续写,然后将其解码回音频。
自编码器与向量量化(VQ-VAE)
机器学习中的一个古老想法是使用自编码器:一个接收输入、将其压缩到更小的“潜在空间”,然后尝试重建原始输入的模型。在我们的案例中,需要一个潜在空间被量化的自编码器,以便将潜在表示输入语言模型并生成续写。
训练量化自编码器的关键挑战是量化操作不可微分。我们通过直通估计器解决这个问题:在前向传递中,z_quantized设置为与之前相同的值,但重要的是,z的梯度现在等于z_quantized的梯度,而不是因为不可微分的to_nearest_cluster(z)操作而仅为0。
残差向量量化(RVQ)
为了提高重建保真度,我们使用残差向量量化。不是直接创建大量聚类中心,而是使用两个独立的量化器,每个有1024个聚类,并组合它们的结果。每个嵌入将被量化为[0..1023]范围内的两个整数元组,产生2^20种可能组合。
残差向量量化算法:
|
|
音频标记化实践
将RVQ应用于音频相对简单。作为自编码器,我们使用类似于Jukebox的卷积神经网络。重要的是,这是一个将具有t个样本的音频转换为形状为(t/128, 32)向量的网络。换句话说,它将下采样128倍,并给出32维浮点表示。
我们使用多尺度频谱损失函数:计算原始和重建音频的对数振幅频谱图,并取它们的差值。损失是频谱图之间差异的均方值。
实际应用与效果
使用8级RVQ编解码器,我们将音频数据集转换为离散标记序列,以便输入LLM。对于每个时间步,有八个标记,我们简单地将数组展平为1D形状(t/128 * 8),让LLM在单独的时间步中预测八个层级。
使用Mimi(Kyutai为Moshi开发的现代神经音频编解码器)作为标记器,结果明显优于我们自制的编解码器。Mimi使用对抗损失而不是多尺度频谱损失,并采用RVQdropout:它使用32个RVQ层级,但在训练期间,重建有时被随机截断到较低层级数。
语义标记的重要性
Mimi包含“语义标记”,这些标记代表音频的语义信息,而不一定有助于重建。语义标记从WavLM中提取,可以将其视为语音的BERT。语义标记编码说话内容,但对声音不变,这有助于模型专注于说什么,而不是怎么说。
结论与展望
我们成功使用神经音频编解码器制作了一个能生成相对连贯语音的音频语言模型。目前,语音理解和推理能力之间似乎存在权衡。尽管语音原生模型经过训练以原生理解音频,但它们无法告诉你是在用高音还是低音说话,这可能是因为它们使用大量文本转语音合成数据训练,和/或理解声音语调显然无助于模型做出更准确的预测。
音频ML中这个未解决的“模态差距”使得它成为一个令人兴奋的研究领域。
延伸阅读
- WaveNet (2016): 原始样本级音频续写模型
- VQ-VAE (2017): 引入向量量化自编码器
- SoundStream (2021): 将残差向量量化引入神经音频编解码器
- Moshi (2024): Kyutai的音频原生模型,引入Mimi编解码器
- 连续音频语言模型 (2025): 通过扩散或一致性模型完全绕过离散标记需求