KE-Omni-语音会话大模型

贝壳团队最新的语音大模型工作:面对语音交互对话数据稀缺的行业现状,尝试通过多阶段生成的方式来Scale训练数据;构建了超60000+小时、包含40000+说话人的高质量交互对话数据集Ke-SpeechChat;通过这些方式,表现基本能达到SOTA;

个人理解

  • 1、具体做法是先生成文本token,基于文本token在自回归生成语音token,最后基于语音token合成音频,没办法做到打断和全双工对话。另外,只使用hubert的音频token来合成语音可能效果不好,缺乏声学信息,合成的音频可能不会有太多的情感波动以及音色可能不稳定,看作者demo和论文, HiFi-GAN 声码器针对代理发音人(agent speakers)预先训练,针对中英文男/女 各选了一个音色进行HiFiGAN的训练,如果只在单一音色上训练的HiFiGAN可能音色比较稳定。个人理解应该是每一个音色训练一个HiFiGAN模型,听demo确实语音没有情感波动另外这种方法跟LLama-omni做法基本一致。
  • 2、论文中给出了如何在没有开源的大规模语音交互数据集情况下进行语音对话数据集的制作。比较有借鉴意义。首先对文本数据使用LLM进行重写指令、筛选重写后的指令以及口语化后处理。然后使用TTS技术合成多说话人,多样化的语音。另外在附录中给出了 文本重写指令的prompt以及不同的大小的Qwen2 LLM重写的结果分析。【具体提示词见附录】

论文:通过使用超过 60,000 小时的合成语音对话数据扩展监督微调来推进语音语言模型Advancing Speech Language Models by Scaling Supervised Fine-Tuning with Over 60,000 Hours of Synthetic Speech Dialogue Data

KE-Omni是一个基于 Ke-SpeechChat 构建的无缝大型语音语言模型,这是一个大规模的高质量合成语音交互数据集,由 700 万中英文对话组成,有 42,002 名说话人,总计超过 60,000 小时,这为该领域的研究和开发进步做出了重大贡献。

KE-Omni 模型架构

KE-Omni 由三个主要组件组成:语音编码器、大型语言模型(LLM)和语音解码器针对用户的语音指令,KE-Omni 被设计为无缝生成高质量的文本和语音响应。

语音编码器

采用了 Whisper-large-v3的编码器作为语音编码器。Whisper 是一种广泛使用的多语言语音识别模型,以其在多种语言上的强大性能而著称,非常适合我们的应用场景。一个轻量级的语音适配器被用于语音-文本模态对齐,将语音编码器与 LLM 连接起来。

语音编码器将每秒的音频处理为 50 帧特征。随后,语音适配器进一步压缩语音特征序列的长度,使其与 LLM 的模态对齐。我们在语音适配器中采用了 5 倍的压缩比,这意味着每秒的语音最终被转换为 10 帧特征。这种方法提高了处理速度并降低了 LLM 的延迟,同时保证了质量不受影响。

在整个训练过程中,语音编码器的参数保持冻结状态,仅语音适配器的参数会更新。这种方法保留了编码器强大的语音表示能力,同时使适配器能够学习必要的转换,以实现与 LLM 的高效语音-文本模态对齐。

语言模型

采用了最先进的开源模型 LLaMA作为大型语言模型(LLM)。该模型在多语言推理能力方面表现出色,涵盖中文和英文等多种语言。在 KE-Omni 中,LLM 将提示文本嵌入和语音编码器生成的语音表示拼接后作为输入。这种集成方式使得 LLM 能够利用来自文本和语音模态的上下文信息。然后,LLM 根据用户的语音指令自回归地生成文本响应。为了在性能和效率之间取得平衡,我们选择了 LLaMA-3.1-8B-Instruct 作为我们的 LLM 变体。

语音解码器

语音解码器负责将 LLM 的文本响应映射为对应的语音信号,是实现语音交互的重要组件。解码器包括以下三个关键部分:

  1. 时长预测器来自 Unit-based HiFi-GAN Vocoder with Duration Prediction
  2. 语音单元生成器
  3. 基于单元的声码器(vocoder)

语音特征表示

类似于 (Zhang et al., 2023) 和 (Fang et al., 2024) 的方法,我们采用预训练的 HuBERT 模型(Hsu 等人,2021)来提取连续的语音表示,并使用 K-means 模型将这些连续表示转化为离散的聚类索引。

