Deployment contract

MOSS unified transcription and diarization

Use FunASR AutoModel or an OpenAI-compatible service with the third-party Apache-2.0 model published by OpenMOSS to produce long-form transcripts, timestamps, and speaker labels in one pass.

Maturity
Community verified
FunASR
AutoModel HF + vLLM + SGLang adapters and OpenAI HTTP service; third-party model@e8681d68
Runtime
Transformers 5.16.0.dev0 + Torch 2.11.0+cu130 and vLLM 0.27.1 + Torch 2.13.0+cu129 / H100 80GB
Verified
2026-09-01

Workload boundary

Decide whether it fits your production constraints

Good fit

  • Multi-speaker meetings, interviews, podcasts, and calls
  • One model output for text, timestamps, and speaker identifiers
  • NVIDIA GPU deployments that need a vLLM or SGLang Omni OpenAI-compatible audio transcription endpoint
  • The third-party LocalAI / moss-transcribe.cpp GGUF path on CPU or desktop-edge GPUs

Not a fit

  • Realtime streaming captions or low-latency endpoint detection
  • Deployments that require identical output from FunASR AutoModel and the LocalAI C++ path
  • Native Windows deployments without validation on the target hardware
  • Projects that require FunASR-owned model weights
ModelsOpenMOSS-Team/MOSS-Transcribe-Diarize (third-party Apache-2.0 model)
Hardwarecpu / nvidia-gpu / desktop-edge-gpu / kubernetes
Operating systemsLinux
InterfacesOpenAI-compatible HTTP / vLLM / SGLang Omni / Transformers / LocalAI / moss-transcribe.cpp

Run path

From installation to known-audio verification

These commands come from the current verification registry. Pin dependencies, model, and hardware before rollout.

FunASR OpenAI-compatible service

Load the pinned HF backend directly with funasr-server and return verbose_json with anonymous speaker labels; dedicated Docker Compose and Kubernetes GPU recipes are included.

Validation scope: Transformers 5.16.0.dev0 / Torch 2.11.0+cu130 / H100 80GB; real HTTP response verified 2026-09-01

Install

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

Launch

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

Health check

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

Use the verified vLLM 0.27.1 OpenAI audio endpoint and map diarized_json into the common structured result through FunASR AutoModel.

Validation scope: vLLM 0.27.1 / Torch 2.13.0+cu129 / H100 80GB; FunASR adapter verified

Install

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

Launch

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

Health check

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

Use the merged native MOSS pipeline and OpenAI-compatible verbose_json endpoint, then validate [Sxx] prefixes and normalize them into sentence_info through FunASR AutoModel.

Validation scope: SGLang Omni 3f819f9c / FunASR adapter contract-tested / #914 H100 upstream benchmark

Install

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 -

Launch

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

Health check

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

Operations and capacity

Move from runnable to operable

Operational checks

  • Pin the model revision, FunASR adapter merge, vLLM 0.27.1, SGLang Omni 3f819f9c, CUDA/Torch stack, and trust_remote_code audit
  • Validate speaker consistency, overlap, long silence, timestamps, and generation limits on real meetings
  • The 1088-clip SGLang Omni #914 single-speaker English benchmark does not cover diarization or timestamp accuracy; validate both independently before production
  • For LocalAI, pin the third-party C++ backend and GGUF revision, then validate CPU/GPU backends, quantization accuracy, and the OpenAI response independently
  • FunASR AutoModel maps both vLLM diarized_json and SGLang Omni verbose_json into text, timestamp, and sentence_info with spk; SGLang segments must be backed by raw_text so an upstream synthesized S01 fallback is not accepted

Capacity variables

  • Audio duration, language, channels, and VAD segment distribution
  • Concurrency, queue time, warmup, and model-cache state
  • Exact hardware, driver, runtime, and thread configuration

Troubleshooting

  • For CUDA 12, use the SHA256-verified vLLM 0.27.1 cu129 wheel; the SGLang Omni path currently pins its CUDA 13 installation contract and 3f819f9c
  • If long audio is truncated, raise max_completion_tokens for vLLM or max_new_tokens for SGLang Omni while monitoring memory, latency, and output completeness
  • vLLM diarized_json returns a separate speaker field; SGLang Omni verbose_json currently keeps the speaker identifier in the [Sxx] prefix of segments[].text

Security boundary

Treat production ingress as untrusted

Known limitation

This is an OpenMOSS third-party model, not a FunASR model; no external VAD requirement does not imply an absence of internal segmentation. The vLLM path pins 0.27.1 and the SGLang Omni path pins 3f819f9c; revalidate real long multi-speaker audio before upgrades. SGLang Omni verbose_json keeps the speaker identifier in the [Sxx] prefix of segments[].text, which the FunASR adapter parses only after validating that the segment is backed by raw_text. LocalAI / moss-transcribe.cpp is another independent third-party reimplementation.

Public benchmarks are reproduction starting points, not substitutes for target-workload testing.

Evidence and feedback

Verify this contract against primary material