部署合同

MOSS 统一转写与说话人分离

通过 FunASR AutoModel 或 OpenAI 兼容服务接入 OpenMOSS 发布的第三方 Apache-2.0 模型,一次生成长音频转写、时间戳和说话人标签。

成熟度
社区验证
FunASR
AutoModel HF + vLLM + SGLang adapters and OpenAI HTTP service; third-party model@e8681d68
运行时
Transformers 5.16.0.dev0 + Torch 2.11.0+cu130 and vLLM 0.27.1 + Torch 2.13.0+cu129 / H100 80GB
验证日期
2026-09-01

适用边界

先判断它是否适合你的生产约束

适合

  • 会议、访谈、播客和通话的多人长音频
  • 希望通过同一个模型输出文本、时间戳与说话人编号
  • 已有 NVIDIA GPU,并需要 vLLM 或 SGLang Omni 的 OpenAI 兼容音频转写接口
  • 通过 LocalAI / moss-transcribe.cpp 在 CPU 或桌面边缘 GPU 上运行第三方 GGUF 实现

不适合

  • 实时流式字幕或低延迟端点检测
  • 要求 FunASR AutoModel 与 LocalAI C++ 路径输出完全相同结果的部署
  • 未经目标硬件复测的原生 Windows 部署
  • 要求 FunASR 自有模型权重的项目
模型OpenMOSS-Team/MOSS-Transcribe-Diarize (third-party Apache-2.0 model)
硬件cpu / nvidia-gpu / desktop-edge-gpu / kubernetes
操作系统Linux
接口OpenAI-compatible HTTP / vLLM / SGLang Omni / Transformers / LocalAI / moss-transcribe.cpp

运行路径

从安装到已知音频验证

以下命令来自当前验证清单;上线前固定依赖、模型和硬件。

FunASR OpenAI 兼容服务

直接使用内置 funasr-server 加载固定 revision 的 HF 后端,返回带匿名说话人标签的 verbose_json;可使用专用 Docker Compose 与 Kubernetes GPU 配方。

验证口径: Transformers 5.16.0.dev0 / Torch 2.11.0+cu130 / H100 80GB; real HTTP response verified 2026-09-01

安装

python -m pip install 'transformers>=5.6,<6' fastapi uvicorn python-multipart

启动

funasr-server --model moss-transcribe-diarize --device cuda:0 --port 8000
docker compose -f examples/openai_api/docker-compose.moss.yml up --build

健康检查

curl -fsS http://127.0.0.1:8000/health
curl -fsS http://127.0.0.1:8000/v1/models

Smoke test

curl -fsS http://127.0.0.1:8000/v1/audio/transcriptions -F file=@runtime/llama.cpp/tests/sample.wav -F model=moss-transcribe-diarize -F response_format=verbose_json | tee /tmp/funasr-moss-transcription.json
python - <<'PY'
import json

with open('/tmp/funasr-moss-transcription.json', encoding='utf-8') as stream:
    payload = json.load(stream)
segments = payload.get('segments', [])
assert payload.get('text', '').strip() and segments, payload
assert all(item.get('speaker') and item.get('start') <= item.get('end') for item in segments), payload
print(payload['text'], sorted({item['speaker'] for item in segments}))
PY

vLLM + FunASR AutoModel

使用已验证的 vLLM 0.27.1 OpenAI 音频接口,并通过 FunASR AutoModel 映射 diarized_json 为统一结构化结果。

验证口径: vLLM 0.27.1 / Torch 2.13.0+cu129 / H100 80GB; FunASR adapter verified

安装

uv venv --python 3.12 .venv-moss && curl -fL https://github.com/vllm-project/vllm/releases/download/v0.27.1/vllm-0.27.1%2Bcu129-cp38-abi3-manylinux_2_28_x86_64.whl -o vllm-0.27.1+cu129-cp38-abi3-manylinux_2_28_x86_64.whl && echo 'bf0d52faa2a51e7a01c6856a7a8a2d1307fd0ff711415d34168a67ffac0fa47b  vllm-0.27.1+cu129-cp38-abi3-manylinux_2_28_x86_64.whl' | sha256sum -c - && uv pip install --python .venv-moss/bin/python --torch-backend=auto "vllm[audio] @ file://$PWD/vllm-0.27.1+cu129-cp38-abi3-manylinux_2_28_x86_64.whl"
HF_HUB_ENABLE_HF_TRANSFER=1 hf download OpenMOSS-Team/MOSS-Transcribe-Diarize --revision e8681d68e7042738ffca8ac8212bc8fcb1131ab8 --local-dir .models/moss-transcribe-diarize

启动

CUDA_VISIBLE_DEVICES=0 .venv-moss/bin/vllm serve OpenMOSS-Team/MOSS-Transcribe-Diarize --revision e8681d68e7042738ffca8ac8212bc8fcb1131ab8 --served-model-name moss-transcribe-diarize --trust-remote-code --host 127.0.0.1 --port 8898

健康检查

curl -fsS http://127.0.0.1:8898/health
curl -fsS http://127.0.0.1:8898/v1/models

Smoke test

curl -fsS http://127.0.0.1:8898/v1/audio/transcriptions -F file=@runtime/llama.cpp/tests/sample.wav -F model=moss-transcribe-diarize -F response_format=diarized_json -F temperature=0 | tee /tmp/moss-transcription.json
python - <<'PY'
import json

with open('/tmp/moss-transcription.json', encoding='utf-8') as stream:
    payload = json.load(stream)