生成语音响应的步骤

  1. 时长预测
    在生成语音响应之前,时长预测器首先预测每个文本标记(token)的时长。
    • 根据预测的时长信息,文本token序列会被上采样以匹配目标音频帧序列的长度。
    • 时长预测器在 KE-Omni 的训练过程中保持冻结状态。
  2. 语音单元生成
    基于 Transformer 的语音单元生成器以自回归方式生成离散语音单元序列。为了提高预测速度,我们采用基于块的自回归方法,分块预测语音单元。
    • 给定块大小 C 和目标语音单元序列长度 T,第 i 个文本token和第 j 个语音单元的嵌入向量进行拼接【concatenated】作为输入,其中 j=i−C,且 i∈[C,T]。
    • 在第一个块中,语音单元使用零嵌入初始化。
    • 为了确保语音单元生成的质量,我们在扩展的文本token序列和语音单元序列之间引入了 N 步延迟。
  3. 波形合成
    最终,通过基于单元的声码器(vocoder)将语音单元合成波形。我们选择了 HiFi-GAN 作为声码器。Unit-based HiFi-GAN Vocoder with Duration Prediction HiFi-GAN 声码器针对代理发音人(agent speakers)预先训练,并在 KE-Omni 的训练过程中保持冻结状态。

Ke-SpeechChat 数据集构建

目前尚未见到开源的大规模语音交互数据集,这极大地阻碍了语音对话研究的发展。这种稀缺性主要归因于以下两个因素:一是构建语音数据的高成本,二是涉及的隐私风险。

为了有效构建大规模且高质量的语音交互数据集,我们通过利用先进的 LLM 和 TTS 工具包,探索高效的合成数据方法。为避免隐私风险,我们构建了一个虚拟语音库用于语音生成,其中的声音在现实世界中并不存在。此外,我们在数据中嵌入了水印,以表明这些数据是由 AI 生成的,从而防止其被滥用。

在对话数据的构建过程中,我们首先专注于创建能准确反映口语特征的文本对话数据,然后从这些文本对话中合成语音。随后,我们对合成语音进行质量保证和筛选。

文本预处理:

选择的文本对话问答数据集:

https://huggingface.co/datasets/BelleGroup/train_1M_CN
https://huggingface.co/datasets/BelleGroup/train_2M_CN
https://huggingface.co/datasets/BelleGroup/train_3.5M_CN
https://huggingface.co/datasets/fnlp/SpeechInstruct
https://huggingface.co/datasets/fnlp/AnyInstruct

文本数据集存在的问题:

任务不适合语音交互
许多数据集中的指令涉及的任务不适用于语音交互,例如生成图像、撰写长篇文章或创建结构化文本。这些任务难以自然地融入语音对话。

形式过于正式,与口语化不符
数据集中指令的表达通常过于正式和详尽,与日常口语表达存在显著差距。例如,一个数据集中的指令可能是:“如何安装和设置一款软件或设备(例如打印机)”,而在日常对话中,用户通常会简单地问:“怎么用打印机?”

内容过长且包含不可发音的符号
数据集中指令和响应往往过于冗长,并包含不可发音的特殊字符,例如 Markdown 符号、下划线和换行符。这些特性使得文本数据无法很好地适应语音交互的细腻和动态需求。

为了解决上述问题,我们实施了以下三个关键步骤:重写指令筛选重写后的指令以及口语化后处理。这三个阶段均借助大型语言模型(LLMs)完成具体的提示词(prompts)详见附录 A.1。

重写指令

重写指令的主要目标是将指令任务转化为更适合口头交互的形式。我们的方法是为大型语言模型(LLM)设计特定的提示,要求其将原始指令数据转换为人类可能会以口语形式提出的问题。

我们发现,当将完整的原始指令提供给 LLM 时,其输出通常只对任务的原始格式进行轻微改写,导致结果仍然不适合对话场景。为了解决这个问题,我们针对特定类型的任务(例如分类、摘要和其他指令性任务)实施了特定策略。我们移除了这些任务中的指令性句子,仅保留关键信息片段。随后,我们告知 LLM 这些片段是不完整的,要求其以此为灵感,创造性地生成新的问题。

这种方法有效降低了 LLM 过于依赖原始指令的倾向,并鼓励生成更加自然的对话式问题。因此,我们能够将正式且结构化的指令文本有效地转化为更适合语音场景的查询。

筛选重写后的指令

