Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion docs/moss_transcribe_diarize.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ MOSS-Transcribe-Diarize jointly generates transcription, timestamps, and
speaker labels such as `[S01]`. An application therefore does not need to
assemble an external VAD, ASR, and diarization pipeline. This is a deployment
property, not a claim that the model has no internal segmentation or chunking.
The labels are anonymous within a recording: `[S01]` does not identify a known
person, verify an enrolled voiceprint, or necessarily map to `[S01]` in another
recording.

## Pinned sources

Expand All @@ -33,7 +36,7 @@ floating model revision in a production service.
Use an isolated Python 3.10+ environment with Transformers 5.6 or newer for
the local backend. MOSS performs long-form transcription and speaker
diarization in one generation, so do **not** pass `vad_model` or `spk_model`.
External VAD segmentation would break the model's global speaker identity
External VAD segmentation would break consistent anonymous speaker assignment
across chunks.

```python
Expand Down
8 changes: 5 additions & 3 deletions docs/moss_transcribe_diarize_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
MOSS-Transcribe-Diarize 会联合生成转写、时间戳和 `[S01]` 等说话人标签,应用侧
不必再拼接外部 VAD、ASR 和 diarization 管线。这里描述的是部署形态,不表示模型
内部没有分块或分段。
这些是单次录音内的匿名说话人标签:`[S01]` 不能识别已知人物,不做已注册声纹
验证,也不保证与另一段录音中的 `[S01]` 是同一个人。

## 固定上游版本

Expand All @@ -28,8 +30,8 @@ MOSS-Transcribe-Diarize 会联合生成转写、时间戳和 `[S01]` 等说话
## FunASR AutoModel 契约

本地后端应使用隔离的 Python 3.10+ 环境,并安装 Transformers 5.6 或更新版本。
MOSS 在一次生成中完成长音频转写与说话人识别,因此不要传 `vad_model` 或
`spk_model`。外部 VAD 会把长音频切开,并破坏跨分块的全局说话人身份
MOSS 在一次生成中完成长音频转写与说话人分离,因此不要传 `vad_model` 或
`spk_model`。外部 VAD 会把长音频切开,并破坏跨分块的匿名标签一致性

```python
from funasr import AutoModel
Expand Down Expand Up @@ -288,7 +290,7 @@ for segment in result["sentence_info"]:
不要传入 `vad_model` 或 `spk_model`:MOSS 在一次生成中联合完成分段和匿名说话人
归属,外部分段会破坏长轮次中的说话人一致性。适配器把上游带标签原文保存在
`raw_text`,只从标准化 segment 中移除已经校验的 `[Sxx]` 前缀;如果 SGLang
没有返回此前缀,则明确失败,不会伪造说话人身份
没有返回此前缀,则明确失败,不会伪造说话人标签

