作者:yearn
原文:https://zhuanlan.zhihu.com/p/8242564370
近年来大语言模型(LLM)的快速发展为智能应用带来了巨大机会,而语音作为自然的人机交互形式,其与LLM的结合可以显著提升用户体验。然而,传统的语音交互方式通过ASR + LLM + TTS的级联方式实现,存在高工程复杂性和较大交互延迟的问题。此外,多模态LLM的现有研究在语音与文本模态的对齐过程中,多多少少需要对LLM参数进行微调,而这可能导致灾难性遗忘问题,进而影响模型的智能性。因此,Freeze-Omni模型应运而生,旨在解决以上问题,通过冻结LLM参数,在保持智能性的同时,实现低延迟的语音对语音对话能力。
本文对Freeze-Omini进行详细的介绍,一些语音侧的相关知识在paper中并未详细介绍,为了方便读者阅读放在文章末尾。
主要贡献
1.冻结LLM参数
在整个训练过程中完全冻结LLM的参数,避免了因数据量不足或计算资源有限导致的灾难性遗忘问题,同时保留了低延迟语音对语音对话的能力。
2.低数据需求与低资源消耗
训练过程中仅需要语音-文本配对数据(如ASR和TTS训练数据)以及少量文本模态的问答数据(约60,000条),显著降低了数据规模与计算资源需求。
3.支持任意文本模态LLM
Freeze-Omni可以支持任何具备文本模态的(多模态)LLM,并保留LLM的提示词跟随与角色扮演能力。如果需要更改LLM的响应风格,只需用对应风格的文本数据对其进行微调。
4.创新的双工对话设计 通过多任务训练实现了用户自然插话的双工对话能力,使得Freeze-Omni的对话风格更加自然。
5.语音输入与输出的创新建模
通过设计分阶段的训练策略和前缀kv-cache微调策略,Freeze-Omni在冻结LLM的同时实现了语音输入到文本输出以及文本输入到语音输出的能力。
技术细节
模型概览
1.支持流式语音输入的语音编码器。 2.生成流式输出语音的语音解码器。 3.冻结的LLM骨干模型,通过语音编码器和解码器实现语音对语音的对话能力。
在训练过程中,模型依次完成语音输入到文本输出、文本输入到语音输出的能力对齐,最终通过组件连接实现端到端语音对语音交互。
语音输入建模
流式语音编码器
模型利用分块式流式语音编码器,将语音特征转化为高维表征,随后通过适配器映射到LLM的嵌入空间。 编码器由若干下采样卷积层和Transformer块组成,适配器仅包含下采样卷积层。下采样的目的是降低语音特征帧率,提高LLM的预填充阶段速度,并减少延迟。
三阶段训练策略
第一阶段:
输入为语音特征,标签为语音对应的文本转录。 使用CTC损失函数完成常规语音识别模型的训练。 第二阶段: 以第一阶段训练好的语音编码器作为初始化参数,通过适配器连接到冻结的LLM。 输出仍为语音对应的文本转录,输入部分加入可训练的特殊token以引导训练过程。 第三阶段: 构建多轮问答数据集,利用LLM生成对应的多轮答案数据。 使用多个说话者的TTS系统生成语音模态数据,训练中在每个问题前加入可训练的提示词嵌入,引导模型完成语音输入到文本输出的能力。
语音输出建模
架构设计
受VALL-E启发,Freeze-Omni的语音解码器采用基于token的解码结构,包含非自回归(NAR)预填充阶段和自回归(AR)生成阶段。 解码器由NAR解码器、AR解码器和codec模型解码器组成: NAR解码器建模LLM的语义特征。 AR解码器基于NAR输出生成语音token。 codec模型解码器将语音token转换为语音流。
1. 单码本(Single-Codebook)Codec模型
单码本Codec模型是一种用于语音压缩和生成的技术,主要作用是将语音信号映射为离散的语音token(类似于语音的特征编码),并通过解码器将这些语音token还原为语音信号。
单码本的作用: 将语音信号进行压缩,以便模型以低维度的离散token表示语音。 简化了解码过程,减少系统复杂性和计算延迟。 为什么使用单码本: 单码本的设计仅需一个特征字典(codebook)即可完成语音的编码和解码,相比多码本方法复杂度更低且效率更高。 在有限数量的说话人场景中,单码本能提供足够的语音质量。
2. 基于Token的解码结构
Freeze-Omni的语音生成通过基于token的解码结构完成,核心思路是将语音信号离散化为语音token,逐步生成语音流。
解码流程:
1.NAR解码器:
非自回归(Non-Autoregressive, NAR)解码器并行处理文本token,建模LLM输出的语义特征。 主要功能是从LLM的语义信息中生成初步的语音token分布。 优点是并行化生成语音token,提高解码速度。
2.AR解码器:
自回归(Autoregressive, AR)解码器基于NAR生成的语音token,逐步生成更高质量的语音token序列。 自回归的特点是每次生成一个token,利用之前生成的token优化当前输出,因此生成效果更自然但速度稍慢。
3.Codec模型解码器:
将最终生成的语音token序列解码为连续的语音信号流(waveform)。 作用类似于将离散编码转回到音频波形,完成语音生成。
3. 语音流生成
过程概述: AR解码器生成语音token序列。 Codec模型根据固定大小的语音token块,将token逐步解码为流式的语音信号。 为什么是流式生成: 为了减少生成延迟,Freeze-Omni使用分块方式生成语音流。 每一块语音token生成后即可解码为语音信号,用户可以实时听到部分生成的语音。
总结
Freeze-Omni通过单码本Codec模型压缩语音表示,结合NAR和AR解码器生成高质量语音token,最终通过Codec解码器将token转为语音流。这种基于token的解码结构能够在效率与质量之间取得平衡。
三阶段训练策略
第一阶段:
使用单码本(single-codebook)codec模型,仅通过语音数据训练。 单码本减少系统复杂性和延迟。
第二阶段:
构建大规模文本-语音配对数据,将文本通过LLM的tokenizer转为文本token。 NAR 和 AR 解码器共享相同的参数,以简化模型设计 文本token经嵌入层转为语义特征,输入到NAR解码器,AR解码器使用teacher-force方式预测语音token(Teacher-Force 是一种在Sequence-to-Sequence模型训练中常用的技巧,主要用于生成任务中。其核心思想是:在模型训练时,不使用模型先前生成的输出作为下一步的输入,而是直接使用Ground Truth作为下一步的输入。),标签为第一阶段codec模型提取的语音token。
这一阶段通过文本 Token 到语音 Token 的映射,建立从文本模态到语音模态的生成能力。
第三阶段: 模型架构
1.NAR前缀语音解码器(NAR Prefix Speech Decoder) (是唯一可训练的模块,用于适配LLM隐藏状态):
新增的解码器,用于建模LLM输出的隐藏状态。 它的输出 kv-cache 将作为输入传递给第二阶段训练好的 NAR 语音解码器。
2.NAR语音解码器:
在第二阶段已完成训练,用于解码文本 token。 利用 NAR 前缀解码器的 kv-cache 作为额外输入,提升对隐藏状态的理解。
3.AR语音解码器:
用于生成最终的语音 token。 标签为: 使用 TTS 系统将 LLM 输出文本转为语音数据。 再通过第一阶段训练好的 codec 模型,将语音数据转为语音 token。
总的来看,需要通过第三阶段训练 NAR 前缀解码器,将语音解码器与 LLM 输出紧密耦合。
双工对话设计详解
1. 分块状态预测方法
触发机制: 使用声学VAD模块检测语音流的起始点。 当VAD模块被触发时,语音流会以“分块(chunk)”形式输入到 Freeze-Omni。
VAD(Voice Activity Detection,语音活动检测) 是一种用于判断音频中是否存在语音活动的技术。它的主要 作用是从音频信号中区分语音和非语音部分,比如背景噪声或静音区域。
状态分类器: 状态 0:当前 LLM 能继续接收语音输入。 状态 1:当前语音分块是结束语音的最后一块,并表示用户将打断对话,LLM 会开始一个新的生成阶段。 状态 2:当前语音分块是结束语音的最后一块,但不需要打断对话。 在LLM的最后一层隐藏状态后添加一个分类层,用于预测每个语音分块的状态。 定义三种状态: 分块处理:
当状态为 1 或 2 时,系统会停止将语音流发送给 Freeze-Omni,并重置 VAD 模块以准备接收新的语音输入。
训练策略:
在语音输入的第三阶段中完成,使用多任务优化方法,联合训练状态分类层和 LLM。 状态标签仅在每个语音分块的最后一帧有效。
2. “模型即服务”策略
多模型并发运行: 同时启动多个 Freeze-Omni 实例,将其作为一个服务器。 当用户的 VAD 被触发时,语音流以分块形式发送到服务器。 服务器调度空闲模型来处理当前语音分块。 缓存管理: 推理过程中,语音编码器和 LLM 的 kv-cache 与 CNN 缓存独立存储。 服务器仅需为每个用户保存其推理缓存,无需绑定某个具体模型。 灵活响应: 任何服务器上的模型都可以响应任意用户的语音分块,无需指定固定的“监控模型”或“生成模型”。
3. 流程概述
用户语音流通过 VAD 模块检测起始点,进入分块处理流程。 每个分块通过 Freeze-Omni 的语音编码器和 LLM,并在最后一帧输出状态预测结果。
根据预测状态:
状态 0:继续接收语音流。 状态 1 或 2:停止语音流,重置 VAD 模块。
利用“model as a server'”策略,同时部署多个模型,由空闲模型高效处理多用户请求。
4. 优势
实时性:通过分块处理和状态预测,实现低延迟的语音交互。 灵活性:服务器无需绑定特定模型,增强了系统的扩展性和资源利用率。 自然对话:支持用户打断对话或自然结束语音流,使 Freeze-Omni 的对话风格更贴近真实场景。
实现配置
数据集
1.多轮问答数据:
从 moss-003-sft-data 数据集中随机选择 60,000 条多轮 Q&A 数据,并用 LLM 重新生成答案。 使用零样本 TTS 系统将文本转换为语音。
2.语音输入建模:
阶段 1 和阶段 2:使用 110,000 小时中英双语语音-文本配对 ASR 数据。 阶段 3:使用多轮 Q&A 数据中的语音输入与文本输出配对。
3.语音输出建模:
阶段 1 和阶段 2:使用 3,000 小时由零样本 TTS 系统生成的文本-语音配对数据。 阶段 3:使用多轮 Q&A 数据中的文本输入与语音输出配对。
模型配置
1.LLM 后端:
使用 Qwen2-7B-Instruct 作为骨干模型,验证 Freeze-Omni 的方法。 Freeze-Omni 的训练过程中不对 LLM 参数进行更新,理论上支持任意 LLM。
2.语音编码器:
使用多层卷积(4 倍下采样)和 24 层 Transformer,隐藏层大小为 1024。 适配器采用多卷积层(2 倍下采样)。 总参数量约 350M,输出帧率为 12.5Hz。
3.语音解码器:
使用 TiCodec 作为 codec 模型,单码本大小为 1024,语音 token 的频率为 40Hz。 解码器包含 4 层 Llama 解码层,隐藏层大小为 896。 总参数量约 120M,输出采样率为 24000Hz。
实验结果解析
语音输入结果
在阶段 2 验证 ASR 的准确性,结果见表 1: 动态分块训练(chunk size 可变)增强了模型的鲁棒性。 Chunk=∞ 的情况下性能优于 Chunk=4。 未使用动态分块但固定 chunk size 训练,性能较好但限制了灵活性。
语音输出结果
验证语音解码器的语音输出准确性,使用 CER(字符错误率)评价: 引入 LLM 隐藏状态作为 NAR 前缀解码器的输入后,语音解码器性能显著提升。 增加 top-k 值增强了语音生成的鲁棒性(见表 2)。
语音问答结果
验证模型在多模态问答任务中的表现(见表 3): Freeze-Omni 在三个数据集(Web Questions、LlaMA Questions 和 Trivia QA)上都展现出优秀的性能。 与骨干 LLM 的准确率差距显著小于其他模型,表明 Freeze-Omni 能够在语音和文本模态中保持相同水平。
语音to文本相关知识
简单术语解析
1. ASR(自动语音识别)
ASR (Automatic Speech Recognition) 是一种将语音信号转换为对应文本的技术。在Freeze-Omni中,ASR的主要作用是处理语音输入并将其转换为模型可处理的文本内容,从而实现语音到文本的映射。
2. TTS(文本到语音转换)
TTS (Text-to-Speech) 是一种将文本信息转换为语音输出的技术。在Freeze-Omni中,TTS主要用于将LLM生成的文本答案转为语音输出,实现文本到语音的自然连接。
3. CTC损失函数
CTC (Connectionist Temporal Classification) 是一种广泛应用于语音识别任务(ASR)的损失函数,适用于输入和输出长度不匹配的情况。CTC的基本思路是:
为每一帧输入生成一组可能的输出。 允许输出中插入“空”标记(blank)来对齐时间步,解决语音输入与文本输出长度不一致的问题。 通过动态规划计算所有可能路径的概率并最大化正确路径的概率。
CTC核心公式: 假设输入序列为 ,输出序列为 ,模型的输出概率为 (是对齐路径),CTC目标是最大化输出序列 的概率:
其中,表示所有可能对齐的路径集合。
总结
ASR提供语音转文本能力,是Freeze-Omni输入语音处理的第一步。 TTS提供文本转语音能力,用于生成自然语音输出。 CTC损失是Freeze-Omni训练语音编码器的关键技术,通过对不匹配长度的输入输出进行对齐,优化模型对语音的语义理解能力。