先说结论,其实LLaMA-omni做的就挺好的,思路基本对,所以我今天也围绕着它讲
在O1出来之前,其实多模态是上个世代比较火的技术类型,而大模型的趋势也从O1以后就分开来了
一个是感知能力的提升,主要是GPT4-o这种的,多模态,单一模型的能力
一个是O1这种self-play,自己玩自己(类自博弈)主要解决的是智力和解决问题能力的提升
我之前讲过草莓,后面会随着我深度学习的课程继续讲的更细,因为GPT4o最亮眼的实时语音功能上线了,大家对这个特别感兴趣,所以我就讲一下,但是因为Close AI众所周知的缘故,我就按着类似功能的论文讲了,只是从延迟能力上讲,这个是实现最接近的。
老规矩,论文地址:
2409.06666 (arxiv.org)
GPT4o其实一直就支持语音,只是那个不是端到端,比如你说句话半天才响应你,因为是多模型架构,以下是我们面对的问题。
Whisper ASR要转text问题,GPT去拿text问题推text答案,text用VALL-E转语音
因为,折腾好几遍,慢,而且因为传统的tts,一般都是整句话整明白再转,就更慢。
另外,Whisper如果端到端坐下来,就是个ASR转文字了,所以只保留了语义部分,其他的比如背景音,笑声都丢了,情感感知几乎是不可能的事
要先解决慢的问题
几秒争取到几百毫秒,GPT4o-advanced real-time voice API是350ms左右
思路:
1- Whisper 别做端到端的ASR就能省出来不少时间
2- 流式相应,不用整个句子都推完就给声音解码
拿LLaMA-Omini来举例
这网络其实很简单的,训练也容易,如果不考虑泛化,特定任务也还是可以的。
网络部分的组成,主要有从下往上几个网络组成
1- Speech Encoder:就用了Whisper-Large-3的encoder功能,负责voice转speech representations
2- Speech Adaptor:下采样
3- LLM就是LLmMA-3.1-8b
4- Speech Decoder:上采样
5- Vocoder: Decoder,负责离散单元转成voice
训练的前向部分和推理部分都是从下到上依次经过各个网络
训练分为2个阶段:
一阶段训练
其他参数都冻住,就训练Speech Adaptor和LLM
1-首先语音输入进入Whisper-Large-3,这里我们只用它的encoder部分,也就把语音标记为speech representations,简单理解就是一种把语音信号压缩成的高维向量
2- 这些高维向量 直接进入LLM是不太合适的,所以要有一个中间层做高维向量的下采样,匹配到LLM的输入embedding空间,这一层是2层的MLP,Relu增加非线性能力
3- 被转换的语音信息被嵌入到如下的LLM prompt里(speech字段),然后作为input输入给LLM,这里是LlaMA3.1-8b
4- voice的问题,被用text来回答
求对数损失函数,求梯度
这里面有几个问题,大家能看出来,这个数据集一会语音一会text的,到底是啥样的?
名为 InstructS2S-200K 的数据集(未公开)
1-数据集构建的目标:
•训练 LLaMA-Omni 模型需要包含语音指令、文本回复和语音回复三元组
的数据。
•然而,大多数公开可用的指令数据都是文本形式的。
•因此,研究人员需要构建一个包含语音指令和对应语音回复的数据集
2-InstructS2S-200K 的构建过程:
•重写现有的文本指令数据: 研究人员首先根据语音输入的特点对现有的文
本指令数据进行重写,使其更符合自然语音的表达习惯。
•进行语音合成: 将重写后的指令文本和生成的回复文本,使用语音合成模型转换成语音数据。
构建数据集具体步骤
步骤一:
用Llama-3-70B-Instruct指令重写
添加适当的填充词 (例如 “hey”, “so”, “uh”, “um” 等) 模仿自然语音模式
将指令中的非文本符号 (例如数字) 转换成对应的口语形式,以确保语音合成模型能够正确合成
修改指令使其相对简短,避免冗长的措辞。
回复生成重写
语音交互场景下,文本指令数据的回复通常不适合直接用作语音指令的回复,这是因为,在基于文本的交互中,模型倾向于生成冗长的回复,使用复杂的句子,并可能包含诸如有序列表或括号之类的非语言元素。这是因为,在基于文本的交互中,模型倾向于生成冗长的回复,使用复杂的句子,并可能包含诸如有序列表或括号之类的非语言元素。
回复不应包含语音合成模型无法合成的内容,例如括号、有序列表等。
回复应非常简洁,避免冗长的解释。
语音合成
在获得适合语音交互的指令和回复后,TTS 模型将其转换为语音
为了使合成的语音听起来更自然,使用 CosyVoice-300M-SFT 模型合成指令语音,并为每个指令随机选择男性或女性的声音。
对于回复,使用在 LJSpeech 数据集上训练的 VITS 模型将其合成为标准语音
数据来源:
研究人员从 Alpaca 数据集和 UltraChat 数据集中收集了约 20 万条文本指令数据
Alpaca 数据集涵盖了广泛的主题,而 UltraChat 数据集主要包含关于世界的问题。
二阶段训练
其他参数都冻住,就训练Decoder
•1阶段,训练好了Voice问,Text答,而且中间不用转
•2阶段,我们冻住其他所有参数,就训练decoder,也就是语音合成生成
•输入为LLM的text
•输出为voice
•首先要做逆向,之前不是把语音的高维序列下采样吗,现在要上采样把llm的维度扩展到直接可以被speech decoder作为input的维度,LLM的text这次不用被输出,直接hidden的隐状态tensor 乘以λ形成对Decoder的输入
•ai 表示要预测的离散单元,它可以是K个聚类中心之一,也可以是空白符号 ϵ
•softmax函数将线性层的输出转换为概率分布,这个公式计算了每个离散单元 ai在给定语音解码器输出隐藏状态序列 O 下的概率
•这个公式计算了在给定语音解码器输出隐藏状态序列 O下,目标离散单元序列 YU的负对数似然。通过最小化这个损失函数,可以训练语音解码器使其能够准确地预测与文本回复对应的离散单元序列
•因为Decoder训练的时候就是用离散单元来生成语音的波形的,所以二阶段就训练这个就可以了
•因为上采样层是固定参数的,所以不参与训练
•最后用CTC的函数来求Loss
输出加速
同步生成文本和语音
•同时生成文本回复和语音回复,而不需要像传统的级联系统那样先完成语音识别,再生成文本回复,最后合成语音,从而大大缩短了整体的响应时间。
•流式非自回归语音解码器
•采用了流式非自回归语音解码器,这意味着语音解码器可以随着 LLM 生成文本回复的同时逐步生成语音回复对应的离散单元,而无需等待LLM 生成完整的文本回复,当LLM 生成第一个词的时候,语音解码器就可以开始生成第一个语音片段对应的离散单元,并将其送入声码器合成语音并播放给用户。
•每个离散单元的生成都是并行的,而不是像自回归模型那样需要逐个生成,每个离散单元的生成都是并行的,而不是像自回归模型那样需要逐个生成。
•LLaMA-Omni 可以通过调整单元块大小(Chunk Size) Ω 来控制系统的延迟和语音质量之间的权衡。
•Ω 表示当生成的离散单元数量达到多少时,就将这部分单元送入声码器合成语音并播放给用户。
•较小的 Ω 值意味着更低的延迟,但可能会导致语音片段之间出现不连续,从而降低语音的流畅度。
•较大的 Ω 值可以提高语音质量,但会增加延迟。
•当 Ω 设置为 10 时,LLaMA-Omni 的响应延迟可以低至226 毫秒,甚至低于GPT-4o 的平均音频延迟 320 毫秒
因为LLaMA-omni实际上在输入侧就一个voice input,但是文章里面的prompt其实也提示了,这里还有个text input的embedding,这就涉及到模态融合embedding的融合了,只不过这里做的特别巧妙,但是在GPT4o因为它的模态更多,更复杂,所以对模态的embedding要求更高,因为embedding不可能无限长,所以为了兼容视觉和语音,GPT4o的text embedding长度也被压缩了
快解决了下一步是好
合成语音没感情,除了合成语音以外?
比如你看过4月的纽约时报你就会了解到OpenAI其实在那个时候就秘密的启动了,因为有统计它用了差不多100万小时的Youtube影片,这里面的视觉估计是给Sora了,而声音的多样性就给了voice了
情感的保留?
这块我直接引用李宏毅的slide了
LLaMA-omni这种实验性质的project可能不关注,但是对于GPT这种服务体验其实特别重要,比如说对话中的质疑生意,笑声传达的情绪,其实都可以通过把语音辨识能力和特定的speech unit编码迁移到模型中去,就是个持续预训练的过程
当然Speaker Diarization和多通道attention这些技术其实GPT4o也用了,时间关系这些我就不细讲了,优化的feature,大家感兴趣的自己下去看看论文吧
虽然多模态也挺有意思,但是对于我最近最爱玩的东西来讲,咱们还是在强化学习的文章里正面硬钢吧