text = payload.get('text', '')
segments = payload.get('segments', [])
assert text.strip() and segments, payload
assert all(isinstance(item.get('speaker'), str) and item.get('text') and item.get('start') <= item.get('end') for item in segments), payload
print(text, sorted({item['speaker'] for item in segments}))
PY
python - <<'PY'
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('runtime/llama.cpp/tests/sample.wav')[0]
assert result['raw_text'] and result['sentence_info'], result
print(result['text'])
print(result['sentence_info'])
PY

SGLang Omni + FunASR AutoModel

使用已合并的原生 MOSS pipeline 和 OpenAI-compatible verbose_json 接口,并通过 FunASR AutoModel 校验 [Sxx] 前缀、统一为 sentence_info。

验证口径: SGLang Omni 3f819f9c / FunASR adapter contract-tested / #914 H100 upstream benchmark

安装

git clone https://github.com/sgl-project/sglang-omni.git && cd sglang-omni && git checkout 3f819f9cdae3d4eeec22f73306c9067a1ec2542e && uv venv .venv -p 3.12 && uv pip install --python .venv/bin/python -v -e .
HF_HUB_ENABLE_HF_TRANSFER=1 hf download OpenMOSS-Team/MOSS-Transcribe-Diarize --revision e8681d68e7042738ffca8ac8212bc8fcb1131ab8 --local-dir .models/moss-transcribe-diarize
curl -fsSL https://raw.githubusercontent.com/modelscope/FunASR/8d65a38a8f4f3b5301be72905096219dde443f73/runtime/llama.cpp/tests/sample.wav -o moss-sample.wav && echo 'ea03e1f473ad1618a03da3327a545369cb8f6f06cb0f4115535e5a866167d47e  moss-sample.wav' | sha256sum -c -

启动

CUDA_VISIBLE_DEVICES=0 .venv/bin/sgl-omni serve --model-path .models/moss-transcribe-diarize --host 127.0.0.1 --port 8898 --max-running-requests 16 --cuda-graph-max-bs 16 --mem-fraction-static 0.80

健康检查

curl -fsS http://127.0.0.1:8898/health
curl -fsS http://127.0.0.1:8898/v1/models

Smoke test

curl -fsS http://127.0.0.1:8898/v1/audio/transcriptions -F file=@moss-sample.wav -F model=OpenMOSS-Team/MOSS-Transcribe-Diarize -F response_format=verbose_json | tee /tmp/moss-sglang-transcription.json
python - <<'PY'
import json
import re

with open('/tmp/moss-sglang-transcription.json', encoding='utf-8') as stream:
    payload = json.load(stream)
segments = payload.get('segments', [])
assert payload.get('text', '').strip() and segments, payload
assert all(item.get('start') <= item.get('end') and re.match(r'^\[S\d{2,}\]', item.get('text', '')) for item in segments), payload
print(payload['text'])
print([(item['start'], item['end'], item['text'][:5]) for item in segments])
PY
python - <<'PY'
from funasr import AutoModel

model = AutoModel(model='OpenMOSS-Team/MOSS-Transcribe-Diarize', backend='sglang', sglang_base_url='http://127.0.0.1:8898/v1', sglang_model='OpenMOSS-Team/MOSS-Transcribe-Diarize', max_new_tokens=65536, disable_update=True)
result = model.generate('moss-sample.wav', max_new_tokens=65536)[0]
assert result['raw_text'] and result['sentence_info'], result
print(result['text'])
print(result['sentence_info'])
PY

运行与容量

把可运行推进到可运营

运行检查

  • 固定模型 revision、FunASR adapter merge、vLLM 0.27.1、SGLang Omni 3f819f9c、CUDA/Torch 与 trust_remote_code 审计结果
  • 用真实会议验证说话人一致性、重叠语音、长静音、时间戳和最大生成长度
  • SGLang Omni #914 的 1088 条单说话人英文 benchmark 不覆盖 diarization 或 timestamp 准确率,生产前必须单独验证
  • LocalAI 路径固定第三方 C++ backend 与 GGUF revision,并分别验证 CPU/GPU backend、量化精度和 OpenAI 接口响应
  • FunASR AutoModel 可把 vLLM diarized_json 与 SGLang Omni verbose_json 统一为 text、timestamp 和带 spk 的 sentence_info;SGLang 分段必须能回溯到 raw_text,避免接受上游合成的 S01 fallback

容量变量

  • 音频时长、语言、声道和 VAD 分段分布
  • 并发、队列等待、预热与模型缓存状态
  • 精确硬件、驱动、运行时和线程配置

故障排查

  • CUDA 12 使用已校验 SHA256 的 vLLM 0.27.1 cu129 wheel;SGLang Omni 当前固定 CUDA 13 安装契约和 3f819f9c
  • 长音频被截断时,vLLM 提高 max_completion_tokens,SGLang Omni 提高 max_new_tokens,并同时监控显存、延迟和输出完整性
  • vLLM diarized_json 提供独立 speaker 字段;SGLang Omni verbose_json 当前把说话人编号放在 segments[].text 的 [Sxx] 前缀

安全边界

生产入口默认不信任

已知限制

这是 OpenMOSS 的第三方模型,不是 FunASR 模型;“无需外部 VAD”不表示模型内部没有分块或分段。vLLM 路径固定 0.27.1,SGLang Omni 路径固定 3f819f9c;升级前必须重跑真实多人长音频。SGLang Omni 的 verbose_json 把说话人编号保留在 segments[].text 的 [Sxx] 前缀,FunASR adapter 会校验该分段能够回溯到 raw_text 后再解析。LocalAI / moss-transcribe.cpp 也是独立第三方重写。

公开基准仅用于复现起点,不替代目标业务负载测试。

证据与反馈

从原始资料核对部署合同