MCP-大模型上下文协议

MCP:大模型接入万物的通用协议,智能体时代的HTTP!

一、什么是MCP(Model Context Protocol)

定义

MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大模型与外部数据源和工具之间的通信协议。MCP 的主要目的在于解决当前 AI 模型因数据孤岛限制而无法充分发挥潜力的难题,MCP 使得 AI 应用能够安全地访问和操作本地及远程数据,为 AI 应用提供了连接万物的接口。

Function Calling是AI模型调用函数的机制,MCP是一个标准协议,使大模型与API无缝交互,而AI Agent是一个自主运行的智能系统,利用Function Calling和MCP来分析和执行任务,实现特定目标。

MCP 的价值

举个栗子,在过去,为了让大模型等 AI 应用使用数据,要么复制粘贴,要么上传知识库,非常局限。

即使是最强大模型也会受到数据隔离的限制,形成信息孤岛,要做出更强的大模型,每个新数据源都需要自己重新定制实现,使真正互联的系统难以扩展,存在很多的局限性。

现在,MCP 可以直接在 AI 与数据(包括本地数据和互联网数据)之间架起一座桥梁,通过 MCP 服务器和 MCP 客户端,大家只要都遵循这套协议,就能实现“万物互联”。

有了MCP,可以和数据和文件系统、开发工具、Web 和浏览器自动化、生产力和通信、各种社区生态能力全部集成,实现强大的协作工作能力,它的价值远不可估量。

MCP 与 Function Calling 的区别

  • MCP(Model Context Protocol),模型上下文协议
  • Function Calling,函数调用

这两种技术都旨在增强 AI 模型与外部数据的交互能力,但 MCP 不止可以增强 AI 模型,还可以是其他的应用系统。

Function Calling

数据安全性

这样一个理想的“万物互联”生态系统看着很让人着迷。

但是大家是不是担心通过 MCP Server 暴露出来的数据会泄露或被非法访问,这个头疼的问题 MCP 也考虑到了。

MCP 通过标准化的数据访问接口,大大减少了直接接触敏感数据的环节,降低了数据泄露的风险。

还有,MCP 内置了安全机制,确保只有经过验证的请求才能访问特定资源,相当于在数据安全又加上了一道防线。同时,MCP协议还支持多种加密算法,以确保数据在传输过程中的安全性。

例如,MCP 服务器自己控制资源,不需要将 API 密钥等敏感信息提供给 LLM 提供商。这样一来,即使 LLM 提供商受到攻击,攻击者也无法获取到这些敏感信息。

不过,MCP 这套协议/标准,需要大家一起来共建,这个生态才会繁荣,现在,只是测试阶段,一切才刚刚开始,当然,还会涌现出更多的问题。

工作原理

MCP 协议采用了一种独特的架构设计,它将 LLM 与资源之间的通信划分为三个主要部分:客户端、服务器和资源。

客户端负责发送请求给 MCP 服务器,服务器则将这些请求转发给相应的资源。这种分层的设计使得 MCP 协议能够更好地控制访问权限,确保只有经过授权的用户才能访问特定的资源。

以下是 MCP 的基本工作流程:

  • 初始化连接:客户端向服务器发送连接请求,建立通信通道。
  • 发送请求:客户端根据需求构建请求消息,并发送给服务器。
  • 处理请求:服务器接收到请求后,解析请求内容,执行相应的操作(如查询数据库、读取文件等)。
  • 返回结果:服务器将处理结果封装成响应消息,发送回客户端。
  • 断开连接:任务完成后,客户端可以主动关闭连接或等待服务器超时关闭。

MCP 核心架构

MCP 遵循客户端-服务器架构(client-server),其中包含以下几个核心概念:

  • MCP 主机(MCP Hosts):发起请求的 LLM 应用程序(例如 Claude Desktop、IDE 或 AI 工具)。
  • MCP 客户端(MCP Clients):在主机程序内部,与 MCP server 保持 1:1 的连接。
  • MCP 服务器(MCP Servers):为 MCP client 提供上下文、工具和 prompt 信息。
  • 本地资源(Local Resources):本地计算机中可供 MCP server 安全访问的资源(例如文件、数据库)。
  • 远程资源(Remote Resources):MCP server 可以连接到的远程资源(例如通过 API)。

