BPE分词算法-原理和代码实现

三种主流的Subword算法,它们分别是:Byte Pair Encoding (BPE)、WordPiece和Unigram Language Model。

执行分词的算法模型称为分词器(Tokenizer),划分好的一个个词称为Token(中文叫词元,为啥不直接叫Word?接着往后看),这个过程称为Tokenization

我们将一个个的token(可以理解为小片段)表示向量,我们分词的目的就是尽可能的让这些向量蕴含更多有用的信息,然后把这些向量输入到算法模型中。

由于一篇文本的词往往太多了,为了方便算法模型训练,我们会选取出频率(也可能是其它的权重)最高的若干个词组成一个词表(Vocabulary)

‼️古典分词方法的缺点

一个句子,使用不同的规则,将有许多种不同的分词结果。古典分词方法的缺点非常明显:

  • 对于未在词表中出现的词(Out Of Vocabulary, OOV),模型将无法处理(未知符号标记为 [UNK])。
  • 词表中的低频词/稀疏词在模型训无法得到训练(因为词表大小有限,太大的话会影响效率)。
  • ⭐️很多语言难以用空格进行分词,例如英语单词的多形态,”look”衍生出的”looks”, “looking”, “looked”,其实都是一个意思,但是在词表中却被当作不同的词处理,模型也无法通过old, older, oldest之间的关系学到smart, smarter, smartest之间的关系。这一方面增加了训练冗余,另一方面也造成了大词汇量问题。

Character embedding,是一种更为极端的分词方法,直接把一个词分成一个一个的字母和特殊符号。虽然能解决OOV问题,也避免了大词汇量问题,但缺点也太明显了,粒度太细,训练花费的成本太高,但这种思想或许我们后面会用到。

BERT算法的横空出世,NLP中的很多领域都被颠覆性的改变了,BERT也称为了一个非常主流的NLP算法。由于BERT的特性,要求分词方法也必须作出改变。这就对应提出了Subword算法(或成为WordPiece),该算法已经成为一种标配。

基于子词的分词方法(Subword Tokenization)

可见不论是传统分词算法的局限性,还是BERT的横空出世,都要求我们提出新的分词算法,下面就轮到本文的主角登场:基于子词的分词方法(Subword Tokenization),简称为Subword算法,意思就是把一个词切成更小的一块一块的子词。如果我们能使用将一个token分成多个subtokens,上面的问题就能很好的解决

这种方法的目的是通过一个有限的词表来解决所有单词的分词问题,同时尽可能将结果中token的数目降到最低。例如,可以用更小的词片段来组成更大的词,例如:

unfortunately” = “un” + “for” + “tun” + “ate” + “ly”。

可以看到,有点类似英语中的词根词缀拼词法,其中的这些小片段又可以用来构造其他词。可见这样做,既可以降低词表的大小同时对相近词也能更好地处理

Subword与传统分词方法的比较

  • 传统词表示方法无法很好的处理未知或罕见的词汇(OOV问题)。
  • 传统词tokenization方法不利于模型学习词缀之间的关系,例如模型学到的“old”, “older”, and “oldest”之间的关系无法泛化到“smart”, “smarter”, and “smartest”。
  • Character embedding作为OOV的解决方法粒度太细。
  • Subword粒度在词与字符之间,能够较好的平衡OOV问题。

目前有三种主流的Subword算法,它们分别是:Byte Pair Encoding (BPE)、WordPiece和Unigram Language Model。

字节对编码(BPE, Byte Pair Encoding)

字节对编码(BPE, Byte Pair Encoder),又称digram coding双字母组合编码,是一种数据压缩算法,用来在固定大小的词表中实现可变⻓度的子词。该算法简单有效,因而目前它是最流行的方法。

BPE首先将词分成单个字符,然后依次用另一个字符替换频率最高一对字符,直到循环次数结束。

接下来详细介绍BPE在分词中的算法过程:

算法过程

  1. 准备语料库,确定期望的subword词表大小等参数
  2. 通常在每个单词末尾添加后缀</w>,统计每个单词出现的频率,例如,low的频率为5,那么我们将其改写为"l o w </ w>”:5 注:停止符</w>的意义在于标明subword是词后缀。举例来说:st不加</w>可以出现在词首,如st ar;加了</w>表明该子词位于词尾,如we st</w>,二者意义截然不同
  3. 将语料库中所有单词拆分为单个字符,用所有单个字符建立最初的词典,并统计每个字符的频率,本阶段的subword的粒度是字符
  4. 挑出频次最高的符号对,比如说 th 组成的 th,将新字符加入词表,然后将语料中所有该字符对融合(merge),即所有 th 都变为 th。 注:新字符依然可以参与后续的merge,有点类似哈夫曼树,BPE实际上就是一种贪心算法
  5. 重复遍历 2和 3 操作,直到词表中单词数达到设定量下一个最高频数为1,如果已经打到设定量,其余的词汇直接丢弃

注:看似我们要维护两张表,一个词表,一个字符表,实际上只有一张,词表只是为了我们方便理解。</w> 是为了明确 subword 是否是词尾,它在训练、merge 过程中和普通字符一样对待,在最终输出时作为重建原词的标记使用。

我们举一个完整的例子,来直观地看一下这个过程:

1、获取语料库,这样一段话为例:FloydHub is the fastest way to build, train and deploy deep learning models. Build deep learning models in the cloud. Train deep learning models.

2、拆分,加后缀,统计词频:

3、建立词表,统计字符频率(顺便排个序):

4、以第一次迭代为例,将字符频率最高的de替换为de,后面依次迭代:

5、更新词表 继续迭代直到达到预设的subwords词表大小或下一个最高频的字节对出现频率为1。

如果将词表大小设置为10,最终的结果为:

d e
r n
rn i
rni n
rnin g</w>
o de
ode l
m odel
l o
l e

这样我们就得到了更加合适的词表,这个词表可能会出现一些不是单词的组合,但是其本身有意义的一种形式

BPE的优点

上面例子中的语料库很小,知识为了方便我们理解BPE的过程,但实际中语料库往往非常非常大,无法给每个词(token)都放在词表中。BPE的优点就在于,可以很有效地平衡词典大小和编码步骤数(将语料编码所需要的token数量)。

随着合并的次数增加,词表大小通常先增加后减小。迭代次数太小,大部分还是字母,没什么意义;迭代次数多,又重新变回了原来那几个词。所以词表大小要取一个中间值。

BPE的缺点

  • 对于同一个句子, 例如Hello world,如图所示,可能会有不同的Subword序列。不同的Subword序列会产生完全不同的id序列表示,这种歧义可能在解码阶段无法解决。在翻译任务中,不同的id序列可能翻译出不同的句子,这显然是错误的。
  • 在训练任务中,如果能对不同的Subword进行训练的话,将增加模型的健壮性,能够容忍更多的噪声,而BPE的贪心算法无法对随机分布进行学习。

个人理解:我感觉缺点直接可以忽略

BPE的适用范围

BPE一般适用在欧美语言拉丁语系中,因为欧美语言大多是字符形式,涉及前缀、后缀的单词比较多。而中文的汉字一般不用BPE进行编码,因为中文是字无法进行拆分。对中文的处理通常只有分词和分字两种。理论上分词效果更好,更好的区别语义。分字效率高、简洁,因为常用的字不过3000字,词表更加简短。

BPE的实现

实现代码如下:

import re, collections

def get_vocab(filename):
    vocab = collections.defaultdict(int)
    with open(filename, 'r', encoding='utf-8') as fhand:
        for line in fhand:
            words = line.strip().split()
            for word in words:
                vocab[' '.join(list(word)) + ' </w>'] += 1
    return vocab

def get_stats(vocab):
    pairs = collections.defaultdict(int)
    for word, freq in vocab.items():
        symbols = word.split()
        for i in range(len(symbols)-1):
            pairs[symbols[i],symbols[i+1]] += freq
    return pairs

def merge_vocab(pair, v_in):
    v_out = {}
    bigram = re.escape(' '.join(pair))
    p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
    for word in v_in:
        w_out = p.sub(''.join(pair), word)
        v_out[w_out] = v_in[word]
    return v_out

def get_tokens(vocab):
    tokens = collections.defaultdict(int)
    for word, freq in vocab.items():
        word_tokens = word.split()
        for token in word_tokens:
            tokens[token] += freq
    return tokens

跑一个例子试一下,这里已经对原句子进行了预处理:

vocab = {'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w e s t </w>': 6, 'w i d e s t </w>': 3}
print('==========')
print('Tokens Before BPE')
tokens = get_tokens(vocab)
print('Tokens: {}'.format(tokens))
print('Number of tokens: {}'.format(len(tokens)))
print('==========')

num_merges = 5
for i in range(num_merges):
    pairs = get_stats(vocab)
    if not pairs:
        break
    best = max(pairs, key=pairs.get)
    vocab = merge_vocab(best, vocab)
    print('Iter: {}'.format(i))
    print('Best pair: {}'.format(best))
    tokens = get_tokens(vocab)
    print('Tokens: {}'.format(tokens))
    print('Number of tokens: {}'.format(len(token

结果:

==========
Tokens Before BPE
Tokens: defaultdict(<class 'int'>, {'l': 7, 'o': 7, 'w': 16, '</w>': 16, 'e': 17, 'r': 2, 'n': 6, 's': 9, 't': 9, 'i': 3, 'd': 3})
Number of tokens: 11
==========
Iter: 0
Best pair: ('e', 's')
Tokens: defaultdict(<class 'int'>, {'l': 7, 'o': 7, 'w': 16, '</w>': 16, 'e': 8, 'r': 2, 'n': 6, 'es': 9, 't': 9, 'i': 3, 'd': 3})
Number of tokens: 11
==========
Iter: 1
Best pair: ('es', 't')
Tokens: defaultdict(<class 'int'>, {'l': 7, 'o': 7, 'w': 16, '</w>': 16, 'e': 8, 'r': 2, 'n': 6, 'est': 9, 'i': 3, 'd': 3})
Number of tokens: 10
==========
Iter: 2
Best pair: ('est', '</w>')
Tokens: defaultdict(<class 'int'>, {'l': 7, 'o': 7, 'w': 16, '</w>': 7, 'e': 8, 'r': 2, 'n': 6, 'est</w>': 9, 'i': 3, 'd': 3})
Number of tokens: 10
==========
Iter: 3
Best pair: ('l', 'o')
Tokens: defaultdict(<class 'int'>, {'lo': 7, 'w': 16, '</w>': 7, 'e': 8, 'r': 2, 'n': 6, 'est</w>': 9, 'i': 3, 'd': 3})
Number of tokens: 9
==========
Iter: 4
Best pair: ('lo', 'w')
Tokens: defaultdict(<class 'int'>, {'low': 7, '</w>': 7, 'e': 8, 'r': 2, 'n': 6, 'w': 9, 'est</w>': 9, 'i': 3, 'd': 3})
Number of tokens: 9
==========

编码与解码

上面的过程称为编码。解码过程比较简单,如果相邻子词间没有中止符,则将两子词直接拼接,否则两子词之间添加分隔符。 如果仍然有子字符串没被替换但所有token都已迭代完毕,则将剩余的子词替换为特殊token,如<unk>。例如:

# 编码序列
["the</w>", "high", "est</w>", "moun", "tain</w>"]

# 解码序列
"the</w> highest</w> mountain</w>"

如何调包使用BPE

BPE 可以直接用最经典的 subword-nmt 包,不需要自己实现

Nexa AI OmniAudio-2.6B:全球最快的边缘部署音频语言模型

OmniAudio 是全球最快、最高效的音频语言模型——OmniAudio – 2.6B 是一款高性能的多模态音频语言模型,参数量为 2.6B,能够高效处理文本和音频输入。它将 Gemma – 2 – 2B、WhisperTurbo 以及定制的 Projector 模块集成到一个统一框架中,突破了传统模型串联 ASR(自动语音识别)和 LLM(大语言模型)的架构限制,实现了更低延迟、更高效能的音频 – 文本一体化处理。这种一体化的设计使得音频信息能够直接在模型内部进行处理和转换,避免了传统架构中多次数据传输和处理带来的延迟和资源浪费。

huggingface : https://huggingface.co/NexaAIDev/OmniAudio-2.6B

二、技术原理

1、模型架构

Gemma – 2 – 2B:作为负责文本处理的基础语言模型,它拥有强大的语言理解和生成能力。其内部的神经网络结构经过精心设计和训练,能够对音频文本转换后的文本进行深入分析和理解。例如,在处理复杂的语义关系时,Gemma – 2 – 2B 可以准确地识别出词汇之间的逻辑联系,从而为后续的语言生成提供准确的基础。

  • WhisperTurbo是优化后的音频编码器,能够生成高质量的音频嵌入。它通过对音频信号进行特征提取和编码,将音频信息转化为模型可处理的形式。WhisperTurbo 在处理音频信号时,能够捕捉到音频中的细微特征,如语音的语调、语速变化等,这些特征对于准确理解音频内容至关重要。
  • 定制Projector模块:将 Whisper 的音频 token 转化为与 Gemma 文本嵌入对齐的序列,确保音频 – 文本模态的高效融合。它通过一种特殊的映射机制,使得音频和文本在向量空间中能够准确对应,同时保持语言模型的原始性能。这种对齐方式使得模型在处理音频输入时,能够像处理文本输入一样高效地进行语言理解和生成。

2、训练方法

  • 预训练阶段:基于 MLSEnglish10K 转录数据集进行基础的音频 – 文本对齐能力训练。为了支持多任务应用,数据集中引入了特殊的 <|transcribe|>token,用以区分语音转文本和内容补全任务,确保模型在不同场景下性能的一致性。在预训练过程中,模型通过大量的音频 – 文本对数据学习,逐渐掌握音频和文本之间的对应关系,形成初步的音频处理和语言理解能力。
  • 监督微调阶段(SFT):使用合成数据集进行指令调优。数据集同样以 MLSEnglish10K 为基础,结合专有模型对上下文进行扩展,生成丰富的 “音频 – 文本” 对。通过这种方式,模型具备了更强的音频输入语义理解和会话生成能力。例如,在处理特定领域的音频数据时,模型能够根据微调数据中的领域知识,准确理解音频中的专业术语和特定表达方式。
  • 直接偏好优化(DPO):利用 GPT – 4O API 对模型初始输出进行评估,标注不正确的输出为 “拒绝”(rejected),并生成替代答案作为 “偏好”(preferred)参考。为了保持 Gemma – 2 的文本处理性能,额外增加了偏好训练步骤,使用 Gemma – 2 的原始文本作为 “标准” 训练模型,在处理音频输入时匹配其高水平表现。通过 DPO,模型能够不断优化自己的输出,使其更加符合人类的语言习惯和实际需求。

三、功能特点

1、处理速度快

在 2024 Mac Mini M4 Pro 上,使用 Nexa SDK 并采用 FP16 GGUF 格式时,模型可实现每秒 35.23 个令牌的处理速度,而在 Q4_K_M GGUF 格式下,可处理每秒 66 个令牌。相比之下,Qwen2 – Audio – 7B 在相似硬件上只能处理每秒 6.38 个令牌,展示出显著的速度优势,能够满足实时音频处理的需求。例如,在实时语音翻译场景中,快速的处理速度可以确保翻译结果几乎与语音同步输出,大大提高了沟通效率。

2、资源效率高

模型的紧凑设计有效减少了对云资源的依赖,使其成为功率和带宽受限的可穿戴设备、汽车系统及物联网设备的理想选择,降低了设备的运行成本和对网络的依赖。在一些网络信号不稳定的偏远地区,或者在电池续航有限的可穿戴设备上,OmniAudio – 2.6B 能够凭借其低资源消耗的特点,稳定地运行并提供准确的音频处理服务。

3、高准确性和灵活性

尽管 OmniAudio – 2.6B 专注于速度和效率,但其在准确性方面也表现不俗,适用于转录、翻译、摘要等多种任务。无论是实时语音处理还是复杂的语言任务,OmniAudio – 2.6B 都能够提供精准的结果。例如,在处理学术讲座的音频转录时,模型能够准确识别专业术语和复杂的句子结构,生成高质量的文字转录稿。

四、应用场景

1、智能家居

可以集成到智能家居设备中,如智能音箱、智能家电等,实现语音控制和交互。用户可以通过语音指令控制家电的开关、调节温度、查询信息等,提供更加便捷的智能家居体验。例如,用户只需说出 “打开客厅的灯”,智能音箱中的 OmniAudio – 2.6B 模型就能准确识别指令并控制灯光设备,让家居生活更加智能和便捷。

2、车载系统

在汽车中,OmniAudio – 2.6B 可以用于语音导航、语音娱乐系统、车辆状态查询等功能。驾驶员可以通过语音与车辆进行交互,提高驾驶安全性和便利性。比如,驾驶员在行驶过程中无需手动操作,只需说出 “导航到最近的加油站”,车载系统就能快速响应并规划路线,避免了分心驾驶带来的安全隐患。

3、远程医疗

在远程医疗领域,该模型可以用于实时转录医生与患者的对话、翻译医疗文件和语音指令等,提高医疗服务的效率和质量,方便医患之间的沟通。例如,在跨国远程会诊中,OmniAudio – 2.6B 可以实时翻译不同语言的对话,让医生和患者能够无障碍交流,确保诊断和治疗的准确性。

4、可穿戴设备

如智能手表、智能耳机等可穿戴设备可以利用 OmniAudio – 2.6B 实现语音助手功能,用户可以通过语音查询天气、设置提醒、发送短信等,为用户提供更加便捷的操作方式。比如,用户在运动时双手不方便操作,只需对着智能手表说出 “设置明天早上 7 点的闹钟”,手表就能快速完成设置,提升了用户体验。

Kimi-Audio 音频基础大模型

遵循自然语言处理领域的发展轨迹,音频处理正快速从”单任务专用模型”向”多任务通用模型”演进。

Kimi-Audio被设计为一个通用的音频基础模型,能够在单一统一框架内处理多种音频处理任务。主要特性包括:

  • 通用能力:支持自动语音识别(ASR)、音频问答(AQA)、自动音频描述(AAC)、语音情感识别(SER)、声音事件/场景分类(SEC/ASC)以及端到端语音对话等多样化任务。
  • 顶尖性能:在多项音频基准测试中达到最先进水平(参见评估部分和技术报告)。
  • 大规模预训练:基于超过1300万小时的多样化音频数据(语音、音乐、环境声)和文本数据进行预训练,具备强大的音频推理和语言理解能力。
  • 创新架构:采用混合音频输入(连续声学向量+离散语义标记)和具有并行输出头的LLM核心架构,可同步生成文本和音频标记。
  • 高效推理:配备基于流匹配技术的分块流式解码器,实现低延迟音频生成
  • 开源计划:公开预训练和指令微调的代码与模型检查点,并发布完整评估工具包以促进社区研发。

Introduction

现有研究在构建通用音频基础模型方面仍存在不足:

1)仅聚焦特定任务类型(如音频理解、音频生成或语音对话);

2)忽视音频预训练,仅在下游任务微调LLM

Kimi-Audio作为开源音频基础模型,通过三大核心要素实现技术突破:

• 架构创新
模型包含音频分词器(输入)、解分器(输出)和音频LLM核心(处理)三大组件。采用离散语义音频标记作为基础表征,同时在输入端融合连续声学向量以增强感知能力,在输出端结合离散文本token以提升生成能力。通过将音频token率压缩至12.5Hz,有效弥合文本与音频序列的模态鸿沟。

• 数据工程
构建包含语音增强、说话人分离、转写过滤等流程的数据处理管线,采集超1300万小时预训练数据针对监督微调阶段,我们创新提出纯开源数据解决方案——仅依赖公开资源与处理工具即可构建高质量SFT数据集,无需商业数据采购

• 训练策略
基于预训练LLM初始化模型,设计三级渐进式预训练任务:1)单模态(纯文本/音频)知识学习;2)音频-文本跨模态映射;3)音文交错联合建模。在微调阶段开发高效训练方案提升任务泛化性。

