MOSS-Transcribe-Diarize 0.9B

September 2, 2026 · View on GitHub


    

Peak #11 Python Repository of the Day on Trendshift

中文 | English

MOSS-Transcribe-Diarize 0.9B 是一个开源的 SOTA 端到端音频理解模型,面向长时、多说话人场景,支持语音转写、说话人分离(diarization)、时间戳标注以及声学事件感知。MOSS-Transcribe-Diarize Pro 是性能更强的版本,整体表现更优,现已可通过在线 Playground 使用。

MOSS-Transcribe-Diarize 0.9B 支持 50+ 种语言。

最新动态

  • 2026-07-22:字幕 Web 界面现已支持简体中文和英文。
  • 2026-07-14:🏆 MOSS-Transcribe-Diarize 在 INTERSPEECH 2026 第二届 MLC-SLM Challenge 中夺得第一名,覆盖 14 种语言。
  • 2026-07-09:开源 MOSS-Transcribe-Diarize 0.9B。

目录

简介

MOSS-Transcribe-Diarize 是我们的旗舰级 SOTA 模型系列,能够一次性将真实世界的长音频转换为结构化、带说话人标注的转写结果。它不再依赖将独立的 ASR 与说话人分离系统拼接起来的方案,而是联合完成语音转写与说话人分离,直接输出带精确时间戳、说话人标签(如 [S01][S02] 等)一致的时间对齐文本。

MOSS-Transcribe-Diarize 面向会议、通话、播客、访谈、讲座和视频内容而设计,能够可靠地处理长时、嘈杂、多说话人的录音。它还可以选择性地输出声学事件标注,让下游系统更全面地理解“发生了什么、谁在说话、何时说话”。

模型接收原始音频,输出紧凑的带时间戳转写文本。标准输出格式为:

[start_time][Sxx]transcribed speech[end_time]

时间戳以秒为单位,相邻片段会拼接成单条连续序列,例如:

[0.48][S01]Welcome everyone[1.66][12.26][S02]The new transcription pipeline is ready for evaluation[13.81][14.36][S01]Great, include the diarization results in the report[18.76]

模型架构

MOSS-Transcribe-Diarize model architecture

组件规格说明
文本主干Qwen3-0.6B 风格的因果解码器(causal decoder)
音频编码器Whisper-Medium encoder 配置
音频前端WhisperFeatureExtractor,16 kHz,80 个 mel 频带,30 秒分块
音频-文本桥接4 倍时间维度合并(temporal merge)+ MLP 适配器
特征融合音频特征通过 masked_scatter 替换 <|audio_pad|> 的 embedding
输出格式紧凑的 [start][Sxx]text[end] 转写文本,含 [S01] 等说话人标签

评测

客观评测

我们使用三个客观指标评测 MOSS-Transcribe-Diarize:字符错误率(CER)、拼接后最小排列字符错误率(cpCER)以及 Δcp。所有指标均为越低越好。最优结果以加粗表示,次优结果以下划线表示。短横线(-)表示该结果不可用。

Model AISHELL‑4 Alimeeting Podcast Movies
CER↓cpCER↓Δcp↓ CER↓cpCER↓Δcp↓ CER↓cpCER↓Δcp↓ CER↓cpCER↓Δcp↓
Doubao 18.1827.869.68 25.2537.5712.31 7.9310.542.61 9.9430.8820.94
ElevenLabs 19.5837.9518.36 25.7036.6910.99 8.5011.342.85 11.4917.856.37
GPT-4o --- --- --- 14.3723.679.31
Gemini 2.5 Pro 42.7053.4210.72 27.4341.6414.21 7.3810.232.85 15.4624.158.69
Gemini 3 Pro 22.7527.434.68 26.7532.846.09 --- 8.6214.736.11
VIBEVOICE ASR 21.4024.993.59 27.4029.331.93 27.9448.3020.36 14.5942.5427.94
MOSS Transcribe Diarize 0.9B 14.8415.830.99 24.8622.17-2.69 5.977.371.40 6.3612.766.40
MOSS Transcribe Diarize Pro 13.7814.020.24 18.2213.94-4.27 4.466.972.51 5.8611.785.92

快速开始

环境准备

请使用干净的 Python 环境。本项目在 Python 3.12 与 Transformers 5.x 上测试通过。

git clone https://github.com/OpenMOSS/MOSS-Transcribe-Diarize.git
cd MOSS-Transcribe-Diarize
uv venv --python 3.12 .venv
source .venv/bin/activate
uv pip install -e ".[torch-runtime]" --torch-backend=auto

在 CUDA GPU 上可加装可选的 flash-attn,以获得更快的 attention kernel:

uv pip install flash-attn

微调说明请参阅 FINETUNING.md

Python 用法

import torch
from transformers import AutoModelForCausalLM, AutoProcessor