在指令重写阶段之后,我们会对重写后的指令进行筛选,以确保其适用于口语交互。筛选过程涉及以下三个关键考量:

  1. 适合口头交流:评估重写后的指令是否适合口头交流,排除需要生成长篇或结构化内容(如文章、歌词或电子邮件)的任务。
  2. 清晰度与完整性:评估每条指令的清晰度和完整性,确保其包含足够的背景信息。对于过于模糊或缺乏必要背景的指令(例如“这篇文章的主要内容是什么?”),会被筛除。
  3. 安全性:使用我们内部的系统和 Qwen2-72B-Instruct 模型对指令进行安全性评估。

通过这一筛选过程,数据集主要由清晰、上下文完整且安全的指令组成,从而提升其在对话交互场景中的适用性。

语音风格后处理

在最后阶段,我们使用大型语言模型(LLM)进一步修改筛选后的指令,以提升其对话质量,并以类似自然口语风格生成相应的回答。具体步骤如下:

  1. 对话语气:要求 LLM 采用自然的对话语气,避免生成无法发音的内容,并将数字和公式符号转换为其口头表达形式。
  2. 简洁回答:将回答限制在 100 字以内,确保单次回复不包含过多信息。

通过遵循这些指导原则,数据集被进一步优化,更加适合用于训练支持自然且高效语音交互的模型。

使用的模型版本
本节使用 Qwen2.5-72B-Instruct,而 重写指令筛选重写指令 节使用的是 Qwen2.5-14B-Instruct。值得注意的是,与较小版本(如 Qwen2.5-32B-Instruct 或 Qwen2.5-14B-Instruct)相比,Qwen2.5-72B-Instruct 生成的指令相似,但回答质量显著提升。示例可在附录中查看。

合成音频对话数据

使用 CosyVoice模型,它支持自定义语音特征,将文本对话转换为语音对话。为确保说话人多样性,我们构建了一个包含大量虚拟说话人的语音库这些说话人均来自开源语音数据。为保持合成语音对话的质量,我们对合成音频进行转录并计算字符错误率(CER),根据 CER 进行数据筛选,从而确保数据集的高质量。

语音库

数据来源 WenetSpeech4TTS 数据集源自 WenetSpeech(Zhang et al., 2022),该数据集包含从互联网收集的长音频录音,时长从几分钟到数小时不等。WenetSpeech4TTS 通过语音活动检测(VAD)对这些长录音进行分段,将其分割为较短的音频片段,同时计算每段的 DNSMOS 分数(Reddy et al., 2022)。这些短片段根据说话人的余弦相似性进行合并,以确保每个短片段均由同一说话人发出。然而,WenetSpeech4TTS 未检测同一长录音中不同短片段之间的相似性,而这对我们的工作至关重要,因为我们需要识别由同一人发出的多个片段,以生成稳定的语音特征嵌入。

实际说话人

我们首先从 WenetSpeech4TTS 的优质短片段中(DNSMOS ≥ 4.0)提取音频,并根据其来源的长录音进行分类。我们筛选出包含至少 10 个优质短片段的长录音,记为 Ai​={ai1​,ai2​,…,ain​},其中 i 是长录音的索引,n≥10表示短片段的数量。
接着,我们使用 WavLM(Chen et al., 2022)为这些短片段提取 X-向量,并计算 Ai​ 中每对优质短片段之间的说话人相似性。如果某长录音中至少有 floor⌊2n​⌋ 对短片段的相似性得分超过 0.97,则这些短片段被认为由同一人发出。通过这种方法,我们识别出了 5000 多名说话人,且性别均衡。

虚拟说话人

对于每个识别出的语音特征,我们计算平均发音速度(即每个字符的平均发音时间,取整至最近的 10 毫秒)。然后,根据发音速度将这些特征进行分类。我们随机选择一个语音特征,并与同性别、发音速度相同的另一语音特征配对,通过加权平均生成合成语音特征,以保护隐私并生成不存在的、虚拟的合成语音。这一过程可以用来生成无限数量的虚拟语音。
通过这些步骤,我们的语音库包含高质量、多样化、性别均衡的虚拟语音,适用于语音合成的多种应用,同时不会对应任何真实个人。

语音合成

CosyVoice 进行语音合成。对于每段对话,我们随机选择一位用户语音和一位代理语音进行合成。为了防止数据滥用,所有合成语音均使用 AudioSeal(San Roman et al., 2024)进行水印保护。

