尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

FunASR 部署 MOSS-Transcribe-Diarize 完整指南:从 AutoModel 适配到 vLLM / SGLang / LocalAI 多后端实战

发布时间:2026/9/13 18:34:10

资讯中心
01
ARTICLE

FunASR 部署 MOSS-Transcribe-Diarize 完整指南:从 AutoModel 适配到 vLLM / SGLang / LocalAI 多后端实战

FunASR 部署 MOSS-Transcribe-Diarize 完整指南:从 AutoModel 适配到 vLLM / SGLang / LocalAI 多后端实战
FunASR 部署 MOSS-Transcribe-Diarize 完整指南从 AutoModel 适配到 vLLM / SGLang / LocalAI 多后端实战【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR本文基于仓库内 docs/moss_transcribe_diarize.md含 中文版编写完整讲解如何把第三方 OpenMOSS 模型 MOSS-Transcribe-Diarize 接入 FunASR 部署生态一次生成同时输出转写、时间戳与[S01]等匿名说话人标签应用侧无需再拼接外部 VAD、ASR 与说话人分离管线。读完你将掌握 FunASRAutoModel的 HF / vLLM / SGLang 三种后端契约、内置 OpenAI 兼容 HTTP 服务与 Open WebUI / Kubernetes 集成以及长音频场景下的参数调优与上线前验证清单。为什么需要这条第三方接入路径MOSS-Transcribe-Diarize 由 OpenMOSS 团队以 Apache-2.0 发布不是 FunASR 自有模型。FunASR 的价值在于为它公开的 Transformers、vLLM 与 SGLang Omni 接口提供统一适配器AutoModel同时完整保留 OpenMOSS 的模型名称、许可证与上游 revision。与传统的VAD 切分 → ASR 转写 → 说话人分离三段式管线不同该模型在一次生成中联合输出转写、时间戳和说话人标签例如[start][S01]text[end]。文档特别强调这是部署形态的差异不代表模型内部没有分块或分段逻辑。需要先明确标签语义边界[S01]只是单次录音内的匿名说话人编号——它不识别已知人物、不做已注册声纹验证也不保证与另一段录音中的[S01]是同一个人。应用层如果要做跨录音的身份映射需要自己维护说话人档案。固定上游版本部署前必读模型依赖trust_remote_code因此生产服务禁止执行浮动的模型 revision。本文档按以下不可变版本验证过三者必须全部固定组件固定 revision / 校验值上游源码OpenMOSS/MOSS-Transcribe-Diarizecb765f2b0fe6f7a298aa2002e2281ae693d1f3c3模型权重OpenMOSS-Team/MOSS-Transcribe-Diarizee8681d68e7042738ffca8ac8212bc8fcb1131ab8许可证固定上游源码与模型元数据中的 Apache-2.0vLLM 发布版v0.27.16e448d0ea9bf3d88d898b65449ca6dc2aec170acvLLM CUDA 12.9 x86_64 wheel SHA-256bf0d52faa2a51e7a01c6856a7a8a2d1307fd0ff711415d34168a67ffac0fa47b在后续所有命令中e8681d68...这个模型 revision 都会以--revision或model_revision参数出现请保持一致。FunASR AutoModel 契约本地 TransformersHF后端本地后端应使用隔离的 Python 3.10 环境并安装 Transformers 5.6 或更新版本源码在 funasr/models/moss_transcribe_diarize/model.py 中通过Version(transformers.__version__) Version(5.6.0)强制校验。MOSS 在一次生成中完成长音频转写与说话人分离因此不要传vad_model或spk_model。适配器构造函数对此有硬性约束一旦传入这两个参数会直接抛出ValueError提示 omit vad_model and spk_model to preserve global speaker identity因为外部 VAD 会把长音频切开破坏跨分块的匿名说话人标签一致性。这一行为有对应测试覆盖见 tests/test_moss_transcribe_diarize_model.py 中的test_rejects_external_vad_that_would_break_global_speaker_identity。from funasr import AutoModel model AutoModel( modelOpenMOSS-Team/MOSS-Transcribe-Diarize, model_revisione8681d68e7042738ffca8ac8212bc8fcb1131ab8, backendhf, devicecuda:0, dtypebf16, attn_implementationsdpa, disable_updateTrue, ) result model.generate(audio.wav, max_new_tokens5120)[0] print(result[text]) for segment in result[sentence_info]: print(segment[start], segment[end], segment[spk], segment[text])几点源码级的细节补充attn_implementation默认值为sdpa若显式指定flash_attention_2加载失败适配器会自动回退尝试sdpa再回退eager见_load_hf_backend中的attempts列表提升不同 GPU 环境下的可用性dtype支持bf16/fp16/fp32含别名默认bf16如果 CUDA 不可用会自动落到 CPU 并把 dtype 强制为fp32HF 推理走的是processor.apply_chat_template组装多模态消息generate时传入input_features、audio_feature_lengths、audio_chunk_mapping等音频字段解码后 strip 掉 prompt 部分得到带标签原文max_new_tokens默认 5120max_length默认 131072可通过构造参数或generate调用覆盖。统一结果字段适配器在raw_text中保留原始标签生成并返回 FunASR 通用字段text移除 MOSS 控制标签后的可读转写多段文本按 CJK 相邻不加空格、其余加空格规则拼接见_join_textstimestampsegment 级[start_ms, end_ms]数组sentence_info每条含start、end、text、sentence、spk和timestampraw_text用于审计的原始[start][Sxx]text[end]生成。关键的安全语义当解析器无法确认标签结构时会保留text与raw_text返回空的时间戳和分段数组绝不静默编造说话人信息。测试test_keeps_unparsed_model_text_visible验证了这一点——纯文本输入返回的timestamp与sentence_info均为空列表。测试还验证了解析器能正确处理正文中出现的数字方括号如Welcome [2026]不会被误判为时间戳标签。vLLM 客户端模式不下载本地权重同一套结果契约也可以包装已经启动的 vLLM 服务客户端不下载任何本地权重。AutoModel的 vLLM 分支在 funasr/auto/auto_model.py 中被测试验证为绝不下载模型权重见测试test_auto_model_vllm_path_bypasses_weight_downloadfrom funasr import AutoModel model AutoModel( modelOpenMOSS-Team/MOSS-Transcribe-Diarize, backendvllm, vllm_base_urlhttp://127.0.0.1:8898/v1, vllm_modelmoss-transcribe-diarize, vllm_response_formatdiarized_json, disable_updateTrue, ) result model.generate(audio.wav, max_completion_tokens8192)[0]适配器发送官方 OpenAI-compatible multipart 请求POST /v1/audio/transcriptions并把官方返回的 speakersegments直接映射到sentence_info。请求数据中temperature默认0、max_completion_tokens以字符串形式随表单提交。认证通过vllm_api_key提供默认值EMPTY时不带 Authorization 头请把密钥放在 secret store 而不是源码里。关于响应格式两点必须记牢vllm_response_formatdiarized_json是固定 vLLM revision 下的结构化生产路径为保持已有客户端兼容默认值仍是json。json模式下raw_text保留原始标签生成结构化模式下raw_text是 vLLM 返回的清理后text权威说话人信息位于sentence_info适配器只接受json与diarized_json两种取值传入verbose_json会直接报ValueErrorvLLM 与 SGLang 的响应格式不能互换。vLLM 响应在结构化模式下的校验非常严格见_result_from_diarized_response每个 segment 必须是对象、start/end必须为有限数值、start 0、end start、text与speaker必须是非空字符串任何一项不满足都会抛出RuntimeError(...invalid contract)测试test_rejects_malformed_vllm_diarized_segment对此有覆盖。生成上限参数的优先级长音频场景下max_completion_tokens与max_new_tokens的取舍很关键FunASR vLLM 适配器同时接受 OpenAI-compatible 名称max_completion_tokens和兼容别名max_new_tokens两者同时出现时以前者max_completion_tokens为准构造参数中同样如此处理测试test_prefers_native_vllm_completion_limit_for_long_audio验证了max_new_tokens4096与max_completion_tokens8192同时传入时实际发送8192增大上限会提高显存占用和尾延迟需要按最长会议实测。命令行示例MOSS 离线转写需要可直接运行、保存说话人 JSON 并打印分段时间的命令行工具可参考 transcribe_vllm_offline_notes_en.md 中MOSS Offline Transcription and Anonymous Speakers一节通过transcribe_vllm_offline.py --engine moss把整条录音发送给独立的 MOSS vLLM 服务不经过 Qwen3 切块也不下载本地权重。该示例保留默认的 Qwen3 单独转写路径不混拼 Qwen3 文本与 MOSS 标签客户端环境创建、MOSS_VLLM_API_KEY认证、输出字段与长音频输出上限都在该说明中默认输出文件为recording.moss-vllm.json。FunASR OpenAI 兼容服务内置离线 HTTP 服务通过/v1/audio/transcriptions返回同一套标准化结果。服务加载固定的 Transformers revision不会外挂 VAD 或第二套说话人模型python -m pip install transformers5.6,6 fastapi uvicorn python-multipart funasr-server --model moss-transcribe-diarize --device cuda:0 --port 8000 curl -fsS http://127.0.0.1:8000/v1/audio/transcriptions \ -F filemeeting.wav \ -F modelmoss-transcribe-diarize \ -F response_formatverbose_json响应包含text、音频duration以及带start、end、text和匿名speaker标签的segments。请求不需要设置spktrue即使通用客户端传入该字段服务也只使用 MOSS 原生标签不会启动第二套说话人流水线。moss-transcribe-diarize这个模型名在 examples/openai_api/server.py 的模型注册表中直接映射到OpenMOSS-Team/MOSS-Transcribe-Diarize。Open WebUI 集成Open WebUI 可将该服务配置为 OpenAI 兼容的语音转写提供方进入Admin Panel Settings Audio选择 OpenAI STT engine将OpenAI API Base URL设为http://funasr:8000/v1或可访问的主机地址模型选择moss-transcribe-diarize请求格式保持multipart。Open WebUI 会把所选模型、可选语言和完整音频文件提交到/v1/audio/transcriptions。请注意MOSS 仍是离线长音频模型这里提供的是文件转写不是实时麦克风或 WebSocket 说话人分离路径——因此 FunASR 的实时 WebSocket 服务不暴露该模型。FunClip 通过同一套sentence_info契约生成带说话人信息的字幕与片段。GPU 容器与 Kubernetes 部署GPU 容器可在仓库根目录用 docker-compose.moss.yml 构建。该编排文件使用 Dockerfile.moss基于pytorch/pytorch:2.9.1-cuda12.8-cudnn9-runtime安装ffmpeg、git、libsndfile1并安装transformers5.6,6通过环境变量FUNASR_MODELmoss-transcribe-diarize、FUNASR_DEVICEcuda:0、FUNASR_PORT8000配置预留 1 块 NVIDIA GPU挂载funasr-moss-cache卷缓存 Hugging Face 权重shm_size设为8gb镜像名为funasr-moss-api:local端口默认映射${FUNASR_HOST_PORT:-8000}:8000。Kubernetes 运维可构建同一镜像后应用 kubernetes/funasr-moss-api.yaml其中包含40Gi 的funasr-moss-cachePVC单副本 DeploymentRecreate策略带/health的 startupProbe60 次失败阈值适合冷启动拉权重与 readinessProbe资源请求 4 CPU / 24Gi 内存 / 1 GPU上限 48Gi 内存/dev/shm使用 8Gi 的 emptyDirService 暴露 8000 端口。上线前务必把本地镜像名funasr-moss-api:local替换为内部镜像仓库的不可变 digest避免浮动标签。服务契约复现记录内置服务路径已在一张 H100 80GB、Transformers5.16.0.dev0、Torch2.11.0cu130环境复现固定 revision 的模型通过真实 HTTP 接口处理仓库自带 6.000 秒样例返回一个非空、时间单调且标记为S01的 segmentduration6.0。文档明确说明这只是服务契约 smoke test不代表准确率、吞吐、并发或生产容量。选择服务后端路径环境响应契约适用场景vLLMCUDA 12cu129或 CUDA 13cu130response_formatdiarized_json返回 OpenAI-compatible 说话人 segmentsresponse_formatjson保留原始[start][Sxx]text[end]文本已运行 vLLM或需要其调度能力SGLang Omni当前上游指南为 CUDA 13response_formatverbose_json返回解析后的 segmentsAPI 需要直接返回结构化说话人分段TransformersPyTorch 进程Python 对象和原始标签文本评测、排障或自定义预处理moss-transcribe.cpp / LocalAIC17、ggml、GGUFCPU 或 ggml GPU 后端LocalAI 的 OpenAI-compatible 转写接口不希望在推理机安装 Python/PyTorch或需要量化 GGUF 和边缘部署两个 HTTP 后端vLLM 与 SGLang都使用/v1/audio/transcriptions但官方文档中的响应格式不能混为一谈固定的 vLLM revision 支持diarized_json在对外承诺segments之前请先验证实际部署的 exact server revision。vLLM 部署实战安装已验证的 vLLM 发布版创建隔离环境并安装带校验的 wheeluv 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.1cu129-cp38-abi3-manylinux_2_28_x86_64.whl echo bf0d52faa2a51e7a01c6856a7a8a2d1307fd0ff711415d34168a67ffac0fa47b vllm-0.27.1cu129-cp38-abi3-manylinux_2_28_x86_64.whl \ | sha256sum -c - uv pip install --python .venv-moss/bin/python --torch-backendauto \ vllm[audio] file://$PWD/vllm-0.27.1cu129-cp38-abi3-manylinux_2_28_x86_64.whl必须安装audioextra只装 plainvllm时服务可以启动但因为缺少音频解码器请求会返回 HTTP 400Invalid or unsupported audio file。启动服务使用不可变模型 revision 启动CUDA_VISIBLE_DEVICES0 .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/v1/audio/transcriptions \ -F fileaudio.wav \ -F modelmoss-transcribe-diarize \ -F response_formatdiarized_json \ -F max_completion_tokens8192 \ -F temperature0 \ | tee moss-transcription.json python - PY import json with open(moss-transcription.json, encodingutf-8) as stream: payload json.load(stream) text payload.get(text, ) segments payload.get(segments, []) assert text.strip(), payload assert 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如需审计模型的原始紧凑标签生成把请求改为response_formatjson并验证返回text中包含[S01]。长音频需要按业务最长会议验证max_completion_tokens增大上限会影响显存和尾延迟。已复现的 vLLM 契约边界数据结构化响应验证使用 vLLM 0.27.1、Torch2.13.0cu129和一张 H100 80GB15.1685 秒双说话人样例返回两个diarized_jsonsegments标签为S01、S02同一请求通过 FunASR 适配器后返回两个时间单调且说话人一致的sentence_info309.600 秒中文长音频默认 5120 上限返回 158 个 segments最后时间戳 309.41 秒7.459 秒完成379.664 秒中文长音频默认 5120 上限时生成在 354.98 秒截断diarized_json因标签不完整返回HTTP 400设置max_completion_tokens8192后返回 224 个 segments覆盖到 378.55 秒10.516 秒完成早期 raw-response 验证vLLM0.23.1rc1.dev949...6.000 秒样例返回[0.96][S01]... [5.94]A 0.8s 静音 B 0.8s 静音 A 探针返回S01 - S02 - S01时间戳覆盖到 19.08 秒。文档特别强调这两段真实长音频中 MOSS 修正了报告者指出的多处专有词和近音词并保持了转述基金会声明的语义连续性但输出仍包含较短的独立分段不能据此宣称字幕切分问题已解决。以上数字只证明 exact input 的完整性边界不是精度、吞吐或生产容量基准。一个重要的版本陷阱旧 nightly commit68b4a1d582818e67adc903bf1b8fc5a5447da2fa早于 vLLM 的#48543合并它支持response_formatjson但diarized_json会返回 HTTP 400——应升级到已验证发布版不要静默重试一次成本较高的转写请求。moss-transcribe.cpp 与 LocalAI边缘 / 量化路径localai-org/moss-transcribe.cpp是 LocalAI 团队维护的第三方 C17/ggml 重写许可证为 MIT原始 OpenMOSS 模型权重仍保持 Apache-2.0。它不是FunASRAutoModel后端也不能与上面的 Python 适配器混用。选择这条路径的场景需要 GGUF 量化、CPU 推理或 ggml 的 CUDA / Metal / Vulkan / HIP 后端。关键版本锚点LocalAImastera7cc5873ef5b7c909fc9ff7d349d51738ba9bb05已包含moss-transcribe-cpp后端及 Hugging Face importer后端固定moss-transcribe.cpp190a569c13b4b247450f2fb3b2a431244e84833eimporter 可识别huggingface://mudler/moss-transcribe.cpp-gguf并默认选择Q5_K量化。部署前务必按 LocalAI 文档验证backend package、GGUF SHA-256、实际硬件后端以及/v1/audio/transcriptions响应。不要把上游 README 的性能数字当作本机基准。SGLang Omni 部署实战按固定上游 SGLang Omni 安装指南准备 CUDA 13 环境然后克隆并固定源码版本git clone https://github.com/sgl-project/sglang-omni.git git -C sglang-omni checkout 3f819f9cdae3d4eeec22f73306c9067a1ec2542e该源码 pin 已把max_new_tokens传入转录生成请求最初的 #914 合并早于这个请求字段虽然它的 H100 benchmark 仍可作为上游证据但不能支撑下方长音频命令。下载不可变模型快照并从本地目录启动hf download OpenMOSS-Team/MOSS-Transcribe-Diarize \ --revision e8681d68e7042738ffca8ac8212bc8fcb1131ab8 \ --local-dir .models/moss-transcribe-diarize sgl-omni serve \ --model-path .models/moss-transcribe-diarize \ --port 8898 \ --max-running-requests 16 \ --cuda-graph-max-bs 16 \ --mem-fraction-static 0.80请求结构化分段curl -fsS http://127.0.0.1:8898/v1/audio/transcriptions \ -F fileaudio.wav \ -F modelOpenMOSS-Team/MOSS-Transcribe-Diarize \ -F response_formatverbose_jsonSGLang 的响应契约与 vLLM 不同SGLang Omni 当前的verbose_json把说话人编号保留为segments[].text的[Sxx]前缀没有单独的speaker字段。接入字幕、会议纪要或分析系统前必须解析并校验这个前缀。FunASR 适配器会完成该校验并把 SGLang 官方 segments 映射为与 HF、vLLM 一致的sentence_info契约from funasr import AutoModel model AutoModel( modelOpenMOSS-Team/MOSS-Transcribe-Diarize, backendsglang, sglang_base_urlhttp://127.0.0.1:8898/v1, sglang_modelOpenMOSS-Team/MOSS-Transcribe-Diarize, max_new_tokens65536, disable_updateTrue, ) result model.generate(inputaudio.wav, max_new_tokens65536)[0] for segment in result[sentence_info]: print(segment[start], segment[end], segment[spk], segment[text])同样不要传入vad_model或spk_model。SGLang 路径的校验比 vLLM 更严格见_result_from_sglang_response每个 segment 必须有数值起止时间且start 0、end start并强制时间单调递增test_rejects_sglang_segments_with_decreasing_start_timessegments[].text必须带[Sxx]前缀且为两位以上数字S1会被拒绝前缀与文本必须能被raw_text中的标签逐一背书test_rejects_sglang_fallback_speaker_not_backed_by_raw_transcript、test_rejects_one_digit_sglang_speaker_label说话人前缀只从标准化 segment 中移除raw_text保留上游带标签原文任何校验失败都明确抛错绝不伪造说话人标签。上游证据方面原生 runtime 已通过 SGLang Omni #914 合并其单张 H100 Seed-TTS EN benchmark 完成 1088/1088 条请求且无失败但 WER 是在移除 timestamp 与 speaker markup 后针对单说话人英文片段计算的因此不评估 diarization 或 timestamp 准确率也不是生产容量承诺。上线前验证清单不要只用短单人音频应使用真实多人长音频检查长轮次及说话人再次出现时的身份一致性含S01 - S02 - S01回切场景覆盖重叠语音、串音、音乐、噪声和长静音验证时间戳单调递增并覆盖完整音频记录 GPU、CUDA、Torch、后端 commit、模型 revision、音频时长、生成上限、墙钟延迟和峰值显存在 API 网关完成认证、TLS、请求限制和数据留存策略模型 worker 只绑定内网地址。向 FunASR 报告问题时请明确这是OpenMOSS 第三方路径并附上后端与上游的 exact revision。模型架构或权重问题应反馈给上游部署中心的契约或文档问题可以在 FunASR 提交。相关部署资产均可直接在仓库中查看docker-compose.moss.yml、Dockerfile.moss、Kubernetes 清单、适配器实现 与 适配器测试。【免费下载链接】FunASROpen-source speech recognition toolkit for training, inference, streaming ASR, VAD, punctuation, speaker diarization pipelines, and OpenAI-compatible/MCP serving.项目地址: https://gitcode.com/GitHub_Trending/fun/FunASR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。