共分为了下面五个部分:

  • MCP Hosts: Hosts 是指 LLM 启动连接的应用程序,像 Cursor, Claude Desktop、Cline 这样的应用程序。
  • MCP Clients: 客户端是用来在 Hosts 应用程序内维护与 Server 之间 1:1 连接。
  • MCP Servers: 通过标准化的协议,为 Client 端提供上下文、工具和提示。
  • Local Data Sources: 本地的文件、数据库和 API。
  • Remote Services: 外部的文件、数据库和 API。

整个 MCP 协议核心的在于 Server,因为 Host 和 Client 相信熟悉计算机网络的都不会陌生,非常好理解,但是 Server 如何理解呢?

看看 Cursor 的 AI Agent 发展过程,我们会发现整个 AI 自动化的过程发展会是从 Chat 到 Composer 再进化到完整的 AI Agent。

AI Chat 只是提供建议,如何将 AI 的 response 转化为行为和最终的结果,全部依靠人类,例如手动复制粘贴,或者进行某些修改。

AI Composer 是可以自动修改代码,但是需要人类参与和确认,并且无法做到除了修改代码之外的其它操作。

AI Agent 是一个完全的自动化程序,未来完全可以做到自动读取 Figma 的图片,自动生产代码,自动读取日志,自动调试代码,自动 push 代码到 GitHub。

而 MCP Server 就是为了实现 AI Agent 的自动化而存在的,它是一个中间层,告诉 AI Agent 目前存在哪些服务,哪些 API,哪些数据源,AI Agent 可以根据 Server 提供的信息来决定是否调用某个服务,然后通过 Function Calling 来执行函数。

MCP Client

MCP client 充当 LLM 和 MCP server 之间的桥梁,MCP client 的工作流程如下:

  • MCP client 首先从 MCP server 获取可用的工具列表。
  • 将用户的查询连同工具描述通过 function calling 一起发送给 LLM。
  • LLM 决定是否需要使用工具以及使用哪些工具。
  • 如果需要使用工具,MCP client 会通过 MCP server 执行相应的工具调用。
  • 工具调用的结果会被发送回 LLM。
  • LLM 基于所有信息生成自然语言响应。
  • 最后将响应展示给用户。

Claude Desktop 和Cursor都支持了MCP Server接入能力,它们就是作为 MCP client来连接某个MCP Server感知和实现调用。

MCP Server

MCP server 是 MCP 架构中的关键组件,它可以提供 3 种主要类型的功能:

  • 资源(Resources):类似文件的数据,可以被客户端读取,如 API 响应或文件内容。
  • 工具(Tools):可以被 LLM 调用的函数(需要用户批准)。
  • 提示(Prompts):预先编写的模板,帮助用户完成特定任务。

这些功能使 MCP server 能够为 AI 应用提供丰富的上下文信息和操作能力,从而增强 LLM 的实用性和灵活性。

你可以在 MCP Servers Repository 和 Awesome MCP Servers 这两个 repo 中找到许多由社区实现的 MCP server。使用 TypeScript 编写的 MCP server 可以通过 npx 命令来运行,使用 Python 编写的 MCP server 可以通过 uvx 命令来运行。

通信机制

MCP 协议支持两种主要的通信机制:基于标准输入输出的本地通信和基于SSEServer-Sent Events)的远程通信。

这两种机制都使用 JSON-RPC 2.0 格式进行消息传输,确保了通信的标准化和可扩展性。

  • 本地通信通过 stdio 传输数据,适用于在同一台机器上运行的客户端和服务器之间的通信。
  • 远程通信利用 SSE 与 HTTP 结合,实现跨网络的实时数据传输,适用于需要访问远程资源或分布式部署的场景。

二、MCP的功能与应用:

如何使用 MCP