质量保证

为确保合成对话的质量,我们对中文部分使用 Belle-whisper-large-v3-turbo-zh 进行转录,对英文部分使用 Whisper-large-v3-turbo 进行转录。
分别计算中文的字符错误率(CER)和英文的单词错误率(WER)。若某条对话的中文 CER 超过 5% 或英文 WER 超过 10%,则该对话被剔除,以确保数据的高质量。

Ke-SpeechChat 数据集细节

所有元数据存储在单个 JSON 文件中,每条对话都包含以下信息:对话 ID、说话人、性别、文本内容和音频路径。示例详见附录 C。

详细统计信息如表 1 所示,其中中文和英文对话的数据分别列出。

  • 中文对话:数量超过 510 万条,总时长达 40,884 小时。
  • 英文对话:数量超过 170 万条,总时长达 19,484 小时。

数据集中的说话人性别均衡,包含 40,000 名用户和 2 名代理【输出语音】(用户和代理的分布均适用于中文和英文)。大量的对话和说话人确保了数据集的多样性。

训练数据被随机划分为五个不同大小的子集:XSSMLXL

  • 每个较大的子集都包含所有较小子集的数据。
  • 所有子集均完整覆盖 42,002 名说话人。

质量评估
为评估 Ke-SpeechChat 的质量,我们使用以下客观指标:

  1. DNSMOS(P.835 OVRL)和 UTMOS 评分:分别衡量音频质量和语音自然度。
  2. ASR 和 TTS 任务:进一步评估数据集性能。

附录

A:PROMPTS提示

指令重写:

指令过滤:

语音风格后处理 [根据指令获得响应]:

B:Qwen不同版本的能力 比较

本附录介绍了使用不同版本的Qwen2.5模型对口语风格后处理的影响,如下表所示

C: Dialogue Format

Synchronous LLMs as Full-Duplex Dialogue Agents


同步 LLMs 作为全双工对话代理

https://syncllm.cs.washington.edu/

尽管对语音对话代理进行建模有着广泛的兴趣,但大多数方法本质上都是 “半双工” 的 —— 仅限于回合制交互,响应需要用户明确提示或隐式跟踪中断或静音事件。相比之下,人类对话是“全双工”的,允许以快速和动态的轮流、重叠语音和反向通道的形式实现丰富的同步性。从技术上讲,使用 LLMs在于将同步建模为预训练的 LLMs 没有“时间”感。为了弥合这一差距,我们提出了用于全双工口语对话建模的同步 LLMs。我们设计了一种新颖的机制,将时间信息集成到 Llama3-8b 中,以便它们与现实世界的时钟同步运行。我们还介绍了一个训练方法,该方法使用从文本对话数据生成的 212k 小时的合成口语对话数据来创建一个模型,该模型仅使用 2k 小时的真实口语对话数据即可生成有意义且自然的口语对话。同步 LLMs 在保持自然性的同时,在对话意义方面优于最先进的。最后,我们通过模拟在不同数据集上训练的两个代理之间的交互,同时考虑高达 240 毫秒的 Internet 规模延迟,展示了该模型参与全双工对话的能力。

Latency tolerant interaction

SyncLLM 是一种仅限自回归解码器的 transformer 模型,可以用作全双工对话代理。在下图中,在当前时间步(图中的 chunk N),SyncLLM 的上下文包含 LLM 的语音到当前 chunk 的交错块,以及对应于除当前 chunk 之外的所有 chunk 的用户语音。为了与用户同步,LLM 必须在当前 chunk 结束之前生成其下一个 chunk (chunk N+1)。因此,SyncLLM 首先生成估计用户的 chunk,该 chunk 又附加到上下文并用于预测其下一个 chunk。

SyncLLM 经过训练,可以预测对应于对话两侧的语音单元的交错块,如图 2 所示。1. 在每个时间步长中,模型预测与对话一侧的固定持续时间(称为模型的块大小)相对应的语音单位,然后是与对话的用户一侧相对应的语音单位。通过这种方法,该模型能够生成与真实时钟同步的两个语音流。这允许我们的方法对所有对话线索进行建模,例如反向通道、重叠、中断等。

Training

SyncLLM 使用简单的 next-token 预测目标进行训练,其中全双工口语对话的格式如下。(顶行)我们将语音对话表示为 HuBERT 令牌的交错块,其中块大小决定了同步令牌 [S0] 的频率。(中间行)我们训练 SyncLLM 生成去重 HuBERT 令牌的交错块以及定期同步令牌。(底行)我们在每个块中插入去重的标记,以获得原始格式的语音对话序列。