针对音频模型评估标准不统一的问题,开发了包含语音识别、音频理解、语音对话等全维度评测工具包。

Architecture

Kimi-Audio作为一种音频基础模型,采用统一架构实现音频理解、生成与对话的全方位处理。如图2所示,系统包含三大核心组件:

  1. 音频分词器:通过12.5Hz帧率的向量量化将输入音频转换为离散语义标记,同时提取连续声学向量增强感知能力;
  2. 音频大模型:采用共享Transformer层处理多模态输入后,通过并行输出头同步生成语义标记与文本标记,提升生成能力;
  3. 音频解码器:基于流匹配技术将预测的离散语义标记重建为连贯音频波形。

该一体化架构使Kimi-Audio能在单一模型中无缝处理语音识别、理解及对话等多样化任务。

音频分词器

本模型采用离散语义标记+连续声学向量的混合分词策略,在保留离散标记语义效率的同时,通过连续表征捕捉丰富声学细节。

离散语义token:继承GLM-4-Voice方案,基于Whisper编码器架构引入向量量化层,通过单码本将语音表征压缩为12.5Hz低帧率的离散标记序列。该组件源自监督式语音分词器,由ASR模型驱动优化。

连续声学特征:从预训练Whisper模型提取50Hz帧率的连续特征,通过适配器降采样至12.5Hz后与离散标记嵌入相加,作为音频LLM的联合输入。

技术优势:离散标记提供高效语义表征、连续特征保留细粒度声学信息、12.5Hz统一帧率实现模态对齐

音频大语言模型

该模型能产生多模态输出,包括音频的离散语义标记和对应文本标记,以增强生成能力。为实现音频语义标记与文本响应的同步生成,我们改造了标准LLM架构,将其划分为共享功能模块与专用功能模块:原始Transformer底层(即最初若干层)的大部分被用作共享层,这些层通过处理输入序列学习跨模态表征,整合输入或上下文中文本与音频模态的信息。基于共享层,架构分叉为两个并行的Transformer层头部——文本头部专门自回归预测文本标记以形成文本输出,音频头部则预测离散音频语义标记,这些预测的音频标记随后传入音频解标记器模块合成最终波形输出。

为充分利用预训练文本LLM的强大语言能力,共享Transformer层和文本头部的参数直接初始化为预训练文本LLM的权重,音频头部层则随机初始化。该策略确保模型在习得高效音频处理与生成能力的同时,始终保持卓越的文本理解与生成性能。

音频解码器

音频解码器的目标是根据离散语义音频标记生成高质量、富有表现力的语音。我们采用与MoonCast相同的解标记器架构,该架构包含两部分:

  • 1)流匹配模块,将12.5Hz的语义标记转换为50Hz梅尔频谱图
  • 2)声码器,将梅尔频谱图转换为波形。

为降低语音生成延迟,我们设计了一种分块流式解标记器。初步实验表明,若简单将语义标记分块独立解码,会在块边界出现断续问题。因此,我们提出了一种带前瞻机制的分块自回归流式框架。

分块自回归流式框架
将音频分割为块(如每块1秒):{c₁, c₂, …, cᵢ, …, c_N},其中N为总块数。首先,为匹配语义标记(12.5Hz)与梅尔频谱图(50Hz)的序列长度,将语义标记上采样4倍。其次,在训练和推理时应用分块因果掩码——对于当前块cᵢ,所有先前块cⱼ(j<i)均作为提示。设cᵢ的梅尔频谱图为mᵢ,对应离散语义音频标记为aᵢᵈ。流匹配模型的前向步骤会将mᵢ与高斯噪声混合,反向步骤则在条件aᵢᵈ和历史提示cⱼ(含mⱼ与aⱼᵈ)下去噪生成纯净的mᵢ。推理时,当LLM生成一个音频块后,流匹配模型会立即将其解标记为梅尔频谱图,最终通过BigVGAN码器逐块生成波形。

前瞻机制
实验发现,因果注意力机制因无法感知块边界未来上下文,导致生成音频在边界处仍存在断续。为此,我们提出无需训练的前瞻机制:对于当前块cᵢ,从下一块cᵢ₊₁提取n个(如4个)未来语义标记拼接至cᵢ末端,形成扩展块ĉᵢ。解标记ĉᵢ生成梅尔频谱图后,仅保留原始cᵢ对应的部分。该机制仅会使首块生成延迟n个标记的时间,但显著改善边界连续性。

Data

预训练数据

我们的预训练语料库包含单模态(纯文本、纯音频)和多模态(文本-音频)数据。纯音频预训练数据覆盖了广泛的现实场景,包括有声书、播客和访谈等,约包含1300万小时的原始音频,涵盖丰富的声学事件、音乐、环境音、人声以及多语言信息。

大多数音频语料仅包含原始音频,缺乏对应的转录文本、语言类型、说话人标注和分段边界。此外,原始音频中常存在背景噪声、混响和说话人重叠等干扰因素。我们开发了高效的自动音频数据处理流程以生成高质量标注,最终形成多模态(音频-文本)数据。相较于以往主要生成无上下文信息的短音频片段的数据流程,我们的流程旨在提供具有连贯长上下文的长音频标注。该流程按步骤包含以下核心组件(如图3所示):

语音增强
为抑制背景噪声和混响,我们基于Band-Split RNN(BSRNN)架构开发了语音增强模型(图3A)。该模型可进行48kHz语音增强。实验发现语音增强会消除环境音和音乐,可能损害音频理解能力,因此在预训练阶段我们以1:1比例随机选择原始或增强后的音频。

基于聚类分割的分段
我们采用说话人聚类分割方法处理长音频,使用PyAnnote工具包¹进行说话人聚类(图3B),该工具会对音频分段并标注说话人标签。但原始输出效果欠佳,因此我们开发了后处理流程来优化:

  • 说话人聚类合并:PyAnnote可能将同一说话人标注为多个聚类,导致碎片化。我们计算每个初始聚类的代表性说话人嵌入向量,合并余弦相似度超过0.6的聚类对(图3C)。
  • 基于分块的重分配初始分割可能产生包含多说话人的片段。为提纯:1)先将所有片段切分为1.5秒分块;2)对相邻分块,若余弦相似度低于0.5则视为不同说话人,并将其重分配到相似度最高的说话人聚类(图3D)。
  • 片段合并:初始分割可能导致片段长度差异过大(短于1秒或长于100秒)。我们迭代合并标注为同一说话人的相邻片段(重分配后),合并终止条件为:累计长度超过27秒或片段间静音间隔大于2秒(图3E)。
    经此优化后的分割结果比基线输出具有更准确的说话人轮换和更一致的片段长度。

语音转写
为获取各语音片段的语言类型和文本转录,我们首先使用Whisper-large-v3模型检测语言类型。本研究仅保留英语和汉语片段进行转写:英语片段直接使用Whisper-large-v3生成带标点的文本;汉语片段采用FunASR工具包³的Paraformer-Zh模型生成带字级时间戳的文本。由于Paraformer-Zh无法输出标点,我们按以下策略添加:若相邻字符间隔大于0.5秒但小于1.0秒,插入”逗号”;若超过1.0秒,则插入”句号”。

实施细节
该数据处理流程部署在30个云实例组成的集群上,每个实例配备128个虚拟CPU(vCore)、1TB内存和8块NVIDIA L20 GPU,采用支持AMX等向量化加速指令的英特尔至强铂金8575C处理器。整个集群总计提供3,840个vCore、30TB内存和240块NVIDIA L20 GPU。经深度优化后,该流程每日可处理约20万小时原始音频数据。

监督微调(SFT)数据

在预训练阶段之后,我们通过监督微调(SFT)进一步提升 Kimi-Audio 在指令跟随和音频处理任务上的性能。SFT 数据主要分为三类:音频理解语音对话 和 音频转文本对话

音频理解

我们主要采用开源数据集进行音频理解训练,涵盖 6 种任务

  • 自动语音识别(ASR)
  • 音频问答(AQA)
  • 自动音频描述(AAC)
  • 语音情感识别(SER)
  • 声音事件分类(SEC)
  • 音频场景分类(ASC)

具体数据集及 SFT 阶段的训练轮次详见表 1。

除开源数据外,我们还使用了:

  • 55,000 小时 内部 ASR 数据
  • 5,200 小时 内部音频数据(覆盖 AAC/AQA 任务)

语音对话

为了激活 Kimi-Audio 模型在不同对话场景下生成多样化风格、高表现力语音的能力,我们构建了大规模的语音对话数据,这些数据由一系列用户查询助手响应组成的多轮对话构成。

用户查询生成

  • 我们指导 大语言模型(LLM) 编写用户查询文本,然后使用 Kimi-TTS 系统将其转换为语音。
  • 提示语音(prompt speech)从包含 超过 125,000 种音色 的大规模音色库中随机选择。

助手响应生成

  • 我们选择一位配音演员作为 Kimi-Audio 的固定音色,并以该音色合成具有合适风格和情感的助手响应。
  • 以下介绍 Kimi-Audio 配音演员的数据录制过程,以及用于合成多样化风格和表现力响应的 Kimi-TTS 和 Kimi-VC 系统。

Kimi-Audio 配音演员的数据录制

为了实现生成语音的多样化风格和高表现力,我们选择了一位配音演员作为 Kimi-Audio 的固定音色,并在专业录音棚中精心录制了该音色的数据集。

录制设计

  • 20+ 种风格和情感(如开心、悲伤、愤怒、严肃等),每种情感进一步分为 5 个强度等级,以体现不同的情感表达程度。
  • 对于每种风格和情感等级,我们录制了参考音频,以确保不同文本句子之间的情感和风格一致性。
  • 整个录制过程由专业录音导演指导,确保高质量数据。

Kimi-TTS(零样本语音合成系统)

我们开发了一个零样本文本转语音(TTS)系统,称为 Kimi-TTS,仅需 3 秒的提示语音即可生成语音,并保持提示语音的音色、情感和风格

应用场景

  1. 用户查询语音合成:使用大规模音色库(125K+ 音色)为不同用户查询生成多样化音色的语音。
  2. 助手响应语音合成:使用 Kimi-Audio 配音演员录制的风格和情感数据,合成助手的响应语音。

技术架构

  • 类似 MoonCast 的架构,采用 LLM 根据提示语音和输入文本生成语音 token。
  • 使用基于流匹配(flow-matching)的语音解 token 器生成高质量语音波形。

训练数据与优化

  • 在 100 万小时(由自动数据流水线生)的数据上训练。
  • 采用强化学习(RL)进一步提升生成语音的鲁棒性和质量

Kimi-VC(语音转换系统)

由于配音演员难以覆盖所有风格、情感和口音,我们开发了一个语音转换(VC)系统,称为 Kimi-VC,用于将不同说话人/音色的语音转换为 Kimi-Audio 固定音色,同时保留原始语音的风格、情感和口音

技术架构

  • 基于 Seed-VC  框架。
  • 在训练阶段引入音色扰动(timbre-shifting),以缓解信息泄露,并确保训练和推理阶段的对齐。

优化与数据

  • 使用 Kimi-Audio 配音演员录制的语音数据进行微调,确保高质量的语音转换。

音频到文本对话

为了让 Kimi-Audio 具备基础的对话能力,我们从文本领域收集了开源的监督微调(SFT)数据(如表 2 所示),并将用户查询转换为多种音色的语音,从而构建音频到文本对话数据(用户输入为语音,助手响应为文本)。

