GLM-4-Voice
GLM-4-Voice是一种智能和人类化的端到端口语聊天机器人模型。该模型通过对多样的语音语料进行大规模预训练,能够理解用户的语音输入并以语义准确的回应方式进行交互。
基本架构
GLM-4-Voice
在 GLM-4-9B 的基础上进行语音模态的预训练和对齐,从而能够理解和生成离散化的语音 token。
Speech Tokenizer
模型采用了一种监督式的语音分词器,能够在超低比特率(175bps)下有效捕捉语音的语义信息,同时保持高质量的语音重建。采用单码本(single-codebook)方法避免了多层语音分词生成所需的复杂架构调整,简化了模型设计。
利用预训练的自动语音识别(ASR)模型whisper-large-v3
作为基础,通过添加池化层和向量量化层来实现语音到标记的转换。
池化层(Pooling Layer)
- 降采样:池化层使用1D平均池化操作,窗口大小为k,这将原始采样率降低到原来的1/k。在GLM-4-Voice中,通过调整池化层的参数可以实现从较高的采样率到12.5Hz的转换,提高了计算效率和处理速度。
- 信息浓缩:池化操作有助于减少时间维度上的冗余信息,使得模型能够专注于更高级别的特征表示。在语音任务中,较低的采样率可以帮助模型更好地捕捉语义信息,同时避免过度拟合于细粒度的声学细节
向量量化层(Vector Quantizer)
- 离散化连续表示:向量量化层负责将编码器生成的连续中间表示映射到代码本中最接近的离散向量。这些选定的代码本索引即为最终的语音标记。
- 学习码本向量:码本向量通过指数移动平均(EMA)进行更新,并且添加了一个承诺损失(commitment loss),确保其与码本向量更加匹配。
EMA是一种统计技术,用于计算一系列数值的加权平均值,其中最近的数据点被赋予更高的权重。与简单移动平均相比,EMA对新数据更为敏感,能够更快地响应变化。
在向量量化过程中,EMA用来平滑地更新代码本中的向量。具体来说,当一个新的连续表示需要被量化时,如果它最接近某个代码本向量,那么这个代码本向量就会根据新的输入进行调整。EMA通过以下公式实现这种更新:
$$new codebookvector=α×newsample+(1−α)×oldcodebookvector$$
其中,α是衰减系数(通常是0.99或类似的小于1的值),决定了新样本的影响程度。这样做的好处是可以使代码本向量逐渐适应新的数据分布,同时保持一定的稳定性,避免因个别异常值而剧烈变动。
承诺损失是在向量量化过程中引入的一种损失函数,它的目的是确保量化前的连续表示与选定的代码本向量之间的差异不会过大。换句话说,它鼓励模型生成的连续表示尽量靠近代码本中的某个向量,从而保证量化后的离散表示仍然是有意义的。
为了支持流式做的改进
为了在推理过程中实现输入语音的流式编码,采用 Whisper 编码器的架构来引入因果关系。用因果卷积替换编码器 Transformer 之前的卷积层。将编码器中的双向注意力替换为块因果注意力。
Speech Decoder
语音解码器在GLM-4-Voice中扮演着至关重要的角色,它负责将离散的语音标记合成连续的语音波形。为了确保生成语音的质量和表现力,同时最小化语音交互中的延迟,解码器必须支持流式推理。GLM-4-Voice采用了CosyVoice 的解码器架构
语音标记编码器(Speech Token Encoder)
- 使用Transformer编码器将离散的语音标记序列转换为具有上下文信息的向量序列。
- 为了支持流式合成,语音标记编码器采用了与语音标记器相同的块因果注意力机制,确保了实时处理能力。
条件流匹配模型(Conditional Flow Matching Model)
- 基于语音标记编码器生成的上下文向量,条件流匹配模型生成梅尔频谱图(Mel spectrograms)。这些频谱图是语音波形的中间表示形式,包含了语音的关键声学特征。
具体来说,模型在每个时间步 t 上更新状态 Xt 到 Xt+1,同时考虑说话人嵌入 v、语义标记 μ 和掩码语音特征 X~ 的影响,能够在保留条件信息的同时高效地建模复杂的分布变换。
HiFi-GAN声码器(HiFi-GAN Vocoder)
- 最终将生成的梅尔频谱图转换为实际的语音波形。
推理解耦:语音到语音任务
为了优化语音到语音的任务处理,GLM-4-Voice采用了一种推理解耦策略,将语音到语音的任务分解为两个子任务:语音到文本(Speech-to-Text)和语音与文本到语音(Speech-and-Text-to-Speech),可以理解为“根据用户音频做出文本回复”和“根据文本回复和用户语音合成回复语音”
推理过程
- 文本生成阶段:
-
- 模型首先根据用户输入的语音 Qs 生成文本响应 At。
- 这一阶段的目标是快速且准确地转换语音为文本,为后续的语音合成提供指导。
- 语音生成阶段:
-
- 利用生成的文本 At 和原始语音输入 Qs,模型生成最终的语音输出 As。
- 通过结合语音上下文和文本内容,模型可以生成更加自然、符合对话情境的语音响应。
解决初始延迟问题
传统的两步法会导致较高的初始延迟,因为必须等待完整的文本生成后才能开始语音合成。为了解决这个问题,GLM-4-Voice引入了一个名为“Streaming Thoughts”的模板机制:
- 交替生成:给定用户语音输入 Qs,模型以指定的比例交替生成文本标记和语音标记。
-
- 比例选择:基于12.5Hz的语音标记器,模型交替生成13个文本标记和26个语音标记,保持1:2的比例。
- 原因:这个比例确保文本生成的速度始终快于语音生成,从而避免生成的语音标记缺乏必要的文本上下文支持。
- 具体实现:
-
- 13个文本标记:保证每次生成足够多的文本信息,为接下来的语音生成提供充分的语义指导。
- 26个语音标记:允许模型生成一段连贯的内容片段,确保合成语音的准确性。
- 拼接:生成的文本标记和语音标记分别拼接成完整的文本响应 At 和语音输出 As。
总体响应延迟计算
为了计算生成首个语音波形的总体响应延迟,GLM-4-Voice将整个过程分解为四个主要阶段:语音标记化、大型语言模型(LLM)预填充、LLM解码和语音解码。每个阶段的延迟可以分别计算,并最终相加以得到总延迟。以下是详细的计算步骤:
1. 语音标记化(Speech Tokenization)
- 描述:用户的语音输入通过流式处理方式由语音标记器处理,该标记器按固定大小$$t_{\text{block}} $$的块进行操作。
- 延迟公式:
$$T_{\text{speech\_tokenize}} = f_{\text{speech\_tokenize}}(t_{\text{block}}) $$
- 说明:由于采用了流式设计,标记器可以在接收到第一个语音块后立即开始处理,因此延迟仅取决于当前块的处理时间,而与总语音时长无关。
2. LLM 预填充(LLM Prefilling)
- 描述:根据用户语音的长度$$ T_{\text{user\_speech}}$$和帧率$$f_r = 12.5$$tokens/秒,确定生成的语音标记数量$$ N_{\text{speech\_tokens}}$$
- 延迟公式:$$T_{\text{llm\_prefill}} = f_{\text{llm\_prefill}}(f_r \cdot T_{\text{user\_speech}})$$
- 说明:预填充阶段是为了让LLM准备好处理接下来的任务,其延迟取决于需要预填充的标记数量。
3. LLM 解码(LLM Decoding)
- 描述:对于初始音频响应,LLM生成13个文本标记和10个语音标记,总计 $$N_{\text{first\_speech}} = 13 + 10 = 23$$个标记。
- 延迟公式:$$T_{\text{llm\_decode}} = f_{\text{llm\_decode}}(N_{\text{first\_speech}})$$
- 说明:此阶段涉及从文本和语音标记生成初步的响应内容,延迟取决于生成的标记总数。
4. 语音解码(Speech Decoding)
- 描述:10个语音标记由语音解码器处理以生成首个音频片段。
- 延迟公式:
$$T_{\text{speech\_decode}} = f_{\text{speech\_decode}}(N_{\text{speech}})$$
- 说明:这一阶段负责将语音标记转换为实际的音频波形,延迟取决于处理的语音标记数量。
总体响应延迟
综合上述四个阶段的延迟,总体响应延迟可以表示为:
$$T_{\text{total}} = T_{\text{speech\_tokenize}} + T_{\text{llm\_prefill}} + T_{\text{llm\_decode}} + T_{\text{speech\_decode}}$$
GLM-4-Voice 训练
预训练方面,为了攻克模型在语音模态下的智商和合成表现力两个难关,将 Speech2Speech 任务解耦合为“根据用户音频做出文本回复”和“根据文本回复和用户语音合成回复语音”两个任务,并设计两种预训练目标,分别基于文本预训练数据和无监督音频数据合成语音-文本交错数据以适配这两种任务形式。GLM-4-Voice-9B 在 GLM-4-9B 的基座模型基础之上,经过了数百万小时音频和数千亿 token 的音频文本交错数据预训练,拥有很强的音频理解和建模能力。
1. 第一阶段:联合语音-文本预训练(Joint Speech-Text Pre-training)
目标:
- 扩展大型语言模型(LLM)的语音建模能力。
- 通过大规模的语音预训练,使模型能够更好地理解和生成自然语音。
数据类型:
- 交错语音-文本数据:促进文本和语音之间的跨模态知识迁移。
- 无监督语音数据:包含70万小时的真实世界语音数据,增强模型的泛化能力。
- 监督语音-文本数据:包括ASR和TTS数据,提高模型在基本语音任务上的表现。
- 文本预训练数据:保持文本处理性能,确保多模态融合的有效性。
训练效果:
- 模型不仅增强了对语音的理解和生成能力,还保持了在文本处理方面的优势。
2. 第二阶段:监督微调(Supervised Fine-tuning)
目标:
- 创建一个类似人类的语音聊天机器人,优化对话质量和语音表现力。
数据构建:
- 多轮对话式语音对话:源自高质量的文本对话数据,经过精炼和合成,确保适合口语交流,并增加了多样化的语音输入。
- 语音风格控制的对话:包含针对特定语音风格要求(如语速、情感或方言)定制的高质量对话。
训练细节:
- 解耦子任务:将语音到语音的任务解耦为两个子任务——语音到文本和语音与文本到语音,采用“Streaming Thoughts”模板减少延迟。
- 分阶段学习:针对文本输出和语音输出的不同学习速度,分别进行集中训练,确保两者都能充分学习。
-
- 文本输出:微调4个epoch。
- 语音输出:微调20个epoch。
- 优化策略:使用渐变的学习率、权重衰减、dropout和梯度裁剪等技术,防止过拟合并稳定训练过程。
下集预告
下一篇介绍moshi
Moshi 的开发流程首先预训练了一个专注于文本处理的大型语言模型 Helium,接着构建了离散化语音模型 Mimi,然后通过 RQ-Transformer 将两者结合并在语音模态上继续训练,最后引入“内心独白”机制以提升合成音频的质量和流式生成的自然度,从而实现高质量的多模态对话体验。