如果我们可以将两个令牌流中的一个替换为与真实用户相对应的令牌流,那么经过训练的模型可以用于全双工语音交互。在图 .1,紫色框对应于每个时间块中 LLM 侧对话的标记序列,绿色框对应于对话的用户侧。我们通过丢弃 LLM 用户语音交互。

HuBERT 令牌 :使用 HuBERT  来表示语音。我们使用 Nguyen 等 人的分词化参数,分词采样率为 25 Hz,每 40 毫秒音频产生一个分词,词汇量为 501。为了模拟两个说话人 0 和 1 之间的对话,我们定义了两个特殊的标记 [S0] 和 [S1],称为说话人标签,分别指定每个说话人的标记序列的开始。我们将对话表示为两个并行的语音流,每个说话人一个,交错,如上图 的顶行所示。对于每个流,我们嵌入一个周期性的 speaker 标签,其时间段等于模型的块大小。

重复数据删除。HuBERT 令牌的固定时间段对于在全双工对话中对时间进行建模很有用。然而,原始 HuBERT 序列由大量重复的标记组成,主要是由话语内和话语之间的沉默引起的。每个唯一标记的重复次数表示标记所表示的声学单元的持续时间。然而,语义内容可以通过在删除重复标记序列时仅考虑唯一标记来建模。重复的标记序列会对最终口语对话模型的语义能力产生不利影响 ,因为如上图 所示,与去重序列相比,它们每个标记的语义内容比去重后的序列低约50%。

插值。虽然去重的标记序列有利于自回归建模,但要生成适合语音合成的标记序列,我们需要原始格式的周期性 HuBERT 标记。由于 speaker 标签 [S0] 维护了计时信息,因此我们知道每个块中去重后删除的令牌数量。我们使用它来插入已删除重复数据的令牌,以匹配每个块中的预期令牌数量。例如,在 Fig.2,则说话人 0 的流在去重后只有一个 Token。但是由于在这种情况下,块大小为 160 毫秒,因此每个块将包含 160/40 = 4 个令牌。所以如图 3 日的第三行所示。2 中,我们重复 deed token 三次以重建 chunk。如果一个块有多个去重的令牌,如图 2 中的第二个 token。2,我们以相等的数量重复每个 Token。我们注意到这种方法可能会导致错误,因为原始 chunk 可能不遵循这种启发式方法。我们观察到,即使数据块大小为 240 毫秒,其影响也是难以察觉的,这可能是因为每个标记的预测持续时间的误差受到数据块大小的上限。此外,在具有更多新词元的 chunk 中,误差会更小。

采用三阶段训练,训练数据:

第 1 阶段:具有合成语音数据的回合制口语对话模型。 鉴于口语对话数据有限,我们从大规模文本对话数据集中生成合成语音数据。 我们使用监督式微调 (SFT) 数据集作为我们的源文本对话数据集。我们使用 Bark TTS AI (2023) 模型生成文本对话数据集的口语版本,其中包含 10 个说话人预设。

第 2 阶段:假设没有重叠的全双工对话。回合制语音对话是无重叠的全双工对话的特例。基于这一观察结果,我们可以将合成的语音对话数据视为全双工语音对话数据,其中轮到一个说话人时,另一个说话人完全沉默。在这个阶段,我们从文本对话数据创建合成的口语对话数据,与上一阶段类似,但有一个主要区别:从对话的每个回合中,我们生成一个对应于一个说话者的语音话语和对应于另一个说话者的等长沉默。然后,我们以图 2 第二行所示的格式对并行语音对话数据进行标记。2. 这样,我们可以进一步利用文本对话数据来帮助我们的模型学习图 1 中的标记序列格式。2. 此微调阶段对话语中的计时进行建模。该模型还无法学习轮流提示,例如反向信道或两个说话人之间的重叠。

第 3 阶段:使用真实世界的口语对话数据进行建模。最后,我们对模型进行微调,从现实世界的口语对话数据中学习轮流线索。我们使用 Fisher Cieri et al. (2004) 的数据集,其中包含 2000 小时的口语对话,其中对话中每个说话者的语音都被分成独立的音频通道。我们将数据集分别以 98:1:1 的比例分为 train、val 和 test split。对话中的每个音频声道都单独标记化,并以上一阶段使用的全双工对话格式交错。在此阶段,除了学习话语中的计时外,该模型还学习有效的轮流对话线索,例如在轮流和反向通道之间准确分配停顿。