如果你还没有尝试过如何使用 MCP 的话,我们可以考虑用 Cursor(本人只尝试过 Cursor),Claude Desktop 或者 Cline 来体验一下。

当然,我们并不需要自己开发 MCP Servers,MCP 的好处就是通用、标准,所以开发者并不需要重复造轮子(但是学习可以重复造轮子)。

首先推荐的是官方组织的一些 Server:官方的 MCP Server 列表

目前社区的 MCP Server 还是比较混乱,有很多缺少教程和文档,很多的代码功能也有问题,我们可以自行尝试一下 Cursor Directory 的一些例子,具体的配置和实战笔者就不细讲了,大家可以参考官方文档。

MCP的功能

MCP通过引入多样化的MCP Server能力,显著增强了AI工具的功能,例如我们常用的Cursor和Claude。以下是一些官方参考服务器,展示了MCP的核心功能和SDK的应用:

数据与文件系统:

文件系统:提供安全文件操作,带可配置的访问控制。

PostgreSQL:提供只读数据库访问,具备架构检查功能。

SQLite:支持数据库交互和商业智能功能。

Google Drive:实现Google Drive的文件访问和搜索功能。

开发工具:

Git:工具用于读取、搜索和操作Git仓库。

GitHub:集成仓库管理、文件操作和GitHub API。

GitLab:支持项目管理的GitLab API集成。

Sentry:从http://Sentry.io获取并分析问题。

网络与浏览器自动化:

Brave Search:利用Brave的搜索API进行网络和本地搜索。

Fetch:为LLM优化的网络内容获取和转换。

Puppeteer:提供浏览器自动化和网页抓取功能。

生产力和通信:

Slack:支持频道管理和消息功能。

Google Maps:提供位置服务、路线和地点详情。

Memory:基于知识图谱的持久记忆系统。

AI与专业工具:

EverArt:使用多种模型进行AI图像生成。

Sequential Thinking:通过思维序列进行动态问题解决。

AWS KB Retrieval:使用Bedrock Agent Runtime从AWS知识库检索。

官方集成工具:

这些MCP服务器由公司维护,用于其平台:

Axiom:使用自然语言查询和分析日志、跟踪和事件数据。

Browserbase:云端自动化浏览器交互。

Cloudflare:在Cloudflare开发者平台上部署和管理资源。

E2B:在安全的云沙箱中执行代码。

Neon:与Neon无服务器Postgres平台交互。

Obsidian Markdown Notes:读取和搜索Obsidian知识库中的Markdown笔记。

Qdrant:使用Qdrant向量搜索引擎实现语义记忆。

Raygun:访问崩溃报告和监控数据。

Search1API:统一的API用于搜索、爬虫和网站地图。

Tinybird:与Tinybird无服务器ClickHouse平台交互。

集成工具:

Docker:管理容器、镜像、卷和网络。

Kubernetes:管理pod、部署和服务。

Linear:项目管理和问题跟踪。

Snowflake:与Snowflake数据库交互。

Spotify:控制Spotify播放和管理播放列表。

Todoist:任务管理集成。

三、怎么使用和开发MCP Server

使用

目前支持的部分工具列表(更多见这里):

英文语音识别模型:Parakeet TDT 0.6B V2

https://huggingface.co/nvidia/parakeet-tdt-1.1b

parakeet-tdt-1.1b 是一个自动语音识别 (ASR) 模型,可将语音转录为小写英文字母。该模型由 NVIDIA NeMo 和 Suno.ai 团队联合开发。它是 FastConformer [1] TDT [2](约 11 亿个参数)模型的 XXL 版本。

英伟达在发布了一款开源语音识别模型:Parakeet TDT 0.6B V2,其以 600M 参数登顶 Hugging Face Open ASR 榜单。

平均词错误率(WER)仅 6.05%,超越所有主流闭源模型。它能在 1 秒内转录 60 分钟高质量音频。