数据预处理

由于部分文本难以直接转换为语音,我们进行了以下优化:

  1. 过滤不适用内容:剔除包含复杂数学、代码、表格、复杂多语言内容或过长文本的数据。
  2. 口语化改写:将书面化表达调整为更自然的对话风格。
  3. 单轮转多轮优化:将复杂指令的单轮问答数据拆解为更简洁、易理解的多轮对话形式。

模型训练

预训练阶段

Kimi-Audio的预训练目标是从真实世界的音频文本领域学习知识,并在模型的潜在空间中对齐这两个模态,从而支持复杂任务如音频理解、音频到文本对话和语音对话。为此,我们设计了多阶段预训练任务:

  1. 单模态预训练(音频/文本独立学习)
  2. 音频-文本映射学习
  3. 三种跨模态交织任务(进一步 bridging 音频与文本)

数据表示形式

给定原始音频A,数据处理流水线会将其分割为N个片段{S₁, S₂, …, Sₙ},每个片段Sᵢ包含:

  • 音频信号aᵢ
  • 对应文本转录tᵢ

我们对音频片段aᵢ提取两种特征:

  • 连续声学向量 aᵢᶜ
  • 离散语义token aᵢᵈ

为适配模型架构(以离散语义token为主输入/输出,同时输入连续声学token和输出离散文本token),训练序列表示为:

{a₁ᶜ/a₁ᵈ/t₁, a₂ᶜ/a₂ᵈ/t₂, ..., aₙᶜ/aₙᵈ/tₙ}

其中:

  • 通过填充空白token确保音频与文本序列等长
  • 实际训练片段可为以下任意组合:
    • 纯音频:aᵢᵈ 或 aᵢᶜ/aᵢᵈ
    • 纯文本:tᵢ
    • 跨模态对:aᵢᵈ/tᵢ

对于连续+离散音频联合输入(aᵢᶜ/aᵢᵈ):

  1. 将离散语义token通过查表转换为嵌入向量
  2. 与连续声学向量相加得到最终音频特征aᵢ

对于音频-文本联合输入(aᵢᵈ/tᵢ):

  • 将音频语义token和文本token分别嵌入后相加
  • 通过各自独立的输出头生成对应token

具体预训练任务设计见表3,下文将详细介绍。

aᵢᵈ 表示音频片段 *i* 的离散语义标记;
aᵢᶜ 表示音频片段 *i* 的连续声学向量;
aᵢ 表示音频片段 *i* 的 aᵢᵈ 和 aᵢᶜ 的组合;
下划线 表示该部分在训练时会计算损失。

音频/文本单模态预训练
我们首先分别学习文本和音频的知识。对于文本预训练,我们直接使用MoonLight[44]中的文本数据,这些数据质量高且全面,适合训练大语言模型。我们仅对文本标记进行下一标记预测。对于音频预训练,针对每个片段Si,我们对其离散语义标记序列a_d^i进行下一标记预测。

音频-文本映射预训练
直观上,为了在统一空间中对齐音频和文本,学习两种模态之间的映射是有帮助的。因此,我们设计了自动语音识别(ASR)和文本到语音合成(TTS)预训练任务。对于ASR,我们将训练序列构建为{a1, t1, a2, t2, …, aN, tN}。对于TTS,训练序列构建为{t1, a_d^1, t2, a_d^2, …, tN, a_d^N}。我们仅在ASR中计算文本标记的损失,在TTS中计算音频语义标记的损失

音频-文本交错预训练
为了进一步弥合音频和文本模态之间的差距,我们设计了三种音频-文本交错预训练任务:

  • 音频到语义标记交错:将训练序列构建为{a1, a_d^2, a3, a_d^4, …, aN−1, a_d^N},然后仅计算语义音频标记a_d^i的损失,而不计算ai−1的损失。
  • 音频到文本交错:将训练序列构建为{a1, t2, a3, t4, …, aN−1, tN},仅计算文本标记ti的损失。
  • 音频到语义标记+文本交错:将训练序列构建为{a1, a_d^2/t2, a3, a_d^4/t4, …, aN−1, a_d^N/tN}。对于a_d^i/ti,由于语义音频标记序列总是比文本标记序列长,语义标记的预测类似于流式文本到语音任务。实验发现,前几个语义标记的预测较难,因为模型需要同时预测下一个文本标记及其语义音频标记。我们通过在语义音频标记前添加6个特殊空白标记(根据初步实验在生成质量和延迟之间权衡确定)来延迟前几个语义音频标记的预测,从而解决这一问题。

 预训练方案

我们基于预训练的 Qwen2.5 7B 模型初始化 Kimi-Audio 的音频大语言模型,并通过添加语义音频标记和特殊标记扩展其词表。我们按照 1 : 7 : 1 : 1 : 1 : 1 : 2 的任务权重(如表3所示)对上述预训练任务进行训练。Kimi-Audio 的预训练数据包含 5850亿音频标记 和 5850亿文本标记,训练 1个周期

优化器采用 AdamW,学习率按余弦衰减从 2e⁻⁵ 降至 2e⁻⁶,并使用 1% 的token进行学习率预热。

音频分词器的连续声学特征提取模块:该模块基于 Whisper large-v3初始化,能够捕捉输入音频信号中的细粒度声学特征。在预训练的初始阶段(约 20% 的token训练完成前),该 Whisper 特征提取器的参数保持冻结。随后解冻,使其参数能够与模型其余部分联合微调,从而更好地适应训练数据的细节和目标任务的需求。

监督微调

任务设计:在通过海量真实音频与文本数据完成预训练后,我们对 Kimi-Audio 进行监督微调,使其具备指令跟随能力。具体设计如下:

  1. 任务通用性:下游任务多样,因此不设置特殊任务切换操作,而是采用自然语言指令描述每个任务;
  2. 多模态指令为每条指令同时构建音频版(由 Kimi-TTS 根据文本零样本生成)和文本版,训练时随机选择一种形式;
  3. 指令增强:通过大语言模型生成 200条ASR任务指令30条其他任务指令,每个训练样本随机选取一条以增强鲁棒性。监督微调数据规模约 30万小时

微调方案:对每个数据源进行 2-4个周期 的微调。优化器采用 AdamW,学习率按余弦衰减从 1e⁻⁵ 降至 1e⁻⁶,并使用 10% 的标记进行预热。

音频解码器训练分为三个阶段:

  1. 预训练阶段:使用约 100万小时 预训练音频数据,联合训练流匹配模型和声码器,学习多样化的音色、韵律和音质特征;
  2. 分块微调:在同一数据集上采用动态分块策略(块长0.5秒至3秒)进行优化;
  3. 高质量精调:最终基于 Kimi-Audio 发言人 的高质量单人录音数据进行微调,进一步提升生成效果。

推理与部署

Kimi-Audio 设计用于处理多种音频相关任务,包括语音识别、音频理解、音频-文本对话及语音-语音对话。由于实时语音对话在基础设施和工程实现上复杂度最高,本节以其为例阐述 Kimi-Audio 的部署实践。我们首先说明客户端(如 Kimi APP 或网页浏览器)与服务器(Kimi-Audio 服务)间的实时语音对话流程,随后介绍产品化部署方案。

实时语音对话流程

图4展示了用户客户端(如 Kimi APP)与服务器(Kimi-Audio 服务)之间的语音-语音对话流程。每轮对话按以下步骤执行:

  1. 用户语音输入:用户通过客户端(如 Kimi APP 或浏览器)说话,音频数据被采集并实时流式传输至服务器;
  2. 端点检测:服务器端的语音活动检测(VAD)模块判断用户是否结束说话;
  3. 触发推理:当用户停止说话时,服务器发送提交信号并启动 Kimi-Audio 模型的推理流程;
  4. 实时流式播放:推理过程中,客户端实时接收生成的音频片段并立即播放给用户。
  5. 客户端(手机或网页浏览器)将接收到的音频片段实时播放给用户。

服务端的 Kimi-Audio 在每轮对话中的推理流程如下:

  1. 音频编码:通过音频分词器将输入音频转换为离散语义标记和连续声学向量;
  2. 输入构建:将系统提示标记、音频标记和对话历史标记拼接为 Audio LLM 的输入序列;
  3. 模型推理:Audio LLM 接收标记序列并生成输出标记;
  4. 音频合成:通过反分词器将输出标记还原为音频波形。

生产环境部署
如图5所示,在生产环境中,所有核心组件(音频分词器、音频大语言模型和音频反分词器)均属于计算密集型模块,需要可扩展且高效的基础架构支撑。为此我们设计了如下生产级部署架构:

Kimi-Audio实时通信服务
该服务作为客户端交互接口,负责接收用户音频数据并转发至推理调度器,同时将生成的音频分块返回客户端。我们采用WebRTC协议确保稳定低延时的通信连接。

推理调度器
推理调度器通过在后端存储中以token形式维护对话历史来管理会话流程。每轮交互执行以下步骤:
• 调用分词器服务将用户音频转换为token
• 将新token与对话历史拼接构建模型输入
• 将输入发送至大语言模型服务生成响应token
• 调用反分词器服务将响应token转换为音频输出

此外,该系统会将所有输出token作为持续更新的对话历史存储,确保多轮对话的连贯性。

实验

首先开发了面向音频理解、生成及对话任务的开源评估工具包。【https://github.com/MoonshotAI/Kimi-Audio-Evalkit.】该工具目前集成支持Kimi-Audio及系列前沿音频大模型,并可扩展评估其他音频基础模型,主要特性包括:

• 标准化评估框架
基于Qwen-2-Audio实现标准化词错误率计算,并集成GPT-4o-mini作为智能评判器,克服指标不一致和简单字符串匹配的局限,实现公平对比。

• 统一比较平台
提供支持多模型多版本的统一平台,简化横向对比。通过定义和共享标准化推理参数与提示策略(”配方”),直接解决评估设置不一致问题,显著提升不同研究成果间的可复现性。

挑战与未来趋势

尽管Kimi-Audio在构建通用音频基础模型方面取得显著进展,但要实现更强大、更智能的音频处理系统仍存在诸多挑战。我们梳理现存问题并指出以下极具潜力的发展方向:

从语音转写到音频描述

当前音频基础模型的预训练范式通常依赖音频-文本对齐训练,其中文本数据多通过ASR(自动语音识别)从语音转写获得。但转写文本仅聚焦口语内容(”说了什么”),忽略了音频中的副语言信息(如情感、风格、音色、语调)、声学场景和非语言声音等重要特征。未来需引入描述性文本(如音频字幕)来构建更丰富的上下文表征。通过同时融合转写文本与描述文本,模型不仅能更好地理解与生成口语内容,还能处理复杂的声学环境,为构建更细腻的多模态音频处理系统和更通用的音频智能奠定基础。

更优的音频表征

现有音频表征主要采用语义token或声学token:

  • 语义token:通常通过ASR辅助损失函数获取,侧重转写导向的信息,但难以捕捉对理解与生成至关重要的声学细节
  • 声学token:通过音频重构损失函数学习,侧重描述导向的声学特征,但缺乏连接文本智能所需的抽象语义信息

关键研究方向是开发能同时整合转写导向语义与描述导向声学特征的新型表征,在保留高层抽象信息的同时,涵盖说话人身份、情感、环境音等细微特征,这对实现更复杂的音频理解与生成至关重要。

摒弃ASR/TTS的建模依赖

现有音频基础模型在预训练和微调阶段严重依赖ASR/TTS生成训练数据,其质量受限于:

  • ASR的文本识别准确率
  • TTS合成语音的表现力/多样性/质量

这种模式下,音频模型本质上只是现有ASR/TTS系统的精馏版本性能天花板受制于ASR/TTS系统的上限,无法实现真正的自主音频智能。未来应探索不依赖ASR/TTS伪音频数据、直接基于原生音频数据的训练范式,这将大幅提升模型性能上限。

Dolphin -支持东方40语种+中国22方言的新SOTA语音大模型

在当今数字化时代,语音识别技术已成为人机交互的关键桥梁,广泛应用于智能客服、语音助手、会议转录等众多领域。然而,对于东方语言的识别如越南语、缅甸语等,现有模型往往表现不佳,难以满足用户的需求。为解决这一难题,海天瑞声携手清华大学电子工程系语音与音频技术实验室,共同推出了Dolphin —— 一款专为东方语言设计的语音大模型

Dolphin 采用的多任务格式,其主要沿用了 OpenAI Whisper的
格式。Dolphin 专注于自动语音识别 (ASR),不支持翻译任务。此外,Dolphin 引入了特定区域的标记,从而支持方言。

Dolphin 是由 Dataocean AI 与清华大学合作开发的多语言、多任务 ASR 模型。它支持东亚、南亚、东南亚和中东地区的 40 种东方语言,同时还支持 22 种中国方言。该模型基于超过 21 万小时的数据进行训练,其中包括 DataoceanAI 的专有数据集和开源数据集。该模型可以执行语音识别、语音活动检测 (VAD)、语音分割和语言识别 (LID)

二、创新技术架构 

  • 模型结构    

Dolphin网络结构基于CTC-Attention架构,E-Branchformer编码器和Transformer解码器,并引入了4倍下采样层,以实现高效的大规模多语言语音识别模型的训练。CTC-Attention架构结合了CTC的序列建模能力和注意力机制的上下文捕捉能力,能够有效提升模型的识别准确性和效率。E-Branchformer编码器采用并行分支结构,能够更有效地捕捉输入语音信号的局部和全局依赖关系,为模型提供了更丰富的特征表示。解码器部分则采用了在序列到序列任务中表现出色的Transformer,能够生成高质量的文本输出。为了进一步提高训练效率和性能,我们在模型中引入了4倍下采样层。这一层可以减少输入特征的序列长度,从而加速计算过程,同时保留关键的语音信息,确保模型的识别效果不受影响。

  • 多任务格式

Dolphin 借鉴了 Whisper 和 OWSM 的创新设计方法,但专注于ASR 进行了若干关键修改。Dolphin 不支持翻译任务,并且去掉了previous text及其相关标记的使用,这简化了输入格式并减少了潜在的复杂性Dolphin引入了两级语种标签系统,以便更好地处理语言和地区的多样性。第一个标签指定语种(例如: <zh> 、 <ja>),第二个标签指定地区(例如 <CN> 、 <JP>)。 比如:<ru><RU> 表示俄罗斯的俄语,而 <ru><BY> 表示白俄罗斯的俄语。这种分层方法使模型能够捕捉同一种语言内不同方言和口音之间的差异,以及同一地区内不同语言之间的相似性,从而提高了模型区分密切相关的方言的能力,并通过在语言和地区之间建立联系增强了其泛化能力。

三、强大的数据基础 

Dolphin的训练数据集整合了海天瑞声【Dataocean AI】的专有数据和多个开源数据集,总时长超过20万小时,涵盖40个东方语种。其中,海天瑞声数据集包含137,712小时的音频,覆盖38个东方语种。这些高质量、多样化的数据为模型的训练提供了坚实的基础,使其能够更好地适应不同语言和方言的语音特征。

清理后数据集中 40 种东方语言的数据时长分布(以对数刻度表示)。其中 36 种语言的数据时长超过 100 小时,16 种语言的数据时长超过 1000 小时。

数据处理:对于像 YODAS 这样包含人工注释和 ASR 生成的转录本的数据集,我们只使用人工注释的部分。因此,我们的大部分训练数据都是手动转录的,以确保更高的转录质量。这种数据质量,尤其是转录本的质量,是使模型即使在模型规模较小的情况下也能实现显著优于 Whisper 识别性能的关键因素。对于时间戳,采用与 Whisper 相同的句子级时间戳方法,其中时间戳标记标记每个句子的起始和结束。对于长音频录音(通常长达几分钟),会在数据预处理过程中将其分割成较小的片段,然后将它们合并为长音频序列。