from moss_transcribe_diarize import parse_transcript
from moss_transcribe_diarize.inference_utils import (
    build_transcription_messages,
    generate_transcription,
    resolve_device,
)

model_id = "OpenMOSS-Team/MOSS-Transcribe-Diarize"
audio_path = "audio.wav"

device = resolve_device("auto")
dtype = torch.bfloat16 if device.type == "cuda" else torch.float32

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    trust_remote_code=True,
    dtype="auto",
    attn_implementation="sdpa",  # 安装了 flash-attn 包则改用 "flash_attention_2"
).to(dtype=dtype).to(device).eval()
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True)

messages = build_transcription_messages(audio_path)
result = generate_transcription(
    model,
    processor,
    messages,
    max_new_tokens=2048,
    do_sample=False,
    device=device,
    dtype=dtype,
)

print(result["text"])

for segment in parse_transcript(result["text"]):
    print(segment.start, segment.end, segment.speaker, segment.text)

安装了 flash-attn 包时可将 sdpa 改为 flash_attention_2eager 仅作最后兜底,长音频下会因平方级的显存占用而 OOM。CLI 和 Web App 里的加载器会自动按此优先级选择 backend。

消息流程遵循常见的 Qwen 多模态范式。对话模板由 AutoProcessor 从模型侧加载:

  1. processor.apply_chat_template(messages, tokenize=False) 渲染文本并插入音频占位符。
  2. process_audio_info(messages, sampling_rate) 从同一份 messages 中加载音频波形。
  3. processor(text=text, audio=audios) 计算 Whisper 输入特征并展开音频占位符。
  4. model.generate(...) 生成带时间戳的转写与说话人分离文本。

使用 SGLang Omni 部署

SGLang Omni 是 MOSS-Transcribe-Diarize 推荐的部署后端,通过兼容 OpenAI 的 /v1/audio/transcriptions 接口,为长音频提供经过优化的推理能力。

SGLang Omni 目前面向 CUDA 13 环境。请参考官方安装指南完成受支持的配置。若为 CUDA 12 环境,也可使用下文的 vLLM 方案。

下载模型:

hf download OpenMOSS-Team/MOSS-Transcribe-Diarize

启动服务:

sgl-omni serve \
  --model-path OpenMOSS-Team/MOSS-Transcribe-Diarize \
  --port 8000 \
  --max-running-requests 16 \
  --cuda-graph-max-bs 16 \
  --mem-fraction-static 0.80

当你需要解析后的说话人分段时,请使用 response_format=verbose_jsonjson 仅返回原始转写文本。

curl -X POST http://localhost:8000/v1/audio/transcriptions \
  -F model=OpenMOSS-Team/MOSS-Transcribe-Diarize \
  -F file=@audio.wav \
  -F response_format=verbose_json
import requests

with open("audio.wav", "rb") as f:
    resp = requests.post(
        "http://localhost:8000/v1/audio/transcriptions",
        data={
            "model": "OpenMOSS-Team/MOSS-Transcribe-Diarize",
            "response_format": "verbose_json",
        },
        files={"file": ("audio.wav", f, "audio/wav")},
        timeout=300,
    )

resp.raise_for_status()
payload = resp.json()
print(payload["text"])
for segment in payload.get("segments", []):
    print(f"[{segment['start']:.2f}-{segment['end']:.2f}] {segment['text']}")

对于更长的多说话人音频,请调大 max_new_tokens,以便解码器完整生成整段分离后的转写:

curl -X POST http://localhost:8000/v1/audio/transcriptions \
  -F model=OpenMOSS-Team/MOSS-Transcribe-Diarize \
  -F file=@audio.wav \
  -F response_format=verbose_json \
  -F max_new_tokens=65536