基于 FastConformer 架构和 TDT 解码器,仅用 600M 参数实现超低 WER 和极快推理速度。该模型基于 NVIDIA NeMo 和 Suno 团队收集和准备的 64K 小时英语语音进行训练。

该模型采用 FastConformer-TDT 架构

FastConformer 是对传统 Conformer 模型的优化版本,采用了 8 倍深度可分离卷积下采样(8x depthwise-separable convolutional downsampling),以提高计算效率。

TDT(Token-and-Duration Transducer) 是对传统 Transducer 的一种泛化方式,它将 “音素(token)”与“持续时间(duration)”的预测过程解耦。与传统 Transducer 在推理阶段产生大量空白(blank)输出不同,TDT 模型可以通过持续时间预测跳过大多数 blank(例如本模型 parakeet-tdt-1.1b 最多可跳过 4 帧),从而大幅提升推理速度。关于 TDT 的详细内容,请参见文章:Efficient Sequence Transduction by Jointly Predicting Tokens and Durations。

The training dataset consists of private subset with 40K hours of English speech plus 24K hours from the following public datasets:

  • Librispeech 960 hours of English speech
  • Fisher Corpus
  • Switchboard-1 Dataset
  • WSJ-0 and WSJ-1
  • National Speech Corpus (Part 1, Part 6)
  • VCTK
  • VoxPopuli (EN)
  • Europarl-ASR (EN)
  • Multilingual Librispeech (MLS EN) – 2,000 hour subset
  • Mozilla Common Voice (v7.0)
  • People’s Speech – 12,000 hour subset

自动语音识别(ASR)模型的性能通常通过词错误率(Word Error Rate, WER)来衡量。由于该数据集在多个领域上进行了训练,并且包含了更大规模的语料库,因此在通用音频转写任务中通常表现更好。

下表总结了本集合中各可用模型在使用Transducer 解码器下的性能表现。所有 ASR 模型的性能均以贪婪解码(greedy decoding)方式计算的 词错误率(WER%) 进行报告。

模型TokenizerVocabulary SizeAMIEarnings-22Giga SpeechLS test-cleanSPGI SpeechTEDLIUM-v3Vox PopuliCommon Voice
指标SentencePiece Unigram102415.9014.659.551.392.623.423.565.48

核心优势

  • • 极致转录效率:60 分钟音频仅需 1 秒内完成转录(A100 推理)
  • • OpenASR 榜首表现:超越 Whisper、Conformer、Wav2Vec 等主流闭源模型
  • • 极小参数量:仅 0.6B(轻量级,适合边缘设备)
  • • 高精度:平均 WER 6.05%(Hugging Face Open ASR 榜单),优于 Whisper-large-v3
  • • 高鲁棒性:多语速、多口音、多录音环境下表现稳定(英文)

应用场景推荐

  • • 实时会议转写
  • • 手机/设备端语音助手
  • • 视频字幕生成
  • • 大模型音频输入预处理器
  • • 教育/课程转录系统

技术构建说明

  • • 架构:TDT(Time-Depth Transformer),专注于时间维度建模
  • • 数据:英伟达自建 + 公共语音数据集大规模训练
  • • 推理引擎优化:支持 TensorRT / ONNX Runtime 等高性能部署方案

LLM分词器-SentencePiece/tiktoken/subword-nmt

SentencePiece 简介

https://github.com/google/sentencepiece

SentencePiece 是一种无监督的文本 tokenizer 和 detokenizer,主要用于基于神经网络的文本生成系统,其中,词汇量在神经网络模型训练之前就已经预先确定了。 SentencePiece 实现了subword单元(例如,字节对编码 (BPE))和 unigram 语言模型),并可以直接从原始句子训练字词模型(subword model)。 这使得我们可以制作一个不依赖于特定语言的预处理和后处理的纯粹的端到端系统。

SentencePiece 在大模型领域主要用于文本的 分词 和 编码

分词 是将文本分割成一个个独立的词语或符号。传统的中文分词方法,例如 BMM 分词、HMM 分词,都是基于规则的,需要人工制定分词规则。而 SentencePiece 则是基于 无监督学习 的,它可以自动学习文本的语义和结构,并根据学习结果进行分词。