训练优化:

在训练数据的初始版本中,我们直接使用了清理后的数据集。然而,一个主要问题是短音频样本的比例过高。大多数音频片段的时长约为 5 秒,导致跨多种语言的删除错误率过高。这个问题与大多数训练数据由短音频样本组成这一事实相符。

为了解决这个问题,尝试了一种替代方法,将清理后的音频数据连接成 25-30 秒的长片段。这显著降低了较高的删除错误率。虽然这种方法导致插入错误率略有增加,但整体识别性能有所提升,平均字词错误率 (WER) 降低了 9.01%。

四、卓越性能表现 

通过精心设计的架构和大规模的训练数据,Dolphin在多种语言上的词错误率(WER)显著低于现有开源模型。

例如,在海天瑞声数据集上,Dolphin 模型的平均WER为31.5%,small模型为24.5%,medium模型为22.2%;在CommonVoice数据集上,Dolphin 模型的平均WER为37.2%,small模型为27.4%,medium模型为25.0%。即使与Whisper large-v3模型相比,Dolphin在模型规模更小的情况下,性能也更为出色。以中文为例,Dolphin中模型的WER仅为9.2%,而Whisper large-v3模型为27.9%。 在KeSpeech (包含一个普通话子集和八个中国方言子集)测试集上,Dolphin模型表现出了卓越的效果.

五、技术挑战

内存占用问题

图 3: 数据加载策略优化。假设一个节点有 4 个 GPU,每个 GPU 分配一个对应的进程,称为 rank。优化前,每个 rank 加载数据集的完整副本,记为 {D0,D1,D2,D3}。优化后,每个 rank 仅分配其计算所需的数据集子集。

我们的训练集包含 1.6 亿条话语,在数据处理阶段遇到了内存不足 (OOM) 问题。我们对数据处理的 sampler、dataset、dataloader 模块进行了深入分析,发现大量的 utterances 导致了内存溢出。PyTorch 支持两种类型的数据集:map-style 和 iterable-style。ESPnet 使用的是 map-style。map-style 数据集将 utterance 的元数据(utterance id 与文本、音频的映射)加载到内存中,内存占用随着训练数据 utterances 的数量线性增长。为了提高数据加载速度,dataloader 内部会有多个 worker 进行数据预取,这进一步增加了物理机的内存占用,最终导致 OOM。

受 Zero-DP的启发,我们提出了图 3 中的数据分片策略。我们不再加载整个数据集副本,而是优化每个 Rank,使其仅加载数据集中必要的子集。这种方法显著减少了每个 Rank 的内存占用,从而降低了物理机上的整体内存消耗。此外,随着数据并行度的提高,单个节点的内存占用呈线性下降。

训练效率:

将短音频合并成长音频可以显著提高 GPU 的计算密度和利用率,从而显著提高训练效率。在我们的数据集中,音频时长呈现出明显的左偏分布,短音频(1-10 秒)占比较高,长音频(11-30 秒)占比较低。为了使音频时长分布更加均衡,我们将短音频合并,并将它们均匀地重新分配到 0-30 秒范围内以 5 秒为间隔的桶中。

在处理 21 万小时的大规模数据集时,使用 ffmpeg 将多个短音频物理合并成长音频会非常耗时。为此,我们采用了更高效的逻辑合并策略。具体来说,在数据准备阶段,我们使用字典来表示音频合并前后的映射关系,并在训练过程中动态地合并音频。

通过优化合并策略,小模型单次 epoch 训练时间从 64 小时大幅缩短至 28.6 小时,训练速度提升 123.78%,大大加速了模型迭代进程。

六、开源与社区贡献 

为促进语音识别技术的进一步发展,Dolphin的训练模型和推理源代码已公开发布。这一举措不仅为研究人员提供了宝贵的研究基础,也为开源社区注入了新的活力,鼓励更多创新与合作。通过共享技术成果,我们希望能够吸引更多的开发者和研究机构参与到东方语言语音识别的研究中来,共同推动技术的进步。 

 Dolphin,一个大规模多语言多任务自动语音识别 (ASR) 模型。Dolphin 构建于 Whisper 风格的架构之上,并基于 OWSM,集成了专有和公开可用的数据集。实验结果表明,Dolphin 在各种语言和模型规模上始终优于现有的 SOTA 模型,有效弥合了东西方语言之间的性能差距。值得一提的是,Dolphin 基础模型的性能甚至优于 Whisper large-v3 版本。通过开源 Dolphin 基础模型、小型模型以及推理代码,我们旨在为多语言语音处理的进一步发展做出贡献。

支持的语言列表:

Language code

Language CodeEnglish NameChinese Name
zhMandarin Chinese中文
jaJapanese日语
thThai泰语
ruRussian俄语
koKorean韩语
idIndonesian印度尼西亚语
viVietnamese越南语
ctYue Chinese粤语
hiHindi印地语
urUrdu乌尔都语
msMalay马来语
uzUzbek乌兹别克语
arArabic阿拉伯语
faPersian波斯语
bnBengali孟加拉语
taTamil泰米尔语
teTelugu泰卢固语
ugUighur维吾尔语
guGujarati古吉拉特语
myBurmese缅甸语
tlTagalog塔加洛语
kkKazakh哈萨克语
orOriya / Odia奥里亚语
neNepali尼泊尔语
mnMongolian蒙古语
kmKhmer高棉语
jvJavanese爪哇语
loLao老挝语
siSinhala僧伽罗语
filFilipino菲律宾语
psPushto普什图语
paPanjabi旁遮普语
kabKabyle卡拜尔语
baBashkir巴什基尔语
ksKashmiri克什米尔语
tgTajik塔吉克语
suSundanese巽他语
mrMarathi马拉地语
kyKirghiz吉尔吉斯语
azAzerbaijani阿塞拜疆语

Language Region Code

Language Region CodeEnglish NameChinese Name
zh-CNChinese (Mandarin)中文(普通话)
zh-TWChinese (Taiwan)中文(台湾)
zh-WUChinese (Wuyu)中文(吴语)
zh-SICHUANChinese (Sichuan)中文(四川话)
zh-SHANXIChinese (Shanxi)中文(山西话)
zh-ANHUIChinese (Anhui)中文(安徽话)
zh-TIANJINChinese (Tianjin)中文(天津话)
zh-NINGXIAChinese (Ningxia)中文(宁夏话)
zh-SHAANXIChinese (Shaanxi)中文(陕西话)
zh-HEBEIChinese (Hebei)中文(河北话)
zh-SHANDONGChinese (Shandong)中文(山东话)
zh-GUANGDONGChinese (Guangdong)中文(广东话)
zh-SHANGHAIChinese (Shanghai)中文(上海话)
zh-HUBEIChinese (Hubei)中文(湖北话)
zh-LIAONINGChinese (Liaoning)中文(辽宁话)
zh-GANSUChinese (Gansu)中文(甘肃话)
zh-FUJIANChinese (Fujian)中文(福建话)
zh-HUNANChinese (Hunan)中文(湖南话)
zh-HENANChinese (Henan)中文(河南话)
zh-YUNNANChinese (Yunnan)中文(云南话)
zh-MINNANChinese (Minnan)中文(闽南语)
zh-WENZHOUChinese (Wenzhou)中文(温州话)
ja-JPJapanese日语
th-THThai泰语
ru-RURussian俄语
ko-KRKorean韩语
id-IDIndonesian印度尼西亚语
vi-VNVietnamese越南语
ct-NULLYue (Unknown)粤语(未知)
ct-HKYue (Hongkong)粤语(香港)
ct-GZYue (Guangdong)粤语(广东)
hi-INHindi印地语
ur-INUrdu乌尔都语(印度)
ur-PKUrdu (Islamic Republic of Pakistan)乌尔都语
ms-MYMalay马来语
uz-UZUzbek乌兹别克语
ar-MAArabic (Morocco)阿拉伯语(摩洛哥)
ar-GLAArabic阿拉伯语
ar-SAArabic (Saudi Arabia)阿拉伯语(沙特)
ar-EGArabic (Egypt)阿拉伯语(埃及)
ar-KWArabic (Kuwait)阿拉伯语(科威特)
ar-LYArabic (Libya)阿拉伯语(利比亚)
ar-JOArabic (Jordan)阿拉伯语(约旦)
ar-AEArabic (U.A.E.)阿拉伯语(阿联酋)
ar-LVTArabic (Levant)阿拉伯语(黎凡特)
fa-IRPersian波斯语
bn-BDBengali孟加拉语
ta-SGTamil (Singaporean)泰米尔语(新加坡)
ta-LKTamil (Sri Lankan)泰米尔语(斯里兰卡)
ta-INTamil (India)泰米尔语(印度)
ta-MYTamil (Malaysia)泰米尔语(马来西亚)
te-INTelugu泰卢固语
ug-NULLUighur维吾尔语
ug-CNUighur维吾尔语
gu-INGujarati古吉拉特语
my-MMBurmese缅甸语
tl-PHTagalog塔加洛语
kk-KZKazakh哈萨克语
or-INOriya / Odia奥里亚语
ne-NPNepali尼泊尔语
mn-MNMongolian蒙古语
km-KHKhmer高棉语
jv-IDJavanese爪哇语
lo-LALao老挝语
si-LKSinhala僧伽罗语
fil-PHFilipino菲律宾语
ps-AFPushto普什图语
pa-INPanjabi旁遮普语
kab-NULLKabyle卡拜尔语
ba-NULLBashkir巴什基尔语
ks-INKashmiri克什米尔语
tg-TJTajik塔吉克语
su-IDSundanese巽他语
mr-INMarathi马拉地语
ky-KGKirghiz吉尔吉斯语
az-AZAzerbaijani阿塞拜疆语

GigaSpeech 2:三万小时东南亚多语种语音识别开源数据集发布

下载:https://huggingface.co/datasets/speechcolab/gigaspeech2

语言:泰语、印尼语、越南语
GigaSpeech 2 raw:30,000 小时的泰语、印尼语和越南语自动转录语音。
GigaSpeech 2 精炼:泰语 10,000 小时,印尼语和越南语各 6,000 小时。
GigaSpeech 2 DEV 和 TEST:每种语言的 DEV 时间为 10 小时,TEST 时间为 10 小时,由专业人工注释员转录,富有挑战性和现实性。

“Giga”一词源于“gigantic”[“巨大”],互联网上具有海量音频资源,但语音质量良莠不齐,高质量音频文本对数据十分稀缺且标注成本高昂,特别是在小语种领域。GigaSpeech 是一个非常成功的英文开源数据集,以 YouTube 和 Podcast 为音频来源,提供了上万小时的高质量文本标注语音数据集,获得了广泛关注和应用。针对多语言领域仍存在的语音识别性能较差、可用高质量标注数据缺乏等问题,我们提出了利用 in-the-wild 无标注音频,构建高质量大规模语音识别数据集的新范式,制作出面向真实场景的大规模、多领域、多语言的语音识别数据集 GigaSpeech 2基于Gigaspeech 2 数据集训练的语音识别模型在三个东南亚语种(泰语、印尼语、越南语)上达到了媲美商业语音识别服务的性能。我们怀揣着技术应当普惠大众的理念,致力于开源高质量语音识别数据集和模型,促进多语言文化沟通。

GigaSpeech 2 是一个持续扩展的、多领域多语言的大规模语音识别语料库,旨在促进低资源语言语音识别领域的发展和研究。GigaSpeech 2 raw拥有 30000 小时的自动转录音频,涵盖泰语、印尼语、越南语经过多轮精炼和迭代,GigaSpeech 2 refined拥有 10000 小时泰语、6000 小时印尼语、6000 小时越南语。我们也开源了基于 GigaSpeech 2 数据训练的多语种语音识别模型,模型性能达到了商业语音识别服务水平

数据集构建:

GigaSpeech 2 的制作流程也已同步开源,这是一个自动化构建大规模语音识别数据集的流程,面向互联网上的海量无标注音频,自动化地爬取数据、转录、对齐、精炼。这一流程包含利用 Whisper 进行初步转录,使用 TorchAudio 进行强制对齐,经过多维度过滤制作出 GigaSpeech 2 raw。随后,采用改进的 Noisy Student Training (NST) 方法,通过反复迭代精炼伪标签,持续提高标注质量,最终制作出GigaSpeech 2 refined。

GigaSpeech 2 在主题上涵盖了多样化话题领域,包括农业、艺术、商业、气候、文化、经济、教育、娱乐、健康、历史、文学、音乐、政治、两性关系、购物、社会、体育、科技和旅行。同时,在内容形式上涵盖了多种类型,包含声书、解说、讲座、独白、电影电视剧、新闻、访谈、视频博客。

GigaSpeech 2 raw: Automated Crawling and Transcription

音频收集

由于低资源语言中人工标注数据的稀缺性,我们的数据集采集策略仅关注音频内容,而不考虑是否存在或文本配对的质量。这种策略使我们能够收集更广泛范围的音频数据。考虑到低资源语言的资源稀缺性和分布不均,我们有策略地重点爬取 YouTube 频道中的视频,基于两个关键假设:

  1. 优先选择热门频道可以确保一致的领域特征和音频质量
  2. 不同频道之间没有说话人重叠,从而简化后续的数据划分。

数据收集流程首先由人工定义感兴趣的内容类别,所选主题包括:农业、艺术、商业、气候、文化、经济、教育、娱乐、健康、历史、文学、音乐、政治、人际关系、购物、社会、体育、科技和旅游。除了多样的主题外,我们还考虑了不同的内容格式,包括:有声书、评论、讲座、独白、电影、新闻、访谈和 vlog。这种广泛的选择确保了数据集在多个领域的全面性,可支持研究与分析。

在准备好 YouTube 频道列表后,我们使用 yt-dlp 工具下载所有音频文件,格式为 WebM。随后,这些文件被转换为单声道的 WAV 格式,并重采样为 16 kHz 的采样率。


训练 / 开发 / 测试集的划分:为确保各数据集之间没有说话人重叠,我们通过人工方式验证不同频道间无重叠说话人,并将来自不同 YouTube 频道的数据分配至不同的子集。数据集被划分为三个独立的子集:训练集(TRAIN)、开发集(DEV)和测试集(TEST)。

其中,DEV 和 TEST 集各包含 10 小时内容,均由专业人员手动转录,其余部分则分配至训练集。表1展示了这三种语言的数据量分布。更详细的分析见附录B。


使用 Whisper 进行转录:我们使用 OpenAI 的 Whisper large-v3 模型自动转录音频文件。对于每段音频,从中间选择一个 30 秒的片段进行语言识别,仅对与目标语言匹配的音频进行转录。


使用 TorchAudio 进行强制对齐:虽然 Whisper 可生成时间戳,但经过检验发现其精度不足。因此,我们采用了 TorchAudio 中的强制对齐模型【参考多语言数据的强制对齐 CTC 强制对齐 API 教程】,它能为嘈杂的转录文本提供可靠的对齐,支持在 GPU 上高效处理,并能更好地处理较长的音频序列。


文本标准化:对转录文本进行标准化处理,包括:

  • 应用 Unicode NFKC(兼容性分解与合成)规范;
  • 将所有字符转换为大写;
  • 去除标点符号;
  • 将阿拉伯数字映射为对应语言中的文本数字。

