运行路径
从安装到已知音频验证
以下命令来自当前验证清单;上线前固定依赖、模型和硬件。
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