原生 runtime 已通过 SGLang Omni
[#914](https://github.com/sgl-project/sglang-omni/pull/914) 合并。其单张 H100
Expand Down
2 changes: 1 addition & 1 deletion docs/repository_roles.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ The four repositories share models and tooling but their responsibility boundari
|---|---|
| Use Python for speech recognition / training / fine-tuning | [modelscope/FunASR](https://github.com/modelscope/FunASR) |
| Deploy a realtime streaming ASR service, recommend **Fun-ASR-Nano + vLLM** | [modelscope/FunASR/fun_asr_nano](https://github.com/modelscope/FunASR/tree/main/examples/industrial_data_pretraining/fun_asr_nano) — **canonical implementation, see below** |
| Transcribe long multi-speaker audio with timestamps and speaker identities in one model pass | [MOSS-Transcribe-Diarize deployment guide](./moss_transcribe_diarize.md) — an OpenMOSS model integrated with FunASR through local Transformers or vLLM, and independently available through native SGLang Omni; no separate external VAD or speaker model |
| Transcribe long multi-speaker audio with timestamps and anonymous speaker labels in one model pass | [MOSS-Transcribe-Diarize deployment guide](./moss_transcribe_diarize.md) — an OpenMOSS model integrated with FunASR through local Transformers or vLLM, and independently available through native SGLang Omni; no separate external VAD or speaker model. Labels distinguish speakers within the recording and do not identify a known person. |
| Understand Fun-ASR-Nano / MLT capabilities, checkpoints, benchmarks, or use Transformers / vLLM / GGUF integrations | [QwenAudio/Fun-ASR](https://github.com/QwenAudio/Fun-ASR) |
| Use emotion recognition / audio event detection | [QwenAudio/SenseVoice](https://github.com/QwenAudio/SenseVoice) |
| Generate video subtitles / clip videos | [modelscope/FunClip](https://github.com/modelscope/FunClip) |
Expand Down
2 changes: 1 addition & 1 deletion docs/repository_roles_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
|---|---|
| 用 Python 做语音识别 / 训练 / 微调 | [modelscope/FunASR](https://github.com/modelscope/FunASR) |
| 部署实时流式 ASR 服务,推荐 Fun-ASR-Nano + vLLM 做实时识别 | [modelscope/FunASR/fun_asr_nano](https://github.com/modelscope/FunASR/tree/main/examples/industrial_data_pretraining/fun_asr_nano) —— **推荐实现,见下节** |
| 用一个模型完成长音频多人转写、时间戳与说话人身份识别 | [MOSS-Transcribe-Diarize 部署指南](./moss_transcribe_diarize_zh.md) —— OpenMOSS 模型通过本地 Transformers 或 vLLM 接入 FunASR,也可通过原生 SGLang Omni 独立服务,不需要额外的外部 VAD 或说话人模型 |
| 用一个模型完成长音频多人转写、时间戳与匿名说话人标签 | [MOSS-Transcribe-Diarize 部署指南](./moss_transcribe_diarize_zh.md) —— OpenMOSS 模型通过本地 Transformers 或 vLLM 接入 FunASR,也可通过原生 SGLang Omni 独立服务,不需要额外的外部 VAD 或说话人模型。标签只区分本段录音中的说话人,不能识别已知人物。 |
| 了解 Fun-ASR-Nano / MLT 的能力范围、权重、评测,或使用 Transformers / vLLM / GGUF 集成 | [QwenAudio/Fun-ASR](https://github.com/QwenAudio/Fun-ASR) |
| 需要情感识别 / 音频事件检测 | [QwenAudio/SenseVoice](https://github.com/QwenAudio/SenseVoice) |
| 做视频字幕 / 剪辑 | [modelscope/FunClip](https://github.com/modelscope/FunClip) |
Expand Down
35 changes: 35 additions & 0 deletions tests/test_moss_transcribe_diarize_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,24 @@
ROOT / "docs" / "deployment_matrix_ja.md",
ROOT / "docs" / "deployment_matrix_ko.md",
)
BOUNDARY_DOCS = (
*GUIDES,
ROOT / "docs" / "repository_roles.md",
ROOT / "docs" / "repository_roles_zh.md",
ROOT
/ "web-pages"
/ "product-site"
/ "legacy"
/ "en"
/ "blog"
/ "funclip-v2-2-0-moss-speaker-clipping.html",
ROOT
/ "web-pages"
/ "product-site"
/ "legacy"
/ "blog"
/ "funclip-v2-2-0-moss-speaker-clipping.html",
)


@pytest.mark.parametrize("guide", GUIDES)
Expand Down Expand Up @@ -78,3 +96,20 @@ def test_all_deployment_matrices_link_moss_guide(matrix: Path) -> None:
"FunASR 소유 model 또는 `AutoModel` backend가 아닙니다",
):
assert stale_claim not in moss_row


def test_moss_docs_describe_anonymous_labels_not_known_person_identity() -> None:
combined = "\n".join(path.read_text(encoding="utf-8") for path in BOUNDARY_DOCS)

for misleading_claim in (
"speaker identity",
"speaker identities",
"说话人身份",
"身份识别",
):
assert misleading_claim not in combined

assert "anonymous speaker labels" in combined
assert "匿名说话人标签" in combined
assert "does not identify a known person" in combined
assert "不能识别已知人物" in combined
4 changes: 2 additions & 2 deletions web-pages/product-site/content/legacy-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"blog/funasr-vs-faster-whisper-chinese.html": "bfe9bb8017be80c7e7f4587726f43f6064f1dc4c65e39788f836fdfb0c9789f7",
"blog/funasr-vs-whisper-benchmark.html": "b7b49adf24d20570abb09b733ce03d4a50a4a0e98e746b4a9320f453e01cce84",
"blog/funclip-v2-1-0-video-clipping-release.html": "88f6c44e5332d1746c4db0fc97d755ef82f12e46d8f1c1c0ad9351152ff9dfc1",
"blog/funclip-v2-2-0-moss-speaker-clipping.html": "7127fb3d6493500d1e44e2168427b3e9adf9ec9bcd840d9da8fd5a1323af9709",
"blog/funclip-v2-2-0-moss-speaker-clipping.html": "0d50747d3992301fb3062ad2cdf903bd427bec3db1f1e4fab1f06de207928bc9",
"blog/generate-subtitles-srt-vtt-from-audio-video.html": "f1133235673d441cc654310581f59a319f182314ab7c0b0824af87da9f4a0591",
"blog/index.html": "0698ce3d08c4b61c1e1e3f94142d3564581d162765081437229d2c4f3fff5ff7",
"blog/japanese-speech-recognition.html": "399f5ce84e68ac00854bdf70b52b1cde6795efca7c800fd6492035a37a7c1b68",
Expand Down Expand Up @@ -60,7 +60,7 @@
"en/blog/funasr-vs-faster-whisper-chinese.html": "abf31d3827dfba9b31ccd4e76229de9e4bfff00ab8bcee33bd718c88249630f4",
"en/blog/funasr-vs-whisper-benchmark.html": "367d4a8a1cc09ac932c80cdad065127925c5e5f942a806ace683c16dc1132769",
"en/blog/funclip-v2-1-0-video-clipping-release.html": "229baf59adf2c3290541d9b3c8a6243992406ba84b712714e9d14599205cb1d4",
"en/blog/funclip-v2-2-0-moss-speaker-clipping.html": "6456c699b4837e5c1fc3741cda40a58a1d0caed8498351445e2dd6314dd89b3c",
"en/blog/funclip-v2-2-0-moss-speaker-clipping.html": "644159267f0fa4e7aab9d0eda98f68cd2b6365a9985038b639c626a5ea5ea7e8",
"en/blog/generate-subtitles-srt-vtt-from-audio-video.html": "1530d4b9e94820a0b60d801e8d1c19b7aeb031b2f2b76c092657392e47706c6d",
"en/blog/index.html": "fc46e28078b49173d9f124afc51bed070b94b3738850b077a7fffcdaa965bc3a",
"en/blog/japanese-speech-recognition.html": "c476adcc2be1ed7c19e2345cc91b8ee6a0e04efd794b9b6476dd5d9b3a2c8b04",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,12 @@
<body>
<nav class="nav"><div class="container"><a class="nav-logo" href="/">Fun<span>ASR</span></a><div class="nav-links"><a href="/deploy/">部署</a><a href="/blog/">博客</a><a href="/ecosystem.html">生态</a></div><a href="/en/blog/funclip-v2-2-0-moss-speaker-clipping.html">EN</a><a class="nav-btn" href="https://github.com/modelscope/FunASR">GitHub</a></div></nav>
<article><div class="container">
<h1>FunClip v2.2.0:用 MOSS 做长音频说话人识别与视频剪辑</h1>
<h1>FunClip v2.2.0:用 MOSS 做长音频说话人分离与视频剪辑</h1>
<p class="meta">2026-08-31 · FunClip Release</p>
<img class="hero-media" src="/img/funclip-v2-1-0-interface.jpg" alt="FunClip 本地视频、字幕识别和智能剪辑界面">
<p class="lead">FunClip v2.2.0 新增一条可选的 MOSS 路径:把长音频交给 vLLM 服务,FunASR 将模型输出归一化为文本、说话人身份和时间段,FunClip 再生成 SRT 或按 <code>spkS01</code>、<code>spkS02</code> 剪辑。</p>
<p class="lead">FunClip v2.2.0 新增一条可选的 MOSS 路径:把长音频交给 vLLM 服务,FunASR 将模型输出归一化为文本、匿名说话人标签和时间段,FunClip 再生成 SRT 或按 <code>spkS01</code>、<code>spkS02</code> 剪辑。</p>
<p><a href="https://github.com/OpenMOSS/MOSS-Transcribe-Diarize">MOSS-Transcribe-Diarize</a> 是 OpenMOSS 维护的第三方模型,不属于 FunASR 或 FunClip。集成固定使用 <code>OpenMOSS-Team/MOSS-Transcribe-Diarize</code> revision <code>e8681d68e7042738ffca8ac8212bc8fcb1131ab8</code>,并明确保留模型归属与支持边界。</p>
<p><code>spkS01</code> 与 <code>spkS02</code> 只是当前录音内的匿名标签,不能识别已知人物、验证已注册声纹,也不保证不同录音中的同名标签对应同一个人。</p>

<h2>数据路径</h2>
<table><thead><tr><th>阶段</th><th>职责</th></tr></thead><tbody>
Expand Down Expand Up @@ -64,9 +65,9 @@ <h2>2. 启动 FunClip</h2>

<h2>能力与边界</h2>
<ul>
<li>支持长音频 ASR、说话人身份、SRT,以及按说话人剪辑,包括不足一秒的有效短说话片段。</li>
<li>支持长音频 ASR、匿名说话人标注、SRT,以及按说话人剪辑,包括不足一秒的有效短说话片段。</li>
<li>MOSS 提供段级时间戳,适合按整段或说话人剪辑;任意文本的精确字符级剪辑仍应使用 Paraformer。</li>
<li>全局说话人身份依赖模型看到连续音频,因此不接外部 VAD 或说话人模型,避免预切块破坏身份一致性。</li>
<li>单次录音内的标签一致性依赖模型看到连续音频,因此不接外部 VAD 或说话人模型,避免预切块破坏标签一致性。</li>
<li>如果最后一个 MOSS 片段因 token 上限没有结束时间戳,FunClip 会明确报错并提示提高 <code>--moss-max-tokens</code>,不会静默丢掉尾段。</li>
</ul>
<p>完整生产部署、健康检查和容量边界见 <a href="/deploy/moss-transcribe-diarize.html">MOSS 双语部署指南</a>。</p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,9 @@
<h1>FunClip v2.2.0: Long-Form Speaker-Aware Video Clipping with MOSS</h1>
<p class="meta">August 31, 2026 · FunClip Release</p>
<img class="hero-media" src="/img/funclip-v2-1-0-interface.jpg" alt="FunClip local video, subtitle recognition, and intelligent clipping interface">
<p class="lead">FunClip v2.2.0 adds an opt-in MOSS path: send long audio to a vLLM service, normalize text, speaker identities, and time ranges through FunASR, then generate SRT or clip by <code>spkS01</code>, <code>spkS02</code>, and later speaker IDs.</p>
<p class="lead">FunClip v2.2.0 adds an opt-in MOSS path: send long audio to a vLLM service, normalize text, anonymous speaker labels, and time ranges through FunASR, then generate SRT or clip by <code>spkS01</code>, <code>spkS02</code>, and later speaker labels.</p>
<p><a href="https://github.com/OpenMOSS/MOSS-Transcribe-Diarize">MOSS-Transcribe-Diarize</a> is a third-party model maintained by OpenMOSS, not a FunASR or FunClip-owned checkpoint. The integration pins <code>OpenMOSS-Team/MOSS-Transcribe-Diarize</code> revision <code>e8681d68e7042738ffca8ac8212bc8fcb1131ab8</code> and keeps ownership and support boundaries explicit.</p>
<p><code>spkS01</code> and <code>spkS02</code> distinguish anonymous speakers within the current recording. The model does not identify a known person, verify an enrolled voiceprint, or promise that labels match across separate recordings.</p>

<h2>Data path</h2>
<table><thead><tr><th>Stage</th><th>Responsibility</th></tr></thead><tbody>
Expand Down Expand Up @@ -64,9 +65,9 @@ <h2>2. Start FunClip</h2>

<h2>Capabilities and boundaries</h2>
<ul>
<li>Long-form ASR, speaker identity, SRT, and speaker-based clipping are supported, including valid speaker turns shorter than one second.</li>
<li>Long-form ASR, anonymous speaker labeling, SRT, and speaker-based clipping are supported, including valid speaker turns shorter than one second.</li>
<li>MOSS provides segment-level timestamps. Use it for whole-segment or speaker clipping; keep Paraformer for precise arbitrary character-level text clipping.</li>
<li>Global speaker identity depends on continuous context, so the MOSS path attaches no external VAD or speaker model that would pre-chunk the recording.</li>
<li>Consistent speaker assignment within one recording depends on continuous context, so the MOSS path attaches no external VAD or speaker model that would pre-chunk the recording.</li>
<li>If the final segment is missing its ending timestamp after token exhaustion, FunClip raises an explicit truncation error and asks for a higher <code>--moss-max-tokens</code> value instead of silently dropping the tail.</li>
</ul>
<p>See the <a href="/en/deploy/moss-transcribe-diarize.html">bilingual MOSS production guide</a> for health checks, runtime choices, and capacity boundaries.</p>
Expand Down
Loading