多维度过滤:为了排除质量较差的样本,我们在文本和音频两个模态上设计了一系列启发式的过滤规则:

  • 字符集过滤(Charset Filtering):仅保留那些只包含目标语言字符集内字符的片段。
  • 语言置信度过滤(Language Confidence Filtering):使用 fastText 提供的语言识别(LID)模型,根据语言识别的置信度分数进行过滤,仅保留那些置信度高于预设阈值的片段。该方法能有效排除无意义或重复的内容。需要注意的是,基于音频的语言识别在文本转录之前已经完成。
  • 音频时长过滤(Audio Duration Filtering):根据音频时长进行过滤,仅保留长度在预设的最短和最长时间阈值之间的片段。
  • 样本平衡(Balancing):我们对因频道特定内容造成的转录文本重复进行精细控制,同时尽可能保留自然的语言使用模式。

GigaSpeech 2 精炼:迭代标签优化(Iterative Label Refinement)

由于 Whisper 转录的不准确性以及强制对齐边界不精确,部分样本的质量仍然较低。为了解决这个问题,我们设计了一种改进的 神经自监督训练(NST) 方法。如图 1 右下角所示,该方法以一部分质量不佳的伪标签样本为起点训练一个教师模型,并通过迭代方式不断扩展训练集、生成新的伪标签,并对其进行过滤。随后训练一个与教师模型等大或更大的学生模型,使用优化后的伪标签进行训练,并将其作为新的教师模型。

在每次 NST 步骤中,我们引入了 SpecAugmentBypass特征遮盖(feature mask)来注入噪声。其中:

  • Bypass 是一种随机深度机制,它通过学习通道级的标量权重,在模块输入与输出之间进行加权组合;
  • Feature mask 在前馈层和卷积层的隐藏维度上执行 Dropout,但在时间维度上保持共享。

这种有意识地加入噪声的方式,可以使学生模型学习在有噪声扰动下仍能保持与教师模型一致的行为,而教师模型在生成伪标签时则不会受到这些扰动 。

通过这样的迭代过程,数据质量将逐步得到提升。详细的算法步骤见附录 A 中的算法 1。

数据集组成:

GigaSpeech 2 提供了两个版本的数据集,分别为 raw 和 refined 版本,适用于有监督训练任务。训练集时长详情如下表所示:

GigaSpeech 2 开发集和测试集由海天瑞声的专业人员对语音数据人工标注得到,时长详情如下表所示:

主题和内容分布详情如下图所示,外圈表示主题领域,内圈表示内容形式:

实验结果:

我们将使用 GigaSpeech 2 数据集训练的语音识别模型与业界领先的 OpenAI Whisper (large-v3、large-v2、base)、Meta MMS L1107、Azure Speech CLI 1.37.0 和 Google USM Chirp v2 模型在泰语、印尼语和越南语上进行比较。性能评估基于 GigaSpeech 2、Common Voice 17.0 以及 FLEURS 三个测试集,通过字符错误率(CER)或单词错误率(WER)指标进行评估。结果表明:

1)在泰语上,我们的模型展现出卓越的性能,全面超越了所有竞争对手,包括微软和谷歌商用接口。值得一提的是,我们的模型在达到这一显著成果的同时,参数量仅为 Whisper large-v3 的十分之一。

2)在印尼语和越南语上,我们的系统与现有的基线模型相比表现出具有竞争力的性能。

Baichuan-Auido端到端训练语音交互大模型

Baichuan-Auido 是Baichuan最新的端到端训练的语音交互大模型,无缝集成了音频理解和生成功能,支持高质量可控的中英双语实时对话。

  • Baichuan-Audio-Base: 为促进语音大模型发展,我们开源了使用高质量海量数据训练的端到端语音基座模型。该模型未经SFT指令微调,可塑性强。
  • Baichuan-Audio: 接受文本、音频作为输入,并生成高质量文本和语音输出,能够在保持预训练 LLM 智商能力下实现无缝的高质量语音交互,和用户进行实时语音对话

Introduction

Baichuan-Audio,这是一款为实时语音交互设计的端到端音频大语言模型。与 MoshiGLM-4-Voice [输出 文本+speech token,speech token 接入cosyvoice解码器合成音频 ] 类似,Baichuan-Audio 扩展了预训练的大语言模型(LLM),以支持端到端的音频输入和输出。该模型通过集成 Baichuan-Audio-Tokenizer 和流匹配解码器来实现上述功能,前者将音频信号离散化为音频标记,后者则将音频标记解码为语音波形。

Baichuan-Audio-Tokenizer 的运行帧率为 12.5 Hz,并采用多码本离散化技术,以保留语义和声学信息,从而支持 LLM 中语音模态的有效建模。Baichuan-Audio 还引入了独立的音频头(audio head),以提升模型处理和捕捉音频特征的能力。

我们在包含约 1000 亿个标记的音频-文本数据上进行了大规模预训练。基于包含 88.7 万小时的大型音频语料库,我们采用了交错数据处理方法,以在 LLM 框架内实现高效的知识迁移。

贡献:

  • 统一且卓越的语音能力:我们设计了一个 8 层 RVQ 音频分词器Baichuan-Audio-Tokenizer),在 12.5 Hz 帧率下实现了对语义和声学信息的最佳平衡,支持高质量、可控的中英文双语实时对话。
  • 端到端语音交互Baichuan-Audio 能够处理文本和音频输入,并生成高质量的文本和语音输出,支持无缝的高质量语音交互,同时保持智能响应能力。
  • 开源支持:我们已开源训练数据和基础模型,为语音交互领域的研究与创新提供了宝贵的资源与工具。

模型

该模型结构围绕三大核心组件构建:Baichuan-Audio分词器音频大语言模型(audio LLM),以及音频解码器

处理流程从音频分词器开始,它通过捕捉语义与声学信息,将原始音频输入转化为离散的token。这一步是通过 Whisper编码器残差矢量量化(RVQ)技术相结合实现的。

随后,音频LLM以交替方式生成对齐的文本与音频token,并借助一个特殊的token实现文本与音频模态间的无缝切换。接下来,这些音频token将由一个独立的音频head进一步处理。

最后,模型通过一个基于Flow-Matching的方法的音频解码器,从这些token中重建出高质量的Mel谱图,再通过 声码器(vocoder)将其转换为音频波形。

Audio Tokenization

当前音频分词器面临的主要挑战,在于如何在捕捉语音信号中的语义信息与声学信息之间取得最佳平衡。相较于像 HuBERT 这样的自监督学习方法,Baichuan-OmniQwen-Audio 这类模型在捕捉语义特征方面提供了更直接的路径。【ASR任务

与此同时,像 EncodecSpeechTokenizer这样的音频分词器则在完整重建音频特征方面表现尤为出色。【音频重建任务

为了结合这两类方法的优点,提出了 Baichuan-Audio-Tokenizer:一个基于 残差矢量量化(RVQ)多目标训练【重建音频任务以及ASR任务】 的音频分词器,如图2所示。Baichuan-Audio-Tokenizer 保留了来自 Baichuan-Omni音频编码器语言模型组件,并在编码器之后新增了一个 音频解码器结构,用于重建输入的 Mel 频谱图。该音频分词器采用多目标优化方法进行训练,从而能够有效捕捉输入语音中的语义信息与声学信息。

Baichuan-Audio-Tokenizer 采用了每秒 12.5 个 token 的帧率设计。高层次的音频特征首先通过 Whisper Large 编码器Mel 频谱图(Mel spectrogram) 中提取,随后通过一个 残差卷积网络 进行 4× 下采样,以获得低帧率的音频特征。

由于 Whisper 编码器输出的音频特征是高维的,在量化过程中需尽可能减少信息损失,因此我们使用了 8 层残差矢量量化(RVQ)。我们设计了逐层递减的码本大小,依次为:{8K, 4K, 2K, 1K, 1K, 1K, 1K, 1K}

音频解码器采用与 Whisper 编码器完全对称的结构,通过一个 反卷积模块(deconvolution module) 对输入进行 4× 上采样。之后,序列经过一系列 Transformer 层,并进一步进行 2× 上采样,最终得到每秒 100 个 token 的粗略 Mel 频谱表示。设计了一个 精细化网络,以提升 Mel 频谱重建的精度,最终获得高质量的精细 Mel 频谱特征。

在音频重建损失函数的设计中,我们,采用 L2 损失与 L1 损失的组合 作为重建损失。其形式定义如下:

为提升音频重建的质量,我们引入了一种 多尺度 Mel 频谱损失(multiscale Mel loss) 方法,使用了两种不同的 hop length(帧移)window size(窗长)。该方法有效缓解了在从解码器输出转换为 Mel 频谱过程中,由于降维和下采样插值所导致的信息损失。通过在多个尺度上进行优化,该方法能够保留更多细粒度的音频特征,从而提升重建的保真度和训练的稳定性。

对于预训练的语言模型(LLM),其目标是在音频理解任务中最大化文本输出的 softmax 概率。为了确保语义对齐,我们在训练过程中保持预训练语言模型参数不更新(冻结),仅最大化其在音频理解任务中预测文本的 softmax 概率。这种做法有助于保持音频分词器与文本LLM之间的语义对齐关系

在选择 LLM 的规模时,我们观察到,在音频理解模型的训练过程中,不同规模的 LLM 对于 ASR(自动语音识别)指标的影响很小。因此,我们最终选用了一个拥有 15亿参数(1.5B) 的预训练 LLM 进行持续训练。这个规模的模型与音频解码器在训练过程中表现出良好的匹配性,两者的梯度范数差距较小,有助于提升整体训练的稳定性。

在量化模块的训练中,我们采用了 指数移动平均(EMA) 策略来更新码本,并使用 直通估计器(STE, Straight-Through Estimator) 来反向传播梯度至编码器。此外,我们还使用了 向量量化承诺损失(VQ commitment loss),以确保编码器的输出能够紧密对齐至码本中的条目。

VQ 承诺损失定义如下:

总损失是多尺度重建损失、文本音频对齐损失(对于LLM)和 VQ 承诺损失的加权组合:

训练数据。 除了自动语音识别 (ASR)、音频查询回答 (AQA) 和语音到文本翻译 (S2TT) 等传统任务外,我们还将一定比例的音频文本交错数据纳入训练过程。此策略旨在增强 VQ 模块对复杂上下文场景进行建模的能力。具体来说,训练数据集包括 135k 小时的 ASR 数据、11k 小时的 AQA 数据、9k 小时的 S2TT 翻译数据和 52k 小时的音频文本交错数据。

Evaluation of Baichuan-Audio-Tokenizer. 我们使用相同的数据和基础模型训练了音频理解模型的非 VQ 版本作为基线。对于 VQ 和非 VQ 模型,LLM 的参数在训练期间保持冻结,以确保公平比较并隔离 VQ 机制对整体性能的影响。从表 1 中,我们可以看到 8 层 vq 更接近基线,并且语义内容损失最少。如表 2 所示,8 层 VQ 模型和基线在多个数据集上的 ASR 结果表明,训练后的 8 层 VQ 模型实现了具有竞争力的性能。

基于流匹配的音频解码器

为了提升合成音频的质量与保真度,我们对音频解码模块进行了增强,引入了 Flow-Matching 模型,在 24 kHz 采样率的音频数据上训练,用于生成目标 Mel 频谱图。该 Flow-Matching 解码器 包括两个主要部分:Pre-Net条件解码器(Conditional Decoder),如图 3 所示。

Pre-Net 负责将中间表示映射为供声码器(vocoder)使用的先验分布,结构上由一个 多层感知机(MLP) 和一个 12 层 Transformer 组成:MLP 将输入的 1280维、50 Hz 的音频特征压缩投影至 512维;接着,Transformer 对其进行精细建模;最后通过一个线性层转换为 80维的 Mel 频谱图

条件解码器(Flow-Matching Conditional Decoder)。该部分采用基于 U-Net 的结构,并结合 OT-CFM(Optimal Transport Conditional Flow Matching) 方法进行训练,灵感来源于 Matcha-TTSCosyVoice

U-Net 结构包括:一个下采样模块、一个上采样模块,以及 12 个中间模块,每个模块由一个 ResNet1D 层 和一个 Transformer 层(256维)组成。最终,再通过一个线性层将特征投影为 80维 Mel 频谱图

需要注意的是,由于模型已通过重建损失编码了声学信息(如说话人音色),因此 不需要额外的说话人嵌入(speaker embeddings)。生成的 Mel 频谱图将通过 HiFi-GAN 声码器转换为音频波形。

训练细节: 流匹配模型在约 27 万小时的音频上进行了训练,包括普通话、英语、各种方言和多语言数据。使用集成 ASR 和 MOS 过滤来改善数据质量。在训练期间,AudioEncoder、VQ 层和 AudioDecoder 是固定的,而流匹配 Pre-Net 和解码器则在 Pre-Net 中添加了先验损失进行训练。

重建性能评估

Audio LLM

Baichuan-Audio 通过整合新推出的 Baichuan-Audio-Tokenizer(包括音频嵌入层和独立的音频头)扩展了预训练的 LLM。具体来说,来自 Baichuan-Audio-Tokenizer 的音频标记首先通过音频嵌入层转换为音频嵌入。音频 LLM 交替生成对齐的文本标记和音频标记,并通过特殊标记实现文本和音频之间的模态切换。生成的音频标记由独立的音频头处理,该头由 3 层深度转换器和 8 个分类头组成。最后,音频嵌入通过音频编码器(例如基于流匹配的音频编码器和声码器)以重建音频波形。

音频嵌入。 首先,将 8 个离散音频标记通过相应数量的嵌入层相加以获得音频嵌入。由于包含一个额外的特殊标记来表示音频标记生成的结束,因此每个嵌入层的输入维度都比相应码本的大小大一。

音频头。生成的音频标记使用独立的音频头进行处理,该音频头由 3 层深度转换器和 8 个分类头组成。深度转换器的深度为 8,可预测 8 个码本的音频嵌入。最后,分类头用于获取与音频标记相对应的每个码本的逻辑值。

与纯文本大模型相比,语音语言模型(speech language models) 往往在生成语义连贯的输出方面存在困难。研究 [36] 指出,这一问题主要源于语音中引入了 时长信息(duration)副语言信息(paralinguistic information),例如语调、语气等。

为了解决这一问题,我们在预训练阶段引入了两种类型的交错数据(interleaved data)音频-文本交错数据(INTLV, Audio-Text Interleaved)文本到语音交错数据(ITTS, Interleaved Text-to-Speech)

这两种数据设计有助于提升模型的音频理解与生成能力

在推理阶段,离散音频 token 会被送入 LLM,模型随后以交替的方式生成对齐的 文本 token音频 token。我们引入了特殊 token,用于在文本与音频模态间切换。这种强制对齐策略(forced alignment approach)确保了模型会优先生成连贯完整的文本内容,再生成对应的音频 token,从而有效引导音频 token 的生成,缓解语义退化问题

Pre-training details

数据: 交错数据由交替的文本和音频模态组成,并用标点符号分隔以促进跨模态知识传输。交错对齐的生成数据由完全对齐的文本和音频内容组成,旨在增强模型在文本监督下生成音频标记的能力。音频-文本配对数据(例如,ASR 和 TTS 数据)提高了基本语音任务的性能。另一方面,纯音频数据增强了独立处理音频模态的能力。交错数据收集流程如图 4 所示,分为爬取数据和合成数据两种,共获取了 14.2 万小时的 ITTS 数据和 39.3 万小时的 INTLV 数据。交错数据采用LLM进行切分,即根据文本内容中的标点符号或自然停顿进行自然切分。对于合成数据的切分文本数据,我们还采用了大型语言模型进行文本归一化 。在预训练过程中,我们排除了音频文本交错数据中音频片段的损失计算,这一设计选择与 GLM-4-Voice 不同。 在当前约 50B 的训练音频数据规模下进行的经验观察表明,计算 INTLV 数据中音频片段的损失会导致性能下降。这一决定的合理性还在于音频和文本之间固有的模态冲突,以及推理过程中不需要文本到音频的延续。因此,我们省略了 INTLV 数据中音频片段的损失计算。对于 ITTS 数据,除了初始文本片段外,还计算了音频和文本片段的损失,以增强模型在文本引导音频生成方面的能力。