编码 是将分词后的词语或符号转换为数字形式,以便计算机能够处理。SentencePiece 使用了一种称为 字节对编码 的方法,它可以将每个词语或符号编码成一个或多个字节。字节对编码的优点是能够有效地利用空间,并且可以将词语或符号之间的关系编码到编码中。

SentencePiece 在大模型领域具有以下优势:

  • 分词效果好,能够准确地识别词语和符号的边界。
  • 编码效率高,能够节省空间。
  • 能够将词语或符号之间的关系编码到编码中,有利于模型学习。

因此,SentencePiece 已经被广泛应用于各大模型,例如 Google 的 BERTGPT-3,以及阿里巴巴的 M6 等。

简单来说,SentencePiece 就是大模型领域的一个 分词和编码工具。它可以帮助大模型更好地理解和处理文本。

自监督训练原理

SentencePiece 的自监督训练模型原理是通过 无监督学习 的方式,学习文本的语义和结构,并根据学习结果进行分词和编码。

具体来说,SentencePiece 的训练过程可以分为以下几个步骤:

  1. 数据准备:首先需要准备一个文本语料库,语料库中的文本可以是任何类型,例如新闻文章、书籍、代码等。
  2. 模型训练:使用无监督学习算法训练 SentencePiece 模型,模型的输入是文本语料库,输出是分词后的文本。
  3. 模型评估:使用评估指标评估模型的性能,例如分词准确率、召回率等。

SentencePiece 使用的无监督学习算法是一种称为 Masked Language Modeling (MLM) 的算法。MLM 的基本思想是:将文本中的部分词语或符号进行遮蔽,然后让模型预测被遮蔽的词语或符号。通过这种方式,模型可以学习文本的语义和结构。

在 SentencePiece 中,MLM 的具体实现如下:

  1. 随机选择文本中的部分词语或符号进行遮蔽。
  2. 将被遮蔽的词语或符号替换为一个特殊符号,例如 [MASK]
  3. 将处理后的文本输入模型,让模型预测被遮蔽的词语或符号。

通过这种方式,模型可以学习到被遮蔽词语或符号与周围词语或符号之间的关系,从而提高分词和编码的准确性。

SentencePiece 的自监督训练模型具有以下优势:

  • 不需要人工制定分词规则,能够自动学习文本的语义和结构。
  • 分词效果好,能够准确地识别词语和符号的边界。
  • 编码效率高,能够节省空间。

SentencePiece 的自监督训练模型已经被广泛应用于各大模型,例如 Google 的 BERT、GPT-3,以及阿里巴巴的 M6 等。

SentencePiece中包含有四个部分:

  • Normalizer: 规一化操作,类似Unicode把字符转为统一格式。
  • Trainer: 从规一化后的语料中学习subword的切分模型。
  • Encoder: 对应预处理时的tokenization操作,把句子转为对应的subword或id。
  • Decoder: 对应后处理时的detokenization操作,把subword或id还原为原有句子

和 SentencePiece 类似的工具

  • Jieba:Jieba 是一个中文分词工具,它使用了一种称为 最大似然法 的方法进行分词。Jieba 的分词效果较好,并且速度较快。
  • Hmmseg:Hmmseg 是另一个中文分词工具,它使用了一种称为 隐马尔可夫模型 的方法进行分词。Hmmseg 的分词效果较好,并且可以支持多种语言。
  • Stanford CoreNLP:Stanford CoreNLP 是一个自然语言处理工具包,它包含了分词、词性标注、句法分析等功能。Stanford CoreNLP 的分词效果较好,并且可以支持多种语言。

使用建议:

  • 如果需要对中文文本进行分词,并且对分词效果要求较高,可以选择 SentencePiece、Jieba 或 Hmmseg。
  • 如果需要对多种语言文本进行分词,可以选择 Stanford CoreNLP。
  • 如果需要对文本进行分词和编码,并且对速度要求较高,可以选择 Jieba。
  • 如果需要对文本进行分词和编码,并且对分词效果要求较高,可以选择 SentencePiece 或 Hmmseg。

