首页 > 其他分享 >腾讯优图最新开源Freeze-Omini:冻结LLM引入语音处理能力

腾讯优图最新开源Freeze-Omini:冻结LLM引入语音处理能力

时间:2024-12-14 15:00:00浏览次数:7  
标签:Omini 语音 模型 Freeze token 解码器 优图 LLM 文本

作者: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的同时实现了语音输入到文本输出以及文本输入到语音输出的能力。

技术细节

模型概览

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训练语音编码器的关键技术,通过对不匹配长度的输入输出进行对齐,优化模型对语音的语义理解能力。

标签:Omini,语音,模型,Freeze,token,解码器,优图,LLM,文本
From: https://blog.csdn.net/AIBigModel/article/details/144466604

相关文章

  • 举例说明object.freeze有哪些用途呢?
    Object.freeze()在前端开发中有多种用途,主要围绕着防止对象被修改这个核心功能:1.强制不可变数据:这是最常见的用途。当你想确保一个对象在创建后不会被修改时,可以使用Object.freeze()。这对于创建常量、配置对象或任何你不希望被意外更改的数据结构非常有用。constCONFIG......
  • 大模型新玩法!腾讯优图与上交大联手 利用公开知识提升大模型
    腾讯优图实验室与上海交通大学的研究团队联手推出了一项革命性的知识增强方法,为大模型优化开辟了全新道路。这项创新技术摒弃了传统模型微调的局限,直接从开源数据中提取知识,大幅简化了模型优化流程,在多项任务中实现了超越现有最先进技术(SOTA)的卓越表现。近年来,大型语言模......
  • 安装mayavi命令,使用cxfreeze打包python脚本
    pipinstallnumpy出现Anewreleaseofpipisavailable:23.2.1->24.2输入:python-mpipinstall--upgradepipsetuptoolswheelpipinstallPyQt5pipinstallvtkpipinstallmayavipipinstallscipypipinstallconfigobj 查看当前项目的依赖包:pipfr......
  • JavaScript中的Object.freeze()和Object.seal()
    一、Object.freeze()1.简介:Object.freeze()是一个可以将对象冻结的方法。一旦对象被冻结,就不能添加、删除或修改其属性。这在需要确保对象完整性、防止任何意外或故意更改的场景中非常有用constperson={name:'Alice',age:30};Object.freeze(person);p......
  • WPF CanFreeze Freeze IsFrozen
    Freezable—Thebaseclassforobjectsthatcanbe“frozen”intoaread-onlystatefor performancereasons.Freezables,oncefrozen,canbesafelysharedamongmultiple threads,unlikeallotherDispatcherObjects.Frozenobjectscanneverbeunfrozen,buty......
  • cx_Freeze 打包生成Linux可执行文件
    准备一台linux系统环境安装cx_Freezepipinstallcx_Freeze准备两个py脚本1,app应用脚本,需要打包的app.pyimportrandomimporttimefromflaskimportFlask,jsonifyfromconcurrent.futuresimportThreadPoolExecutorapp=Flask(__name__)executor=ThreadPoolE......
  • 大模型 freeze参数冻结哪些层?
    llamafactoryfreeze参数冻结哪些层AnswerLLaMAFactory中的freeze微调方法允许用户选择性地冻结模型的某些层,只对部分层进行微调。具体来说:freeze微调方法会根据用户设置的参数来决定冻结哪些层:可以设置num_layer_trainable参数来指定要训练的层数可以设置train_o......
  • ES6 Object.freeze()和Object.seal()
    在JavaScript编程中,管理对象的可变性对于保持代码的稳定性和可预测性至关重要。有两个强大的方法可以帮助控制对象属性的变化,它们分别是Object.freeze()和Object.seal()。这篇文章将深入探讨Object.freeze()和Object.seal()的实际用途,并通过实例来说明它们的功能和使用场景,帮助......
  • 使用 cx_freeze 时 python 库 speedtest/speedtes-cli 和 tkinter 的问题
    我编写了一个脚本来使用python/tkinter和speedtest库(speedtest/speedtest-cli)执行许多宽带速度测试。当作为普通python脚本运行时,该程序按预期工作。我可以使用cx_freeze创建一个exe文件,它会正常创建所有内容。当我运行exe文件时,我得到以下回溯...Traceback(m......
  • AttributeError:模块“flax.traverse_util”没有属性“unfreeze”
    我正在尝试运行用jax编写的模型,https://github.com/lindermanlab/S5但是,我遇到了一些错误,显示Traceback(mostrecentcalllast):File"/Path/run_train.py",line101,in<module>train(parser.parse_args())File"/Path/train.py",line......