两阶段训练策略。 为了解决语音特征与文本特征的不同特征可能导致的LLM中原始文本知识的潜在破坏,我们提出了一种两阶段训练策略来缓解模态之间的训练冲突。在第一阶段,LLM的参数保持不变,只允许更新音频嵌入层和音频头的参数。在第二阶段,除文本嵌入层和 LM 头的参数外,所有参数都可训练

监督微调细节

监督微调阶段旨在增强模型在一系列任务中遵循复杂指令的能力。音频 SFT 数据来自大量文本指令。使用基于指令类型、多样性和整体质量的过滤策略选择高质量指令。使用 10,000 种不同语音音调的精选数据集合成音频指令。在自然对话停顿处生成和分割相应的文本响应,然后使用指定的语音音调转换为音频。这些数据集涵盖多项任务,包含大约 242k 个音频数据对。

为了确保合成音频的质量,自动语音识别 (ASR) 被应用于生成的音频文件。将 ASR 输出与原始文本进行比较以验证质量。此过程可创建高质量的端到端对话数据集。有错误的合成音频文件将添加到文本转语音 (TTS) 数据集,而有 ASR 错误的案例将合并到 ASR 训练数据集中。这种合并具有挑战性的示例的迭代方法可增强 TTS 和 ASR 的性能。

需要特别注意处理文本转音频导致原始文本响应不适合作为音频回复的情况。此问题是由于文本和音频之间的语调、速度和表达方式的差异而产生的。某些文本内容在转换为音频时可能无法传达预期含义或引入歧义。因此,在生成过程中仔细检查和调整此类情况至关重要。这可确保合成数据准确反映现实世界的语音交互场景,从而提高数据可靠性并提高模型的实际适用性。

Experiment

 综合智力测评

基于语音的对话模型面临的一大挑战是,与纯文本对话模型相比,其性能往往会下降。为了评估语音模型的“智能”,我们​​以文本到文本的建模能力为基准,评估预训练的语音到文本模型的性能。评估数据集包括两种类型:故事延续能力和常识推理能力。

Performance in ASR/TTS Tasks

Fleurs 、 WenetSpeech 和 KeSpeech 上的主要结果 

Performance in Audio Understanding Tasks

模型在音频理解基准测试中表现优异,超越了最新的开源模型。