TiToken 简介

Tiktoken 的功能与 SentencePiece 类似,都是用于文本的 分词 和 编码

Tiktoken 是一个基于 BPE 算法的 快速分词器,它专门针对 GPT-4 和 ChatGPT 等大模型进行了优化。Tiktoken 的主要特点如下:

  • 速度快:Tiktoken 的分词速度比 SentencePiece 快很多,可以满足大模型训练和推理的需求。
  • 效果好:Tiktoken 的分词效果与 SentencePiece 相当,能够准确地识别词语和符号的边界。
  • 易用性:Tiktoken 提供了简单的 API 接口,方便使用。

Tiktoken 与 SentencePiece 的主要区别 如下:

  • 分词算法:Tiktoken 使用 BPE 算法进行分词,而 SentencePiece 使用的是无监督学习算法
  • 速度:Tiktoken 的分词速度比 SentencePiece 快很多。
  • 模型:Tiktoken 专门针对 GPT-4 和 ChatGPT 等大模型进行了优化,而 SentencePiece 则是通用的。

具体使用建议:

  • 如果需要对文本进行快速分词,并且对分词效果要求较高,可以选择 Tiktoken。
  • 如果需要对文本进行分词和编码,并且需要支持多种语言,可以选择 SentencePiece。
  • 如果需要对 GPT-4 或 ChatGPT 等大模型进行训练或推理,可以选择 Tiktoken。

LLM分词算法

分词算法有BPE(Byte Pair Encoding,BPE )、BBPE(Byte-level BPE)、WordPiece、ULM【Unigram Language Model】等。

Byte Pair Encoding (BPE)

BPE最早是一种数据压缩算法,由Sennrich等人于2015年引入到NLP领域并很快得到推广。该算法简单有效,因而目前它是最流行的方法。GPT-2和RoBERTa使用的Subword算法都是BPE。

BPE获得Subword的步骤如下:

  1. 准备足够大的训练语料,并确定期望的Subword词表大小;
  2. 将单词拆分为成最小单元。比如英文中26个字母加上各种符号,这些作为初始词表;
  3. 在语料上统计单词内相邻单元对的频数,选取频数最高的单元对合并成新的Subword单元;
  4. 重复第3步直到达到第1步设定的Subword词表大小或下一个最高频数为1.

Byte-level BPE

Unicode: Unicode 是一种字符集,旨在涵盖地球上几乎所有的书写系统和字符。它为每个字符分配了一个唯一的代码点(code point)用于标识字符。Unicode 不关注字符在计算机内部的具体表示方式,而只是提供了一种字符到代码点的映射。Unicode 的出现解决了字符集的碎片化问题,使得不同的语言和字符能够在一个共同的标准下共存。然而,Unicode 并没有规定如何在计算机内存中存储和传输这些字符。

UTF-8: UTF-8(Unicode Transformation Format-8)是一种变长的字符编码方案,它将 Unicode 中的代码点转换为字节序列。UTF-8 的一个重要特点是它是向后兼容 ASCII 的,这意味着标准的 ASCII 字符在 UTF-8 中使用相同的字节表示,从而确保现有的 ASCII 文本可以无缝地与 UTF-8 共存。在 UTF-8 编码中,字符的表示长度可以是1到4个字节,不同范围的 Unicode 代码点使用不同长度的字节序列表示,这样可以高效地表示整个 Unicode 字符集。UTF-8 的编码规则是:

  • 单字节字符(ASCII 范围内的字符)使用一个字节表示,保持与 ASCII 编码的兼容性。
  • 带有更高代码点的字符使用多个字节表示。UTF-8 使用特定的字节序列来指示一个字符所需的字节数,以及字符的实际数据。

例如,英文字母 “A” 的 Unicode 代码点是U+0041,在 UTF-8 中表示为 0x41(与 ASCII 编码相同);而中文汉字 “你” 的 Unicode 代码点是U+4F60,在 UTF-8 中表示为0xE4 0xBD 0xA0三个字节的序列。