参数类型默认值说明
filefile必填以 multipart form data 上传的音频文件
modelstring服务端默认模型标识符
languagestring未设置可选的语言提示
response_formatstringjsonjsonverbose_jsontext
temperaturefloat模型默认(0.0采样温度
max_new_tokensint5120最大生成 token 数;长音频请调大,例如 65536
promptstring未设置可选的指令覆盖;留空则使用内置的转写+分离 prompt

关于基准测试、性能数据与实现细节,请参阅 SGLang Omni cookbook。下列结果基于单张 H100,分别针对短序列与长序列的多说话人 ASR 任务。

movies 短序列 ASR:

并发数吞吐(req/s)平均延迟(s)RTF 均值audio_s/s
12.570.3880.061229.76
24.890.4090.065956.55
46.620.5130.079076.64
86.800.5330.081078.70
167.080.6590.092281.98

aishell4_long 长序列 ASR:

并发数吞吐(req/s)平均延迟(s)RTF 均值audio_s/s
10.02245.20.019750.64
20.03260.70.026574.25
40.036105.60.046181.64
80.040172.60.075490.62
160.043282.80.123798.83

使用 vLLM 部署

MOSS-Transcribe-Diarize 通过兼容 OpenAI 的转写 API 支持 vLLM 部署。请使用已包含 MOSS-Transcribe-Diarize 模型注册的固定版 vLLM nightly 构建。从下列命令中任选其一:CUDA 12 环境使用 cu129,CUDA 13 环境使用 cu130

uv pip install -U vllm \
  --torch-backend=auto \
  --extra-index-url https://wheels.vllm.ai/68b4a1d582818e67adc903bf1b8fc5a5447da2fa/cu129

或:

uv pip install -U vllm \
  --torch-backend=auto \
  --extra-index-url https://wheels.vllm.ai/68b4a1d582818e67adc903bf1b8fc5a5447da2fa/cu130
vllm serve OpenMOSS-Team/MOSS-Transcribe-Diarize --trust-remote-code
curl http://localhost:8000/v1/audio/transcriptions \
  -F model="OpenMOSS-Team/MOSS-Transcribe-Diarize" \
  -F file=@"audio.wav" \
  -F response_format="json" \
  -F temperature="0"

接入 FunASR 生态

FunASR 为这个 OpenMOSS 第三方模型维护了面向生产的部署指南,覆盖 vLLM、SGLang Omni 与 Transformers。MOSS-Transcribe-Diarize 可在一次推理中同时生成转写、时间戳和说话人标签,因此应用侧无需再外挂独立的 VAD 或说话人分离模型。

FunASR 1.4.12 及以上版本可连接已有的 vLLM 服务,并将官方说话人分段响应统一为 sentence_info

pip install "funasr>=1.4.12"
from funasr import AutoModel

model = AutoModel(
    model="OpenMOSS-Team/MOSS-Transcribe-Diarize",
    backend="vllm",
    vllm_base_url="http://127.0.0.1:8898/v1",
    vllm_model="moss-transcribe-diarize",
    vllm_response_format="diarized_json",
    disable_update=True,
)
result = model.generate("audio.wav", max_completion_tokens=8192)[0]
for segment in result["sentence_info"]:
    print(segment["start"], segment["end"], segment["spk"], segment["text"])

该指南固定了模型与服务端版本,分别说明各后端的响应契约,并提供了在 H100 上验证过的 vLLM 冒烟测试;同时明确哪些部署问题由 FunASR 生态承接,哪些模型或权重问题应在本仓库反馈:

MOSS-Transcribe-Diarize 仍是 OpenMOSS 基于 Apache-2.0 发布的模型;FunASR 提供的是生态部署入口,不代表模型归属发生变化。

自定义 Prompt 与热词

默认 prompt 针对带时间戳的转写与说话人分离进行了优化:

请将音频转写为文本,每一段需以起始时间戳和说话人编号([S01]、[S02]、[S03]…)开头,正文为对应的语音内容,并在段末标注结束时间戳,以清晰标明该段语音范围。

若要添加热词,只需在默认 prompt 后追加简短提示:

请将音频转写为文本,每一段需以起始时间戳和说话人编号([S01]、[S02]、[S03]…)开头,正文为对应的语音内容,并在段末标注结束时间戳,以清晰标明该段语音范围。热词提示:热词1, 热词2, 热词3

更多 prompt 用例见 examples/prompts.md。同一个 prompt 可传入 build_transcription_messagesmtd-subtitlemtd-subtitle-web

字幕 Web 应用

本工具包还内置了一个本地字幕工作流,支持上传、审阅、字幕导出,以及可选的 FFmpeg 压制(burn-in):

mtd-subtitle-web \
  --model OpenMOSS-Team/MOSS-Transcribe-Diarize \
  --host 127.0.0.1 \
  --port 7860

打开 http://127.0.0.1:7860,上传音频/视频文件,审阅解析出的字幕分段,然后下载 JSON/SRT/ASS;若 PATH 中存在 ffmpegffprobe,还可压制生成 MP4。 Web 界面支持简体中文和英文。首次使用时会跟随浏览器语言,也可通过页头的语言选择器即时切换并记住选择。

批量处理:

mtd-subtitle /path/to/input.mp4 \
  --model OpenMOSS-Team/MOSS-Transcribe-Diarize \
  --out-dir runs/example \
  --render

引用

如果你使用了 MOSS-Transcribe-Diarize,请引用我们的技术报告:

@misc{moss_transcribe_diarize_2026,
  title={MOSS Transcribe Diarize Technical Report},
  author={{MOSI.AI}},
  year={2026},
  eprint={2601.01554},
  archivePrefix={arXiv},
  primaryClass={cs.SD},
  url={https://arxiv.org/abs/2601.01554}
}

Star 趋势

Star History Chart