两种不同的设置:1)非级联方式的语音到语音生成(表示为 S → S),其中输入是音频,输出是交错的文本和音频。然后合并输出文本并用于评估。2)语音到文本生成(表示为 S → T,其中输入是音频,输出是文本,用于评估。

总结

Baichuan-Audio,这是一种专为音频设计的端到端大型语言模型,集成了语音理解和生成功能。该模型通过预训练的 ASR 模型对 12.5 Hz 的语音信号进行多码本离散化,从而保留了语音标记中的语义和声学信息。此外,还专门设计了一个独立的音频头来高效处理这些标记。为了平衡音频建模和语言能力保留,采用了交错数据的两阶段预训练策略。所提出的框架通过文本引导的对齐语音生成来支持语音交互,从而进一步保留了模型的基础认知能力。

Qwen2.5-Omni -多模态端到端大模型

这是 Qwen 系列中全新的旗舰级多模态大模型,专为全面的多模式感知设计,可以无缝处理包括文本、图像、音频和视频的各种输入,同时支持流式的文本生成和自然语音合成输出

主要特点

  • 全能创新架构:我们提出了一种全新的Thinker-Talker架构,这是一种端到端的多模态模型,旨在支持文本/图像/音频/视频的跨模态理解,同时以流式方式生成文本和自然语音响应。我们提出了一种新的位置编码技术,称为TMRoPE(Time-aligned Multimodal RoPE),通过时间轴对齐实现视频与音频输入的精准同步。
  • 实时音视频交互:架构旨在支持完全实时交互,支持分块输入和即时输出
  • 自然流畅的语音生成:在语音生成的自然性和稳定性方面超越了许多现有的流式和非流式替代方案。Qwen2.5-Omni 支持修改输出语音的音色类型,目前支持2种音色类型。
  • 全模态性能优势:在同等规模的单模态模型进行基准测试时,表现出卓越的性能。Qwen2.5-Omni在音频能力上优于类似大小的Qwen2-Audio,并与Qwen2.5-VL-7B保持同等水平。
  • 卓越的端到端语音指令跟随能力:Qwen2.5-Omni在端到端语音指令跟随方面表现出与文本输入处理相媲美的效果,在MMLU通用知识理解和GSM8K数学推理等基准测试中表现优异。

摘要:

Qwen2.5-Omni,这是一种端到端的多模态模型,能够感知多种模态信息,包括文本、图像、音频和视频,同时以流式方式生成文本和自然语音响应。为了实现多模态信息输入的流式处理,Qwen2.5-Omni 的音频和视觉编码器采用了 分块处理(block-wise processing) 方法。该策略有效地解耦了长序列多模态数据的处理,将感知任务交由多模态编码器,而将长序列建模任务交由大语言模型(LLM),这种分工机制通过共享注意力机制增强了不同模态的融合。

为同步视频输入的时间戳与音频,我们采用 交错(interleaved) 方式对音视频数据进行序列化,并提出了一种新颖的位置编码方法——TMRoPE(Time-aligned Multimodal RoPE,时间对齐多模态旋转位置编码)ps:关于旋转位置编码

在同时生成文本和语音的过程中,为了避免两种模态之间的相互干扰,我们提出了 Thinker-Talker 架构。在该框架下:

  • Thinker 作为大语言模型,负责文本生成;
  • Talker 是一个 双轨自回归模型(dual-track autoregressive model),它直接利用 Thinker隐藏表示来生成音频标记(audio tokens)作为输出

ThinkerTalker 均以端到端方式进行训练和推理。此外,为了实现流式音频标记解码,我们引入了 滑动窗口 DiT(sliding-window DiT),通过限制感受野来减少初始数据包延迟。

Qwen2.5-Omni 的关键特性可总结如下:

  • Qwen2.5-Omni 是一个 统一多模态模型,能够感知所有模态信息,并以流式方式同时生成文本和自然语音响应。
  • 我们提出了一种新颖的位置编码算法 TMRoPE(Time-aligned Multimodal RoPE),该方法显式融入时间信息,以实现音视频的同步。
  • 我们设计了 Thinker-Talker 架构,以支持 实时理解语音生成
  • 在多模态基准测试中,Qwen2.5-Omni 展示了卓越的性能,相较于类似规模的单模态模型表现更优,尤其在语音指令跟随任务上,其能力可与纯文本输入任务相媲美。
  • 在需要整合多种模态的信息处理任务中(如 OmniBench 评测),Qwen2.5-Omni 达到了 最先进(state-of-the-art) 的性能。
  • 在语音生成方面,Qwen2.5-Omniseed-tts-eval 评测中表现出色,展现出强大的语音生成能力和稳健性。
Thinker 负责 文本生成
Talker 通过直接接收 Thinker 提供的高级表示,专注于 流式语音标记生成

Architecture:

图 2 所示,Qwen2.5-Omni 采用 Thinker-Talker 架构,其中:

  • Thinker 类似于大脑,负责处理和理解 文本、音频、视频 等模态输入,生成高级表示和对应的文本输出。
  • Talker 类似于人类的嘴巴,以流式方式接收 Thinker 生成的高级表示和文本,并顺畅地输出离散语音标记。

架构细节

  • Thinker 采用 Transformer 解码器,并配备 音频编码器图像编码器,以增强信息提取能力。
  • Talker 采用 双轨【同时接收文本token和语音token】自回归 Transformer 解码器 结构(受 Mini-Omni [Xie & Wu, 2024] 启发)。
  • 训练和推理 过程中,Talker 直接接收 Thinker 的高维表示,并共享其全部历史上下文信息,使整个架构作为一个统一模型进行 端到端训练和推理
  • Mini-Omni
  • 感知:

    Qwen2.5-Omni 通过 Thinker文本、音频、图像和视频(无音频) 进行处理,将它们转化为一系列隐藏表示作为输入。具体步骤如下:

    1. 文本输入
      • 对于文本输入,我们采用 Qwen 的分词器(Byte-level Byte-pair Encoding),词汇表包含 151,643 个常规标记。
    2. 音频输入和视频中的音频
      • 音频输入(包括视频中的音频部分)首先被重采样至 16kHz 的频率,然后将原始波形转化为 128 通道的梅尔频谱图(mel-spectrogram),窗口大小为 25ms,步幅为 10ms
      • 音频编码器采用 Qwen2-Audio 的音频编码器(Chu et al., 2024b),每一帧音频表示大约对应于 原始音频信号的 40ms 时长。
    3. 图像和视频输入
      • 对于图像输入,我们采用 Qwen2.5-VL 的视觉编码器(基于 Vision Transformer(ViT) 模型,约 6.75 亿个参数),能够有效处理图像和视频输入。
      • 视觉编码器使用混合训练方法,结合图像和视频数据,确保其在图像理解和视频理解上的高效表现。
      • 为了最大程度地保留视频信息并适应音频采样率,我们采用 动态帧率(dynamic frame rate)进行视频采样。此外,为保持一致性,每个图像都被视为两个相同的帧。

    视频与TMRoPE

    TMRoPE

    我们提出了一种 音视频时间交错算法(time-interleaving),并引入了新的 位置编码方法 —— TMRoPE(Time-aligned Multimodal RoPE)。如 图 3 所示,TMRoPE 编码了多模态输入的三维位置,采用 多模态旋转位置编码(M-RoPE)ps: Qwen2-VL多模态旋转位置编码 多模位置编码】,并结合绝对时间位置。具体方法是将原始的旋转位置编码分解为三个组件:时间、图像高度和宽度。

    • 文本输入 使用相同的位置信息(位置 ID)来处理各组件,使得 M-RoPE 在文本输入中与 1D-RoPE 等效。
    • 音频输入 也使用相同的位置信息,并引入绝对时间位置编码,每 40ms 对应一个时间 ID
    • 图像输入,每个视觉标记的时间 ID 保持不变,而高度和宽度组件则根据标记在图像中的位置分配不同的 ID。
    • 音视频输入 情况下,音频依然使用相同的时间位置 ID 编码,每帧 40ms。视频则作为一系列图像处理,每帧对应的时间 ID 增量,同时高度和宽度组件的 ID 分配与图像一致。由于视频的帧率不是固定的,我们根据每帧实际时间动态调整时间 ID,以确保每个时间 ID 对应 40ms。

    在多模态输入场景下,每种模态的位置信息初始化时会将前一模态的最大位置 ID 增加 1。

    视频与音频时间交错方法

    为了使模型能够同时接收视觉和听觉信息,我们采用 时间交错方法(time-interleaving) 对带有音频的视频进行特殊设计。具体做法是:

    • 将视频的音频表示按 实际时间2 秒 切分为块。
    • 在每个 2 秒块中,先安排视频的视觉表示,再安排音频表示,从而将视频和音频的表示交错排列。

    生成:

    文本生成由 Thinker 直接生成,其逻辑与广泛使用的大型语言模型(LLM)相同,文本通过基于词汇表的概率分布进行自回归采样生成。生成过程中可能会采用一些技术,如 重复惩罚(repetition penalty)top-p 采样以提高文本生成的多样性

    语音生成中,Talker 接收 Thinker 生成的高维表示和采样的文本标记高维表示和离散采样标记的结合是这个过程中的关键。作为流式算法,语音生成需要在整个文本完全生成之前预测文本的语气和态度。Thinker 提供的高维表示隐含了这些信息,使得语音生成过程更自然。此外,Thinker 的表示主要体现语义相似性而非语音相似性,因此,即使是发音上差异较大的词,其高维表示可能非常相似,这就需要输入离散的采样标记来消除这种不确定性。

    我们设计了一个高效的语音编解码器 qwen-tts-tokenizer,它能够高效地表示语音的关键信息,并通过因果音频解码器流式解码成语音。接收到信息后,Talker 开始自回归地生成音频标记和文本标记语音生成过程中不需要与文本进行逐字和逐时间戳的对齐,这大大简化了训练数据的要求和推理过程。

    流式设计:

    在音频和视频流式交互的背景下,初始包延迟是衡量系统流式性能的关键指标。这个延迟受到多个因素的影响:1)多模态信息输入处理引起的延迟;2)从接收到第一个文本输入到输出第一个语音标记之间的延迟;3)将第一个语音段转换为音频的延迟;4)架构本身的固有延迟,这与模型大小、计算 FLOP 数以及其他因素相关。本文将随后讨论在这四个维度上减少这些延迟的算法和架构改进。

    支持预填充(Support Prefilling)

    块状预填充(Chunked-prefills) 是现代推理框架中广泛使用的一种机制。为了支持模态交互中的预填充机制,我们修改了音频和视觉编码器,以支持沿时间维度的 块状注意力(block-wise attention)。具体而言,音频编码器从对整个音频的全局注意力改为对每个 2 秒 的音频块进行注意力计算。视觉编码器则使用 Flash Attention 来实现高效的训练和推理,并通过一个简单的 MLP 层 将相邻的 2×2 标记合并为一个标记。补丁大小设置为 14,允许不同分辨率的图像被打包成一个序列。

    流式编解码器生成(Streaming Codec Generation)

    为了促进音频的流式传输,特别是对于长序列的流式处理,我们提出了一种 滑动窗口块注意力机制(sliding window block attention),该机制限制了当前标记访问的上下文范围。具体来说,我们采用了 Flow-MatchingDiT 模型。输入的code通过 Flow-Matching 转换为 梅尔频谱图(mel-spectrogram),然后通过修改后的 BigVGAN 将生成的梅尔频谱图重建回波形。

    DiT中用于编解码到波形生成的滑动窗口块注意力机制的示意图

    预训练

    Qwen2.5-Omni 由三个训练阶段组成。在第一阶段,我们锁定大型语言模型(LLM)的参数,专注于训练视觉编码器和音频编码器,利用大量的音频-文本和图像-文本对来增强 LLM 的语义理解能力。在第二阶段,我们解冻所有参数,并使用更广泛的多模态数据进行训练,以实现更全面的学习。在最后阶段,我们使用长度为 32k 的数据来提升模型理解复杂长序列数据的能力。

    该模型在一个多样化的数据集上进行预训练,数据类型包括图像-文本、视频-文本、视频-音频、音频-文本和文本语料库。我们将层次标签替换为自然语言提示,遵循 Qwen2-Audio(Chu et al., 2024a)的方法,这可以提高模型的泛化能力和指令跟随能力。

    在初始预训练阶段,Qwen2.5-Omni 的 LLM 组件使用 Qwen2.5(Yang et al., 2024b)中的参数初始化,视觉编码器与 Qwen2.5-VL 相同,音频编码器则使用 Whisper-large-v3(Radford et al., 2023)初始化。两个编码器分别在固定的 LLM 上进行训练,最初都专注于训练各自的适配器,然后再训练编码器。这个基础训练对装备模型具有坚实的视觉-文本和音频-文本关系和对齐的理解至关重要。

    预训练的第二阶段标志着一个重要的进展,它增加了 8000 亿个图像和视频相关的数据标记,3000 亿个音频相关的数据标记,以及 1000 亿个视频带音频相关的数据标记。这一阶段引入了更多的混合多模态数据和更广泛的任务,增强了听觉、视觉和文本信息之间的互动,并加深了理解。加入多模态、多任务数据集对于培养模型同时处理多任务和多模态的能力至关重要,这是一项处理复杂现实世界数据集的关键能力。此外,纯文本数据在保持和提高语言能力方面也起着重要作用。

    为了提高训练效率,我们在之前的阶段将最大标记长度限制为 8192 个标记。随后,我们引入了长音频和长视频数据,并将原始文本、音频、图像和视频数据扩展到 32,768 个标记进行训练。实验结果表明,我们的数据在支持长序列数据方面取得了显著的改进。

    Post-training

    数据格式:

    Thinker

    在后训练阶段,我们采用 ChatML 格式(OpenAI, 2022)进行指令跟随数据的微调。我们的数据集包括纯文本对话数据、视觉模态对话数据、音频模态对话数据以及混合模态对话数据。

    Talker

    我们为 Talker 引入了一个三阶段训练过程,使 Qwen2.5-Omni 能够同时生成文本和语音响应。在第一阶段,我们训练 Talker 学习上下文延续。在第二阶段,利用 DPO(Rafailov et al., 2023)增强语音生成的稳定性。在第三阶段,我们应用了多语者指令微调,以提高语音响应的自然性和可控性。

    上下文学习(ICL) 训练阶段,除了像 Thinker 那样使用文本监督外,我们还通过下一标记预测执行语音延续任务,利用包含多模态上下文和语音响应的广泛对话数据集。Talker 学会了从语义表示到语音的单调映射,同时获得了根据上下文生成具有多样化属性(如韵律、情感和口音)的语音的能力。此外,我们还实施了音色解耦技术,以防止模型将特定的声音与不常见的文本模式关联。

    为了扩大语者和场景的覆盖范围,预训练数据不可避免地包含标签噪声和发音错误,这可能导致模型产生幻觉。为了解决这个问题,我们引入了强化学习阶段来提高语音生成的稳定性。具体来说,对于每个请求和响应文本与参考语音配对的情况,我们构建了一个数据集 D,其中包含三元组数据 (x, yw, yl),其中 x 是输入序列的输入文本,ywyl 分别是良好和不良生成的语音序列。我们根据这些样本的奖励分数进行排名,奖励分数与 词错误率(WER)标点停顿错误率 相关。

    最后,我们对上述基础模型进行了语者微调,使 Talker 能够采用特定的声音并提高其自然性。

    Performance  

    我们对 Qwen2.5-Omni 进行了全面评估,与类似大小的单模态模型和 Qwen2.5-VL-7B、Qwen2-Audio 和 Gemini-1.5-pro 等闭源模型相比,该模型在所有模态中均表现出色。在需要集成多种模态的任务(例如 OmniBench)中,Qwen2.5-Omni 实现了最佳性能。此外,在单模态任务中,它在语音识别(Common Voice)、翻译(CoVoST2)、音频理解(MMAU)、图像推理(MMMU、MMStar)、视频理解(MVBench)和语音生成(Seed-tts-eval 和主观自然度)等领域表现出色。

    Paraformer-时间戳模型

    如图2(a)所示。Paraformer是一个单步非自回归(NAR)模型,结合了基于语言模型的快速采样模块,以增强NAR解码器捕捉标记之间依赖关系的能力。

    Paraformer由两个核心模块组成:预测器和采样器。预测器模块用于生成声学嵌入,捕捉输入语音信号中的信息。在训练过程中,采样器模块通过随机替换标记到声学嵌入中,结合目标嵌入生成语义嵌入。这种方法使得模型能够捕捉不同标记之间的相互依赖关系,并提高模型的整体性能。然而,在推理过程中,采样器模块处于非激活状态,声学嵌入仅通过单次传递输出最终预测结果。这种方法确保了更快的推理时间和更低的延迟。

    Timestamp Predictor:

    准确的时间戳预测是 ASR 系统的关键功能。然而,传统的工业 ASR 系统需要额外的混合模型来进行力对齐 (FA) 以实现时间戳预测 (TP),从而增加计算量和时间成本。FunASR 提供​​了一个端到端的 ASR 模型,通过重新设计 Paraformer 预测器的结构来实现准确的时间戳预测,如图2 (b) 所示。我们引入了一个转置卷积层和 LSTM 层来对编码器输出进行上采样,并通过后处理 CIF 权重 α2 来生成时间戳。我们将两个fireplaces 之间的帧视为前一个标记的持续时间,并根据α₂标出静音部分。此外,FunASR还发布了一个类似强制对齐的模型TP-Aligner,该模型包括一个较小的编码器和一个时间戳预测器。它接受语音和相应的转录作为输入,以生成时间戳。

    我们在AISHELL和60,000小时工业数据上进行了实验,以评估时间戳预测的质量。用于衡量时间戳质量的评估指标是累积平均偏移(AAS)。我们使用了一个包含5,549个手动标记时间戳的测试集,将提供的模型与使用Kaldi训练的FA系统进行时间戳预测性能比较。结果显示,Paraformer-TP在AISHELL上优于FA系统。在工业实验中,我们发现提出的时间戳预测方法在时间戳准确性方面与混合FA系统相当(差距小于10毫秒)。此外,这种单次解决方案对于商业使用非常有价值,因为它有助于减少计算和时间开销。

    1. CIF 模块的核心机制

    CIF 模块通过以下步骤实现时间戳预测:

    • 权重预测:模型为每一帧预测一个权重 α_t,表示该帧对当前词的贡献程度。
    • 累积积分:将连续帧的权重 α_t 累加,直到总和达到预设的阈值 β。
    • 触发发射:一旦累积权重达到阈值 β,模型将当前累积的帧级特征 h_t 加权求和,生成一个词级的表示 c_u。
    • 重复过程:继续上述过程,直到处理完所有帧,生成完整的词级序列。

    这种机制允许模型在不依赖自回归的情况下,确定每个词的边界,实现高效的并行解码。

    2. 时间戳的生成

    在 FunASR 中,时间戳的生成过程如下:

    • 上采样编码器输出:引入转置卷积层和 LSTM 层,对编码器输出进行上采样,增强时间分辨率。
    • 后处理 CIF 权重:通过对 CIF 权重 α2 进行后处理,确定每个词的起止时间。
    • 静音部分的标注:根据 α2 的值,标注出静音部分,进一步提升时间戳的准确性。

    此外,FunASR 还提供了一个名为 TP-Aligner 的模型,用于在输入语音和对应转写文本的情况下,生成时间戳。

    通过 CIF 权重 α 后处理确定词的起止时间

    CIF 权重 α 表示每一帧对当前输出 token(如汉字或子词)的贡献程度。在推理过程中,模型会累积连续帧的权重 α_t,直到总和达到或超过一个预设的阈值 β(通常为 1)。此时,模型认为已经收集了足够的信息来生成一个输出 token。

    为了确定每个词的起止时间,可以按照以下步骤进行后处理:

    1. 初始化:设置累积权重 accumulator = 0,记录当前 token 的开始帧 start_frame。
    2. 遍历帧序列:对于每一帧 t,执行以下操作:
      • 将当前帧的权重 α_t 加到 accumulator 上。
      • 如果 accumulator < β,继续累积。
      • 如果 accumulator ≥ β,记录当前帧 t 作为当前 token 的结束帧 end_frame。
      • 将 accumulator 减去 β,设置 start_frame = t + 1,开始下一个 token 的累积。
    3. 计算时间戳:根据帧率(例如,每帧 10ms),将 start_frame 和 end_frame 转换为时间戳,得到每个词的起止时间。

    这种方法允许模型在不依赖自回归的情况下,确定每个词的边界,实现高效的并行解码。


    🤫 标注静音部分

    静音部分通常对应于 CIF 权重 α 值较低的帧。为了标注静音部分,可以采用以下策略:

    1. 设定阈值:选择一个合适的阈值(例如 0.01),用于判断帧是否为静音。
    2. 遍历帧序列:对于每一帧 t,检查其权重 α_t:
      • 如果 α_t < 阈值,标记该帧为静音。
      • 否则,标记该帧为语音。
    3. 合并连续静音帧:将连续的静音帧合并为一个静音段,记录其起止时间。

    这种方法可以有效地识别语音中的静音部分,对于语音活动检测(VAD)和语音分割等任务具有重要意义。

    Monotonic-Aligner 模型FunASR发布了一个类似强制对齐的模型TP-Aligner,该模型包括一个较小的编码器和一个时间戳预测器。它接受语音和相应的转录作为输入,以生成时间戳。

    模型地址FunASR/funasr/models/monotonic_aligner/model.py

    模型权重:https://modelscope.cn/models/iic/speech_timestamp_prediction-v1-16k-offline

    本模型为Paraformer-large-长音频版的衍生模型,通过较小参数量的encoder与上采样cif predictor实现了时间戳预测功能,方便用户自由搭建ASR链路中的功能环节。

    其核心点主要有:

    • Upsample Predictor 模块:在低帧率模型中predictor产生的帧级别权重可能存在预测不稳定的问题,表现为首尾帧出字与连续帧出字,这为基于cif权重的时间戳预测带来了困扰。本模型
      • (1) 在predictor的线性层之前引入了反卷积升采样模块与lstm模块,在多倍帧率的情况下预测权重;
      • (2) 通过scaled cif对权重进行尺度缩小与平滑,使得cif权重不表现为一个peak而是一段累积过程。通过上述两个操作得到了能用于时间戳预测的帧权重。
    • 基于约5w小时工业数据训练的时间戳预测模型,鲁棒性更强,时间戳准确率更高。

    TP-Aligner 的工作流程如下:

    1. 输入处理:接收音频信号和对应的文本转录。
    2. 特征提取:通过轻量级编码器提取音频的高层次特征。
    3. 上采样处理:使用转置卷积层和 LSTM 层对编码器输出进行上采样,增强时间分辨率。
    4. 时间戳预测:结合文本转录信息,预测每个词或子词的起止时间。

    DPO为什么会让大语言模型输出变长

    摘自:https://zhuanlan.zhihu.com/p/5830338806

    总的来说,DPO让模型输出变长主要可以分为以下几个原因:

    1. RM和模型评测的长度偏好。不管是Reward Model还是当前用与评测的模型(即便是GPT4)都会存在比较明显的长度偏好,即倾向于给更长的回答一个更高的分数。这一点已经有非常多工作给出过分析了。
    2. 训练数据本身长度分布不均衡。实战过程中往往就是用RM进行排序构造训练数据,RM的长度偏好就是会导致训练数据中容易出现chosen比rejected更长的情况。训练数据的长度差异(chosen比rejected长)就会导致训练后模型输出变长。
    3. 数据长度差异导致的reward被高估或低估。《Eliminating Biased Length Reliance of Direct Preference Optimization via Down-Sampled KL Divergence》中发现,DPO的算法本身也存在对response长度的依赖,chosen和rejected之间的长度差异可能会导致reward被高估/低估(overestimated or underestimated rewards)。即,当chosen过短时,reward会被低估,而当chosen过长时,reward会被高估
    4. DPO算法本身的长度敏感性。《Length Desensitization in Direct Preference Optimization》中提到,response长度会影响到似然概率的大小,并且进一步影响到训练优化方向:当chosen更长时,DPO会往chosen的方向进行优化(增大chosen概率),从而使输出变长;而rejected更长时,DPO会往远离rejected的方向优化(降低rejected概率),但却未必会让输出变短。

    如何解决:

    1. RM的优化:前面讲的都是对DPO进行长度控制的工作,但对RM本身的长度偏好进行优化的工作没有看到太多,如果大家有看到相关的也可以在评论区提供一下。如果将RM本身的长度偏好问题解决的话,那就可以极大程度上解决训练数据的长度分布均衡问题了。
    2. 数据的优化:有些工作会在数据构造时对长度进行综合考虑,如对RM打分进行长度归一后再排序、采样多个答案进行排序时根据均值方差限制chosen的长度等,通过这些方式可以减少长度差距过大的情况。如果数据本身的长度分布均衡了,也能一定程度上减缓这种问题。
    3. 训练算法上的优化:如果从LD-DPO的分析上看,即便数据分布比较均衡,只要存在长度差异,DPO本身的长度敏感性就是会导致模型输出变长,因此可能还是需要一些算法层面的优化,比如在DPO阶段加入SFTloss就是一种简单有效的方法,在很多公开的大模型技术报告中也都有用到该方法。另外R-DPO、SamPO和LD-DPO的长度控制效果都算是比较好的方法。

    DPO面临的一个问题(准确来讲是一种现象)就是会让大模型的输出变长,且多轮DPO的话会让模型输出越来越长。本篇文章我们将结合搜集到的一些相关工作,探讨一下业界对该现象的一些分析,探究这一现象产生的根本原因,以及如何有效地解决。

    首先我们需要思考一个问题,模型输出变长到底是不是一件坏事?一般来说,输出变长可能会使内容更加详细,信息量更丰富,回复质量更高,用户体验更好。但如果过度长,输出了很多冗余信息,回复质量没有明显改善,反而带来了推理成本的增加,回复变得啰嗦,用户体验反而变差了。

    因此,无论是从用户体验的角度还是多轮DPO能否run下去的角度,做好长度控制都是有必要的。

    相关工作

    先简要介绍一些相关工作,然后后面详细总结。

    1.《Disentangling Length from Quality in Direct Preference Optimization》(简称R-DPO)

    在这之前的一些RL的工作也有分析过长度爆炸问题,但该文章可能是第一个提出DPO的长度爆炸问题的。

    文章中发现,无论是RL训练中使用的Reward Model还是用来评测模型效果的打分模型(如GPT-4)都表现出明显的长度偏好,即会给更长的答案一个更高的分数(如下图)。且在一些公开的DPO训练数据集中,chosen的长度往往会比rejected更长,而这可能就是DPO后的模型输出长度明显比SFT模型更长的原因

    为了解决这个问题,该文章提出了一种长度正则化的策略,即在计算loss的时候添加一个长度正则项,从而避免模型对长度的过度拟合,公式如下:

    其中 |yw| 表示chosen的长度, |yl| 表示rejected的长度,从公式中可以看出,当chosen与rejected的长度差距越大,正则项的值越大,从而实现对长度的“惩罚”效果。

    从文章中的实验结果可以看出,该方法确实可以在尽可能减少性能损失的前提下有效解决长度增长问题。(有时还是会损失一定的性能。)

    2.《SimPO: Simple Preference Optimization with a Reference-Free Reward》(简称SimPO)

    陈丹琦团队的工作,直接去掉了reference model,用长度归一的方式实现长度控制。其loss如下:

    文章中提到了很多输出长度相关的内容,但核心贡献并不是做长度控制,而是用一种更简单高效的方法实现偏好训练。从公式上看,和原始DPOloss相比主要有两处不同,一个是分母从reference model的logp替换成了长度,另外就是增加了一个 γ ,类似一个offset的作用。不过其中对chosen和rejected的reward做长度归一的部分,直觉上看起来应该是能起到一定的长度控制效果的。

    不过从论文中的实验结果看,该方法的效果还是比较好的(当时声称训出最强8B大模型),但与标准DPO相比似乎并没有实现长度控制的效果。

    3.《Eliminating Biased Length Reliance of Direct Preference Optimization via Down-Sampled KL Divergence》(简称SamPO

    这篇论文对DPO后长度变长的问题进行了一定的分析,提出的一个核心观点是:DPO的算法本身也存在对response长度的依赖,chosen和rejected之间的长度差异可能会导致reward被高估/低估(overestimated or underestimated rewards)。即,当chosen过短时,reward会被低估,而当chosen过长时,reward会被高估。

    这篇工作中提出的一种方式就是在token级别下采样的概率特征,以计算正则化的KL散度,从而减少因pair长度不同而导致的奖励偏差。其loss的计算如下:

    从公式可以看出,该方法的核心就是在计算reward的时候不再是全部token的条件概率的累乘(取log后就是累加),而是随机采样公共数量的token进行累乘。这样即便chosen和rejected长度不同,参与reward计算的token数是一样的。也就是说,在SamPO训练过程中,魔都看到的chosen和rejected相当于是完全等长的。

    从文章中的实验结果看,该方法确实能有效控制模型输出长度的增长,甚至在多轮DPO依然能有效控制长度。但是在性能上看依然做不到碾压标准DPO的效果。

    但该方法有两个风险便是:

    1. 本身DPO就存在一定的波动,随机下采样可能会导致训练的稳定性不强;
    2. 随机采样必然会导致一些信息缺失,如果采样时舍弃掉了一些非常重要的token可能会影响到训练效果。

    4.《Length Desensitization in Direct Preference Optimization》(简称LD-DPO)

    该论文可能是第一个从理论层面分析DPO后模型输出变长的原因的,其核心分析主要包括两方面:

    1. DPO的梯度优化方向和chosen/rejected的似然概率成反比。
    2. Response长度对似然概率的影响极大,因此长度会直接影响reward的计算,并影响到DPO的优化方向。

    上图是一个对训练数据的统计热力图,图中,横坐标为chosen的长度,纵坐标为rejected的长度,颜色深度表示 log⁡πθ(yl|x)−log⁡πθ(yw|x) 值的大小。第一张图(a)是标准DPO,可以看出长度差距越大时,颜色越深,也就说明长度差距可能会导致reward计算产生bias,且长度差距越大这种bias越大。而这种bias会进一步影响到DPO的优化方向,使其往输出更长的方向进行优化。

    该文章提出的解决方案是在计算似然概率时对长度进行解耦,将更长的答案拆成“公共长度部分”和“额外部分”,并进一步将后者拆分为真实偏好和冗余偏好,并对其中的冗余部分进行降权操作,通过一系列推导后将 πθ(y|x) 转化为如下的形式(可近似理解为完整似然概率部分与公共长度部分似然概率的加权和):

    从公式上看,这种方式可以让长度更长的那个response(不管是chosen还是rejected)实现一定的缩放(),减少长度带来的似然概率的断崖式下滑,使其与另一个短response(不受影响)之间更具可比性,同时又不会像SamPO那样完全舍弃掉额外部分的信息。

    从论文中的实验结果看,这种方法能够实现比较好的长度控制,且模型性能还能有一定提升,并且可以通过调整参数 α 可以实现不同程度的控制效果。另外文章还提出一个比较有意思的发现,就是过度冗余的回答可能反而会损害模型的推理能力,他们通过这种方法控制长度后,模型的推理能力也有明显提升。

    其他工作

    除此之外,还有一些工作直接在数据上做文章,通过控制chosen和rejected的长度差距来实现长度控制,如《Following Length Constraints in Instructions》(简称LIFT-DPO)。以及在一些开源模型的技术报告中我们也能看到一些相关的长度控制方法,如在利用RM打分排序时就综合考虑长度问题等,这些数据工作就不再详细展开了。

    如何实现有效的长度控制?

    1. RM的优化:前面讲的都是对DPO进行长度控制的工作,但对RM本身的长度偏好进行优化的工作没有看到太多,如果大家有看到相关的也可以在评论区提供一下。如果将RM本身的长度偏好问题解决的话,那就可以极大程度上解决训练数据的长度分布均衡问题了。
    2. 数据的优化:有些工作会在数据构造时对长度进行综合考虑,如对RM打分进行长度归一后再排序、采样多个答案进行排序时根据均值方差限制chosen的长度等,通过这些方式可以减少长度差距过大的情况。如果数据本身的长度分布均衡了,也能一定程度上减缓这种问题。
    3. 训练算法上的优化:如果从LD-DPO的分析上看,即便数据分布比较均衡,只要存在长度差异,DPO本身的长度敏感性就是会导致模型输出变长,因此可能还是需要一些算法层面的优化,比如在DPO阶段加入SFTloss就是一种简单有效的方法,在很多公开的大模型技术报告中也都有用到该方法。另外R-DPO、SamPO和LD-DPO的长度控制效果都算是比较好的方法。

    最后结合我自己的一些尝试来直接对比一下上面的四种方法:

    1. R-DPO是通过加正则项的方式实现长度控制,说是正则项,但其实只是一个常数,其原理相当于是对每条数据加上一个权重(文章中也提到了这点),即当chosen和rejected长度差距大时降低该数据的权重。也就是说,该方法其实是让模型减少对长度差距大的数据的学习权重。这种方法确实可以实现一定的长度控制效果,但必然会减少一些数据的利用率,这可能也是训练效果会有一定损失的原因。我自己尝试了一下该方案,实验下来确实可以做到长度控制效果,但大部分情况下性能都会比标准DPO差一些。
    2. SimPO是用长度归一来替换Reference Model的KL约束,理论上和长度控制其实没有太大关系,更多的是简化训练和提升性能。实验结果确实也体现了并不会比标准DPO更短。(该方法热度很高,但网络上褒贬不一,很多人表示无法复现结果。)根据我自己实验经验来看,跑出好的结果需要仔细调参,论文推荐的超参不一定适合所有情况。
    3. SamPO是直接用下采样的方式,强行将模型视角下的长答案变得和短答案一样长,该方法给人的直观感受就是长度控制效果肯定很好,但是很可能会有性能损失。但我自己实验下来,长度控制效果和R-DPO差不多,但是性能也比较不稳定,更换随机种子就会导致性能产生波动。我也尝试过将随机下采样改为top-k采样,即保留概率最大的top-k个token,但效果并不会比随机更好(这么直觉的方法可能论文作者也尝试过了)。
    4. LD-DPO的方法是只对答案过长的部分做了解耦和降权处理,通过降低过长部分的权重来实现整个条件概率的缩放,看起来是四种方法中实现最优雅的一种,既降低了长度差异带来的reward bias问题,又不会丢弃信息,相当于是用极小的代价实现了概率缩放目的。从论文中贴出的结果看,确实也是性能最强的一个,长度控制效果也是最好的。但论文代码没有开源,所以没有实验验证。但从公式上看复现难度应该不是很大,有能力的可以尝试复现一下看看效果。

    transformers 的 generate() 方法实现多样化文本生成:参数含义和算法原理解读

    这个类对外提供的方法是 generate(),通过调参能完成以下事情:

    • greedy decoding:当 num_beams=1 而且 do_sample=False 时,调用 greedy_search()方法,每个step生成条件概率最高的词,因此生成单条文本。贪婪搜索对于输出相对较短且创造力并非优先考虑的任务非常有效。然而,当生成较长的序列时,它会失效,因为它会开始自我重复。
    • multinomial sampling:当 num_beams=1 且 do_sample=True 时,调用 sample() 方法,对词表做一个采样,而不是选条件概率最高的词,增加多样性。
    • beam-search decoding:当 num_beams>1 且 do_sample=False 时,调用 beam_search() 方法,做一个 num_beams 的柱搜索,每次都是贪婪选择top N个柱。
    • beam-search multinomial sampling:当 num_beams>1 且 do_sample=True 时,调用 beam_sample() 方法,相当于每次不再是贪婪选择top N个柱,而是加了一些采样。
    • diverse beam-search decoding:当 num_beams>1 且 num_beam_groups>1 时,调用 group_beam_search() 方法。
    • constrained beam-search decoding:当 constraints!=None 或者 force_words_ids!=None,实现可控文本生成。

    参数列表

    核心代码详见:generate()入口函数定义, GenerationConfig类

    1.控制生成长度的参数

    参数类型缺省值含义
    max_lengthint20表示 prompt + max_new_tokens 累加的最大长度,如果max_new_tokens也设置了,会覆盖这个参数
    max_new_tokensint生成部分的tokens的最大长度 (忽略prompt部分的长度)
    min_length0表示 prompt + min_new_tokens 累加的最小长度,如果min_new_tokens也设置了,会覆盖这个参数
    min_new_tokensint生成部分的tokens的最小长度 (忽略prompt部分的长度)
    early_stoppingbool, strFalse对于beam search方法的控制终止的配置。
    False: 当有’num_beams’个候选生成,则终止
    True: 应用一些启发式规则判断不能找到更好的生成候选,来提前终止生成
    “never”: 当判断没有更好的可生成的candidate, beam search 过程终止
    max_timefloat执行生成的最大时间(s秒数)
    stop_stringsstr, array[str]配置模型生成的终止字符串,当模型生成参数配置的字符串,则终止生成。

    2. 控制生成策略的参数

    参数类型缺省值含义
    do_sampleboolFalseTrue: 生成过程使用采样逻辑
    False: 使用greedy做生成

    do_sample=False(默认),系统按贪心或 beam search 策略选择 最高概率的那个 token;若 do_sample=True,在每一步生成时,会根据模型输出的概率分布随机采样下一个 token,而不是总是选择最高概率项
    num_beamsint1设置beam search 束的数量。如果是1不做beam search 搜索。
    num_beams = N 表示在生成过程中 同时保留 N 条候选序列(“beams”)
    num_beam_groupsint1为了保证生成的多样性,将num_beams 设置成多组。参考文献: https://arxiv.org/pdf/1610.02424.pdf
    penalty_alphafloatcontrastive search decoding的配置项,用于平衡生成置信度和衰减的惩罚
    dola_layersstr, List[int]str :
    “None”: 不使用dola
    “low” : 较低的一半layers, 最多20层使用dola
    “high”: 较高的一半layers, 最多20层使用dola
    List[int] : 通过指定一个index数组,指定dola 层
    “low”: 提升长答案的task,
    “high”:提升短答案的task

    3.cache配置参数

    参数类型缺省值含义
    use_cacheboolTrue是否使用KV cache 加速推理速度
    cache_implementationstr指定cache实现的name,在调用generate()时,实例化cache。
    ”static”: [StaticCache]
    “offloaded_static”: [OffloadedStaticCache]
    ”sliding_window”: [SlidingWindowCache]
    “hybrid”: [HybridCache]
    “mamba”: [MambaCache]
    ”quantized”:[QuantizedCache]
    cache_configCacheConfig , dictNonecache类使用的参数
    return_legacy_cacheboolTrue当DynamicCache 被使用时,是否返回历史的和新格式的cache

    4.操作模型输出logit的配置参数

    参数类型缺省值含义
    temperaturefloat1.0这个值用于建模下一个token的概率, 这个值被设置在generation_config.json文件中
    仅在 do_sample=True生效,控制 logits 经过 softmax 后分布的平滑/尖锐程度
    top_kint50筛选最高概率的top k个词, 这个值被设置在generation_config.json文件中
    top_pfloat1.0当设置<1时,筛选概率最高的token,累加概率不超过top_p的token
    min_pfloat配置筛选概率最低的一批token, 累加概率不超过min_p,裁剪掉,该配置相当于top_p的反向操作
    typical_pfloat1.0测量两个分布的相似性: 预测下一个目标token的概率 and 预测下一个随机Token的条件概率期望。如果设置<1,则筛选最典型的token。
    epsilon_cutofffloat0.0按设置的值,卡掉低概率值的token,一般设置为:3e-4 to 9e-4
    eta_cutofffloat0.0混合局部典型性采样和epsilon采样方法
    diversity_penaltyfloat0.0只对group beam search方法生效,如果在某个特定时间生成的token与任何beam 组生成的token一致,则beam的score减去这个值
    repetition_penaltyfloat1.01.0 默认不惩罚
    encoder_repetition_penaltyfloat1.0对于不在原始输入的token,指数级的惩罚
    length_penaltyfloat1.0对于beam 类的生成方法的长度惩罚,由于序列score是 log likelihood , > 0 倾向于更长的 <0 倾向于更短的
    no_repeat_ngram_sizeint0如果大于0, 则对应的size的ngram只能出现1次
    bad_words_idsList[List[int]]列出不允许生成的tokens_id
    force_words_idsList[List[int]] or List[List[List[int]]]必须被生成的words_ids。 如果配置List[List[List[int]]] 设置对于每个token的约束
    renormalize_logitsboolFalse对于所有的logits做后处理后,是否要再做下normalize
    constraintsList[Constraint]通过定义一个List[Constraint] 对象数组,来确保输出是在某些限制的场景下。一般用于安全的场景
    forced_bos_token_idintmodel.config.forced_bos_token_id强制跟在decoder_start_token_id之后的第一个token,对多语言模型是有用的
    forced_eos_token_idint or List[int]model.config.forced_eos_token_id当生成的token达到max_length上限时,最后一位输出的token
    remove_invalid_valuesboolmodel.config.remove_invalid_values是否移出可能生成的nan and inf 值,配置这个会减慢生成速度
    exponential_decay_length_penaltytuple(int, float)指数级增加长度的惩罚,tuple(start_index, decay_factor) start index 指示惩罚的开始i,decay_factor 指数衰减的惩罚因子
    suppress_tokensList[int]通过设置禁止的token的logit为-inf,来禁止token被sample
    begin_suppress_tokensList[int]通过设置首位禁止的token的logit为-inf,来禁止首位这部分token被采样到,进而导致被生成
    forced_decoder_idsList[List[int]]一个整数pair的数组,格式[生成index, token_index]指示固定位置强制生成某个token,例如[[1, 123]] 第二个位置总是生成token 123
    sequence_biasDict[Tuple[int], float]token list -> bias的映射,正的bias提升几率,负的bias降低几率
    token_healingboolFalse对prompt尾部的token做相似替换,以提升生成质量
    guidance_scalefloat是一个缩放因子,当>1时,这个因子越高,越鼓励模型生成与prompt接近的samples 。
    watermarking_configBaseWatermarkingConfig or dict对输出结果增加水印

    5.输出结果配置参数

    参数类型缺省值含义
    num_return_sequencesint1对于batch中的每个元素,设置独立计算的返回的sequence的数量
    output_attentionsboolFalse是否返回所有的attention的向量
    output_hidden_statesboolFalse是否返回所有网络层的隐层状态
    output_scoresboolFalse是否返回prediction scores
    output_logitsbool是否返回未处理过的的logit score
    return_dict_in_generateboolFalse除了返回生成序列,是否还返回a [`~utils.ModelOutput`]

    6.生成时使用的特殊token的配置参数

    参数类型缺省值含义
    pad_token_idintpadding token ID
    bos_token_idintbeginning -of – sequence token ID
    eos_token_idUnion[int, List[int]]end-of-sequence token ID

    6.辅助生成的配置参数(投机采样)

    参数类型缺省值含义
    is_assistantboolFalse指定是否模型是一个assistant(draft) model
    num_assistant_tokensint20投机采样过程,每次迭代 assistant model 要输出多少个token,给到目标模型做check。配置更高的值,如果assistant model 效果好 能带来更好的加速比
    num_assistant_tokens_schedulestrconstant“heuristic” : 当所有投机采样的token都正确时,将num_assistant_tokens增加2,否则减少1。
    “constant”: num_assistant_tokens 保持固定不变
    “heuristic_transient”: 类似于启发式方法,每次生成调用,都置成初始化的num_assistant_tokens值
    assistant_confidence_thresholdfloat0.4当assistant model预估当前token的置信度 小于 阈值时,提前终止assistant model的生成
    prompt_lookup_num_tokensint作为候选token 要输出的token的数量
    max_matching_ngram_sizeint2match prompt的最大ngram的数量
    assistant_early_exitint
    assistant_lookbehindint10如果设置为正整数,则重新编码过程将额外考虑最后的assistant_lookbehind个辅助标记,以正确对齐标记。此设置仅可在推测解码中使用不同的分词器时使用。
    target_lookbehindint10如果设置为正整数,则重新编码过程将额外考虑最后的target_lookbehind个辅助标记,以正确对齐标记。此设置仅可在推测解码中使用不同的分词器时使用。


    如有整理错误,欢迎指正~