所以简单的来说:

  • Unicode 是字符集,为每个字符分配唯一的代码点。
  • UTF-8 是一种基于 Unicode 的字符编码方式,用于在计算机中存储和传输字符。

Byte(字节):计算机存储和数据处理时,字节是最小的单位。一个字节包含8个(Bit)二进制位,每个位可以是0或1,每位的不同排列和组合可以表示不同的数据,所以一个字节能表示的范围是256个。

BBPE核心思想将BPE的从字符级别扩展到子节(Byte)级别。BPE的一个问题是如果遇到了unicode编码,基本字符集可能会很大。BBPE就是以一个字节一种“字符”,不管实际字符集用了几个字节来表示一个字符。这样的话,基础字符集的大小就锁定在了256(2^8)。采用BBPE的好处是可以跨语言共用词表,显著压缩词表的大小。而坏处就是,对于类似中文这样的语言,一段文字的序列长度会显著增长。因此,BBPE based模型可能比BPE based模型表现的更好。然而,BBPE sequence比起BPE来说略长,这也导致了更长的训练/推理时间。BBPE其实与BPE在实现上并无大的不同,只不过基础词表使用256的字节集

Byte-level BPE(BBPE)和Byte-Pair Encoding (BPE)区别就是BPE是最小词汇是字符级别,而BBPE是字节级别的,通过UTF-8的编码方式这一个字节的256的范围理论上可以表示这个世界上的所有字符。

所以实现的步骤和BPE就是实现的粒度不一样,其他的都是一样的。

  1. 初始词表:构建初始词表,包含一个字节的所有表示(256)
  2. 构建频率统计:统计所有子词单元对(两个连续的子词)在文本中的出现频率。
  3. 合并频率最高的子词对:选择出现频率最高的子词对,将它们合并成一个新的子词单元,并更新词汇表。
  4. 重复合并步骤:不断重复步骤 2 和步骤 3,直到达到预定的词汇表大小、合并次数,或者直到不再有有意义的合并(即,进一步合并不会显著提高词汇表的效益)。
  5. 分词:使用最终得到的词汇表对文本进行分词。

大模型中,以Byte-level BPE(BBPE)这种方式进行分词是不会出现OOV

WordPiece

WordPiece算法与 BPE(Byte-Pair Encoding)都是子词分词算法,但它们在合并策略上存在关键区别。WordPiece的主要目标是通过最大化训练数据的似然(likelihood),即在每次迭代中,选择能最大化训练数据似然增益的子词对(subword pair)进行合并。

Google的Bert模型在分词的时候使用的是WordPiece算法。与BPE算法类似,WordPiece算法也是每次从词表中选出两个子词合并成新的子词。与BPE的最大区别在于,如何选择两个子词进行合并:BPE选择频数最高的相邻子词合并,而WordPiece选择能够提升语言模型概率最大的相邻子词加入词表。

看到这里,你可能不清楚WordPiece是如何选取子词的。这里,通过形式化方法,能够清楚地理解WordPiece在合并这一步是如何作出选择的。假设句子S=(t1,t2,…,tn)由n个子词组成,ti表示子词,且假设各个子词之间是独立存在的,则句子S的语言模型似然值等价于所有子词概率的乘积:

假设把相邻位置的x和y两个子词进行合并,合并后产生的子词记为z,此时句子S似然值的变化可表示为:

从上面的公式,很容易发现,似然值的变化就是两个子词之间的互信息。简而言之,WordPiece每次选择合并的两个子词,他们具有最大的互信息值,也就是两子词在语言模型上具有较强的关联性,它们经常在语料中以相邻方式同时出现。

算法流程如下:

  1. 准备足够大的训练语料
  2. 确定期望的subword词表大小
  3. 将单词拆分成字符序列
  4. 基于第3步数据训练语言模型
  5. 从所有可能的subword单元中选择加入语言模型后能最大程度地增加训练数据概率的单元作为新的单元
  6. 重复第5步直到达到第2步设定的subword词表大小或概率增量低于某一阈值