SimVQ:使用一个线性层解决矢量量化模型中的表示坍缩问题

摘自:https://spaces.ac.cn/archives/10519

音频表征工作

SimVQ: Addressing Representation Collapse in Vector Quantized Models with One Linear Layer

Github: https://github.com/youngsheen/SimVQ

论文提出只在 VQ 的编码表多加一个线性变换[W],无需其他改动,就能达到加速收敛、提升编码利用率、降低重构损失等效果,相当简单有效。

普通AE和VQ-VAE的数学形式:

VQ-VAE不是VAE,它只是一个加上了VQ的AE,没有VAE的生成能力。而VQ则是将任意向量映射为编码表中与它最邻近的向量的操作,这个操作本身具有不可导的特性,所以通过STE来为encoder设计了梯度,并且新增了β,γ这两项损失,来为编码表提供梯度,同时也起到规整encoder表征的作用。

改动

论文将自己所提方法称为SimVQ,但没有解释Sim是什么含义,猜测Sim是Simple的缩写,因为SimVQ的改动确实太Simple了:

在编码表多乘了一个矩阵W,其他原封不动。

如果原本就是用式(2)训练VQ的,那么SimVQ可以直接简单上;如果原本是用EMA来更新编码表的(即β=0,然后用另外的滑动平均过程来更新编码表,这是VQ-VAE-2及后续一些模型的做法,在数学上等价于用SGD来优化编码表损失,而其他损失则可以用Adam等非SGD优化器),那么则需要取消这个操作,重新引入β项来端到端优化。

可能马上有读者质疑:这不就是将编码表的参数化从E改为EW吗?EW可以合并成一个矩阵,等价于一个新的E,按道理不改变模型的理论能力?是的,SimVQ对模型能力来说是不变的,但对SGD、Adam来说却是变的,它会改变优化器的学习过程,从而影响学习结果的好坏。

实验

根据论文的描述,SimVQ的代码就是在第一行VQGAN的代码上改的,改动就只有往VQ层插入了个线性变换,然后提升就非常显著了,不仅在相同编码表大小下达到了最优的重构质量,还能通过增加编码表大小进一步提高重构质量,这足以体现SimVQ的魅力——简单且有效。

笔者也在自己之前写的VQ-VAE代码上做了尝试,实测显示这个线性变换的加入,明显加速了VQ-VAE的收敛速度,并且最终的重构损失也有所降低。笔者还实验了W取对角阵的变体,这时候就相当于每个编码向量都element-wise地与一个参数向量(全一初始化)相乘,结果显示这样的变体也能起到相近的效果,介乎VQ与SimVQ之间。

分析:

直观来想,VQ对编码表的更新是比较“孤立”的,比如某个样本z被VQ为q,那么这个样本的梯度就只会影响q,不会影响编码表里的其他向量;但SimVQ不同,它不单会更新q,还会更新W,从几何意义上看,W就相当于编码表的基底,一旦更新W,那么整个编码表就会更新了。所以说,SimVQ使得整个编码表的“联动”更为密切,从而更有机会找到更优的解,而不是陷入“各自为政”的局部最优。

那为什么SimVQ能提高编码表的利用率呢?这个其实也不难理解。再次根据W是编码表基底的解释,如果编码表利用率过低,那么W就会出现“各向异性”,即基底偏向于那些被利用起来的编码,可是一旦基底发生这种变化,那么它的线性组合应该也是偏向于被利用起来的编码,从而利用率不会太低。说白了,可学习的基底会自动让自己的利用率变高,从而让整个编码表的利用率都提高起来。

然而,物极必反,如果全体编码都使劲往高利用率方向走,那么反而可能会导致编码表坍缩(codebook collapse),因此SimVQ默认采用了一个很保守的策略:只更新W,所有的q在随机初始化后就不更新了,这样一来就几乎杜绝了编码表坍缩的可能性。好消息是,在适当的编码维度下,实验显示q,W都更新和只更新W的表现都差不多,所以读者可以按照自己的偏好选择具体的形式。

延伸:

抛开VQ的背景,像SimVQ这种引入额外的参数但又在数学上等价,即不改变模型的理论拟合能力,只改变优化过程的动力学的做法,我们称为“过参数化(Overparameterization)”。