Unigram Language Model (ULM)

与WordPiece一样,Unigram Language Model(ULM)同样使用语言模型来挑选子词。不同之处在于,BPE和WordPiece算法的词表大小都是从小到大变化,属于增量法。Unigram Language Model则是减量法,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。ULM算法考虑了句子的不同分词可能,因而能够输出带概率的多个子词分段。

我们接下来看看ULM是如何操作的。

对于句子S,x→=(x1,x2,…,xm)为句子的一个分词结果,由m个子词组成。所以,当前分词下句子S的似然值可以表示为:

对于句子S,挑选似然值最大的作为分词结果,则可以表示为

这里U(x)包含了句子的所有分词结果。在实际应用中,词表大小有上万个,直接罗列所有可能的分词组合不具有操作性。针对这个问题,可通过维特比算法得到x∗来解决。

那怎么求解每个子词的概率P(xi)呢?ULM通过EM算法来估计。假设当前词表V, 则M步最大化的对象是如下似然函数:

其中,|D|是语料库中语料数量。上述公式的一个直观理解是,将语料库中所有句子的所有分词组合形成的概率相加。

但是,初始时,词表V并不存在。因而,ULM算法采用不断迭代的方法来构造词表以及求解分词概率:

  1. 初始时,建立一个足够大的词表。一般,可用语料中的所有字符加上常见的子字符串初始化词表,也可以通过BPE算法初始化。
  2. 针对当前词表,用EM算法求解每个子词在语料上的概率。
  3. 对于每个子词,计算当该子词被从词表中移除时,总的loss降低了多少,记为该子词的loss。
  4. 将子词按照loss大小进行排序,丢弃一定比例loss最小的子词(比如20%),保留下来的子词生成新的词表。这里需要注意的是,单字符不能被丢弃,这是为了避免OOV情况。
  5. 重复步骤2到4,直到词表大小减少到设定范围。

可以看出,ULM会保留那些以较高频率出现在很多句子的分词结果中的子词,因为这些子词如果被丢弃,其损失会很大。

算法

  1. 准备足够大的训练语料
  2. 确定期望的subword词表大小
  3. 给定词序列优化下一个词出现的概率
  4. 计算每个subword的损失
  5. 基于损失对subword排序并保留前X%。为了避免OOV,建议保留字符级的单元
  6. 重复第3至第5步直到达到第2步设定的subword词表大小或第5步的结果不再变化

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)在印尼语和越南语上,我们的系统与现有的基线模型相比表现出具有竞争力的性能。

中文NLP资源库

https://github.com/fighting41love/funNLP

在入门到熟悉NLP的过程中,用到了很多github上的包,遂整理了一下,分享在这里。

很多包非常有趣,值得收藏,满足大家的收集癖! 如果觉得有用,请分享并star:star:,谢谢!

长期不定时更新,欢迎watch和fork!:heart::heart::heart:

🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥                  
类ChatGPT的模型评测对比
类ChatGPT的资料
类ChatGPT的开源框架
LLM的训练_推理_低资源_高效训练
提示工程
类ChatGPT的文档问答
类ChatGPT的行业应用
类ChatGPT的课程资料
LLM的安全问题
多模态LLM
LLM的数据集
🍆 🍒 🍐 🍊                  🌻 🍓 🍈 🍅 🍍                    
语料库
词库及词法工具
预训练语言模型
抽取
知识图谱
文本生成
文本摘要
智能问答
文本纠错
文档处理
表格处理
文本匹配
文本数据增强
文本检索
阅读理解
情感分析
常用正则表达式
语音处理
常用正则表达式
事件抽取
机器翻译
数字转换
指代消解
文本聚类
文本分类
知识推理
可解释NLP
文本对抗攻击
文本可视化
文本标注工具
综合工具
有趣搞笑工具
课程报告面试等
比赛
金融NLP
医疗NLP
法律NLP
文本生成图像
其他