过参数化在神经网络中并不鲜见,比如现在模型的主流架构是Pre Norm即x+f(RMSNorm(x)),RMSNorm最后所乘的γ向量通常都是过参数化的,因为f的第一层通常就是线性变换,比如Attention是线性变换投影到Q、K、V,FFN是线性变换来升维,等等,这些模型在推理阶段γ向量完全可以合并到f的线性变换中,但鲜有看到在训练阶段就把γ去掉的做法。

这是因为不少人认为,深度学习模型之所以“好训”,过参数化有不可忽视的作用,因此贸然去掉已经充分验证的模型的过参数化风险很大。这里的“好训”,主要是指梯度下降这种理论上容易陷入局部最优的方法居然经常可以找到一个实际表现很好的解,这本身就是一件很不可思议的事情。还有《On the Optimization of Deep Networks: Implicit Acceleration by Overparameterization》等工作,表明过参数化隐式地加速了训练,作用类似于SGD中的动量。

最后,VQ本质上可以理解为一种稀疏训练方案,所以SimVQ所带来的启发和改动,也许还能用于其他稀疏训练模型,比如MoE(Mixture of Experts)。当前的MoE训练方案中,Expert之间的更新也是比较独立的,只有被Router选中的Expert才会更新参数,那么是不是有可能像SimVQ一样,所有的Expert后都接一个共享参数的线性变换,用来提高Expert的利用效率?当然MoE本身跟VQ也有很多不同之处,这还只是个猜测。

FunCodec:音频编解码开源工具包,用于音频量化和文本到语音合成、音乐生成等

一个基础的、可重复的和可集成的用于神经语音编解码器的开源工具包

特点:

  • FunCodec 再现了最先进的模型,包括 SoundStream、Encodec 等。
  • FunCodec 可以很容易地扩展到 下游任务,例如 ASR 和 TTS。
  • FunCodec 可以在分布式 GPU 上训练模型, 和批处理模式下的推理。
  • FunCodec 原生支持频域、 更适合语音信号。
  • FunCode 模型可以通过语义标记进行增强, 例如音素和 Hubert 嵌入。

Available models

audio_codec-freqcodec_模型特点:频域模型,充分利用语音信号的短时结构,模型参数极少 (0.52M),计算复杂度极低 (0.34G flops),使用结构化 dropout 进行训练,使用单个模型在推理过程中启用各种带宽,将原始语音波形量化为离散标记序列

audio_codec-encodec_模型特点:使用大规模内部数据集进行训练,对许多场景都具有鲁棒性,在低频带宽度下实现更高的编解码器质量,使用结构化 dropout 进行训练,使用单个模型在推理过程中启用各种带宽,将原始语音波形量化为离散标记序列

与 EnCodec 和 SoundStream 相比, 使用以下改进的技术来训练模型,从而提高编解码器质量和 相同带宽下的 ViSQOL 分数:

  • 幅值频谱loss用于增强中高频信号
  • 结构化 dropout 用于平滑代码空间,并在单个模型中启用各种带宽
  • 码字由 k-means 集群而不是随机值初始化
  • 码本采用指数移动平均和死码消除机制进行维护,因此码本的利用率很高。

模型组成:

  • FunCodec 模型由五个模块组成:域转换模块、编码器、RVQ 模块、解码器和域反转模块。
  • 域变换:将信号转换为时域、短时频域、幅度-角度域或幅度-相位域。
  • 编码器:将信号编码为具有堆叠卷积层和 LSTM 层的紧凑表示。
  • 语义token(可选):使用语义标记增强编码器输出以增强内容信息,此模型中未使用。
  • RVQ:使用级联向量量化器将表示量化为离散标记的并行序列。
  • Decoder:将量化的 embedding 解码到与 inputs 相同的不同信号域中。
  • Domain Inversion:重新合成来自不同域的可感知波形。

Results

相比其他开源的音频编解码训练框架:

1. Comparison of academic models in terms of ViSQOL scores on LibriTTS dataset. † means the model is causal.

2. Comparison between FunCodec and other toolkits under (a) lower and (b) higher token rate. LS denotes Librispeech test sets. While Librispeech and gigaspeech are English corpora, aishell and Wenet are Mandarin corpora.

3. Comparison of FreqCodec and other time domain models in terms of ViSQOL score on LibriTTS. Mag denotes magnitude spectrogram. C_in represents the channel number of inputs.