mirror of
https://github.com/modelscope/FunASR.git
synced 2026-10-12 02:19:18 +00:00
docs(site): publish FunClip MOSS clipping guide
Signed-off-by: LauraGPT <[email protected]>
This commit is contained in:
@@ -21,8 +21,9 @@
|
||||
"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/generate-subtitles-srt-vtt-from-audio-video.html": "f1133235673d441cc654310581f59a319f182314ab7c0b0824af87da9f4a0591",
|
||||
"blog/index.html": "fbfa2611c97cc5426d78450078df36fb1818da1a5eeaef718e6a18fa9fd3d287",
|
||||
"blog/index.html": "0698ce3d08c4b61c1e1e3f94142d3564581d162765081437229d2c4f3fff5ff7",
|
||||
"blog/japanese-speech-recognition.html": "399f5ce84e68ac00854bdf70b52b1cde6795efca7c800fd6492035a37a7c1b68",
|
||||
"blog/lightweight-speech-recognition-cpu.html": "d6270066222ed5baef0df108e6a4155f4a87bb5482169f23f218794d371f3281",
|
||||
"blog/punctuation-restoration-python.html": "6cd26e03bf75b4343afd7b351c2681ebd513b058fb549c5888802be9ff3a1229",
|
||||
@@ -59,8 +60,9 @@
|
||||
"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/generate-subtitles-srt-vtt-from-audio-video.html": "1530d4b9e94820a0b60d801e8d1c19b7aeb031b2f2b76c092657392e47706c6d",
|
||||
"en/blog/index.html": "526253689a12ead8058ef9f45b9cdc37254f6507ab6d23511a742d88fddb95c2",
|
||||
"en/blog/index.html": "fc46e28078b49173d9f124afc51bed070b94b3738850b077a7fffcdaa965bc3a",
|
||||
"en/blog/japanese-speech-recognition.html": "c476adcc2be1ed7c19e2345cc91b8ee6a0e04efd794b9b6476dd5d9b3a2c8b04",
|
||||
"en/blog/lightweight-speech-recognition-cpu.html": "0e02c0e0853b12613d32c250f593c05c2052f18231207b63ee01d6e6600a86f7",
|
||||
"en/blog/punctuation-restoration-python.html": "d6e30049f48d9dc6e6bc22eb567830013e4161eca51215616738b675dd1ffc40",
|
||||
@@ -106,7 +108,7 @@
|
||||
"models.html": "724c88917c9934ffa66948cf3eb583fed930dd689d691b7d21fa22ee8332e606",
|
||||
"quickstart.html": "a543bf07c2cfc9a69ef3831f15c9e9d3e571a826a73cf7e4bdc8e9eb7b910254",
|
||||
"robots.txt": "1305b0f680b3e9f73b01301dc474423230dffab85731a379a694f30c73c07f2d",
|
||||
"sitemap.xml": "bcc17d763cd1b0d317b3af8e52cc40fde58c4a80f3fb5664a12b5503ecf2fc19",
|
||||
"sitemap.xml": "ed91fc0211b48458b77c56c1e600d055c013a6bb4b461821c3ec78dcff4ac26a",
|
||||
"static/liveplayer/liveplayer-component.min.js": "ea10fda35574cc3a77a3e7187095467d1a409009a2d39690051d33d0e7055d30",
|
||||
"static/liveplayer/liveplayer-lib.min.js": "ad67b4e1188c586ec218674a6db9968daf71ed4fbc262258f061c1f931d54250",
|
||||
"static/offline/index.html": "868781c621ddabe5d3f088d6b739e0c08e6cdc150587af6515cc323852018e62",
|
||||
|
||||
@@ -98,6 +98,8 @@
|
||||
{"label": "merged native SGLang Omni MOSS runtime and H100 benchmark", "url": "https://github.com/sgl-project/sglang-omni/pull/914"},
|
||||
{"label": "FunASR ecosystem integration guide", "url": "https://github.com/modelscope/FunASR/blob/main/docs/moss_transcribe_diarize.md"},
|
||||
{"label": "FunASR AutoModel adapter merge and exact-head CI", "url": "https://github.com/modelscope/FunASR/pull/3558"},
|
||||
{"label": "FunClip v2.2.0 MOSS speaker-clipping guide", "url": "https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html"},
|
||||
{"label": "FunClip v2.2.0 release and checksums", "url": "https://github.com/modelscope/FunClip/releases/tag/v2.2.0"},
|
||||
{"label": "moss-transcribe.cpp third-party C++17 and GGUF runtime", "url": "https://github.com/localai-org/moss-transcribe.cpp"},
|
||||
{"label": "LocalAI third-party moss-transcribe-cpp backend", "url": "https://github.com/mudler/LocalAI"}
|
||||
],
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>FunClip v2.2.0:MOSS 长音频说话人识别与视频剪辑 | FunASR</title>
|
||||
<meta name="description" content="FunClip v2.2.0 集成第三方 MOSS-Transcribe-Diarize,通过 vLLM 完成长音频 ASR、说话人分段、SRT 和按说话人剪辑。">
|
||||
<meta property="og:title" content="FunClip v2.2.0:MOSS 说话人识别与视频剪辑">
|
||||
<meta property="og:description" content="一条经过端到端验证的 vLLM 路径,输出说话人分段、SRT,并支持按说话人剪辑。">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://www.funasr.com/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<meta property="og:image" content="https://www.funasr.com/img/funclip-v2-1-0-interface.jpg">
|
||||
<link rel="canonical" href="https://www.funasr.com/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunClip v2.2.0:MOSS 长音频说话人识别与视频剪辑","datePublished":"2026-08-31","dateModified":"2026-08-31","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR"},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/blog/funclip-v2-2-0-moss-speaker-clipping.html"},"image":"https://www.funasr.com/img/funclip-v2-1-0-interface.jpg"}</script>
|
||||
<style>
|
||||
p code,li code,td code,.proof code{overflow-wrap:anywhere}
|
||||
:root{--primary:#2563eb;--accent:#047857;--surface:#f8fafc;--border:#dbe3ec;--text:#0f172a;--soft:#475569}
|
||||
*{box-sizing:border-box}body{margin:0;font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:var(--text);line-height:1.72;background:#fff}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}.container{max-width:840px;margin:auto;padding:0 24px}.nav{position:sticky;top:0;z-index:10;background:#fff;border-bottom:1px solid var(--border);padding:14px 0}.nav .container{max-width:1120px;display:flex;align-items:center;gap:20px}.nav-logo{font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}.nav-links{display:flex;gap:16px;margin-left:auto}.nav-btn{padding:8px 14px;background:var(--primary);color:#fff;border-radius:7px}article{padding:64px 0 80px}h1{font-size:2.1rem;line-height:1.28;margin:0 0 12px}h2{font-size:1.35rem;margin:36px 0 12px;padding-top:20px;border-top:1px solid var(--border)}p,li{color:var(--soft)}.meta{color:#64748b}.lead{font-size:1.08rem;color:var(--text)}.hero-media{width:100%;aspect-ratio:2.04/1;object-fit:cover;border:1px solid var(--border);border-radius:8px;margin:18px 0 24px}pre{overflow:auto;background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;line-height:1.6}code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 5px;border-radius:4px;color:#1d4ed8}table{width:100%;border-collapse:collapse;margin:18px 0}th,td{text-align:left;vertical-align:top;padding:11px;border-bottom:1px solid var(--border)}th{background:var(--surface)}.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;color:#14532d}.cta{margin-top:30px;padding:22px;border:1px solid var(--border);border-radius:8px}.cta a{font-weight:700}footer{padding:28px;background:#0f172a;color:#94a3b8;text-align:center}@media(max-width:800px){.nav-links{display:none}h1{font-size:1.65rem}}
|
||||
</style>
|
||||
</head>
|
||||
<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>
|
||||
<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><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>
|
||||
|
||||
<h2>数据路径</h2>
|
||||
<table><thead><tr><th>阶段</th><th>职责</th></tr></thead><tbody>
|
||||
<tr><td>vLLM</td><td>加载固定 MOSS revision,通过 <code>/v1/audio/transcriptions</code> 返回带时间与说话人标记的 JSON。</td></tr>
|
||||
<tr><td>FunASR 1.4.9+</td><td>解析转写结果并生成统一的 <code>text</code>、<code>timestamp</code> 与 <code>sentence_info</code>。</td></tr>
|
||||
<tr><td>FunClip 2.2.0</td><td>渲染说话人 SRT、按说话人选段,或把时间段交给现有音视频剪辑流程。</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<h2>1. 启动固定 revision 的 vLLM 服务</h2>
|
||||
<pre><code>python -m venv .venv-moss
|
||||
. .venv-moss/bin/activate
|
||||
pip install -U vllm
|
||||
|
||||
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</code></pre>
|
||||
<p>先用真实音频检查服务契约。当前经过验证的格式是 <code>response_format=json</code>:</p>
|
||||
<pre><code>curl -fsS http://127.0.0.1:8898/v1/audio/transcriptions \
|
||||
-F [email protected] \
|
||||
-F model=moss-transcribe-diarize \
|
||||
-F response_format=json \
|
||||
-F max_completion_tokens=8192</code></pre>
|
||||
|
||||
<h2>2. 启动 FunClip</h2>
|
||||
<pre><code>python -m pip install -U -r requirements.txt
|
||||
python funclip/launch.py \
|
||||
--model moss \
|
||||
--moss-backend vllm \
|
||||
--moss-base-url http://127.0.0.1:8898/v1 \
|
||||
--moss-max-tokens 8192</code></pre>
|
||||
<p>远端服务需要 bearer token 时,把凭据放进 <code>MOSS_API_KEY</code> 环境变量;FunClip 不要求把 token 写进命令行或仓库。</p>
|
||||
|
||||
<h2>能力与边界</h2>
|
||||
<ul>
|
||||
<li>支持长音频 ASR、说话人身份、SRT,以及按说话人剪辑,包括不足一秒的有效短说话片段。</li>
|
||||
<li>MOSS 提供段级时间戳,适合按整段或说话人剪辑;任意文本的精确字符级剪辑仍应使用 Paraformer。</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>
|
||||
|
||||
<h2>下载与校验 v2.2.0</h2>
|
||||
<pre><code>FunClip-2.2.0.tar.gz
|
||||
SHA256 994c5d9cf392b74b36284d526eca8bada1560a3e7825ab7baa9c673a1b4ef216
|
||||
|
||||
FunClip-2.2.0.zip
|
||||
SHA256 4f5a7d33d9ea65467f29b55b15ed5be18e64de7e57e2f9f36fe51a23b40557e7</code></pre>
|
||||
<p>从 <a href="https://github.com/modelscope/FunClip/releases/tag/v2.2.0">FunClip v2.2.0 Release</a> 下载归档和 <code>SHA256SUMS</code>,不要从不明镜像复制二进制或凭据。</p>
|
||||
|
||||
<div class="proof">发布内容对应 commit <code>c205bf32a8b11226ff5e8acb9a3c7a1f00cd3b06</code>。仓库测试结果为 84 passed、1 skipped;H100 + vLLM 两说话人样例返回 S01/S02、有效 SRT,并成功按 S02 剪辑。这个验证证明发布链路可用,不代表所有语言、音频条件或并发规模。</div>
|
||||
<div class="cta"><p>先按部署指南跑通一段真实双人音频,再进入 FunClip 处理自己的视频。</p><a href="https://github.com/modelscope/FunClip/releases/tag/v2.2.0">查看 FunClip v2.2.0 发布与下载</a></div>
|
||||
</div></article>
|
||||
<footer>© 2024-2026 Tongyi Lab, Alibaba Group</footer>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,87 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>FunClip v2.2.0: MOSS Speaker-Aware Video Clipping | FunASR</title>
|
||||
<meta name="description" content="FunClip v2.2.0 integrates the third-party MOSS-Transcribe-Diarize model through vLLM for long-form ASR, speaker segments, SRT, and speaker-based clipping.">
|
||||
<meta property="og:title" content="FunClip v2.2.0: MOSS Speaker-Aware Video Clipping">
|
||||
<meta property="og:description" content="An end-to-end tested vLLM path for speaker segments, SRT, and speaker-based video clipping.">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:url" content="https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<meta property="og:image" content="https://www.funasr.com/img/funclip-v2-1-0-interface.jpg">
|
||||
<link rel="canonical" href="https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<link rel="alternate" hreflang="en" href="https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<link rel="alternate" hreflang="zh" href="https://www.funasr.com/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html">
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","headline":"FunClip v2.2.0: MOSS Speaker-Aware Video Clipping","datePublished":"2026-08-31","dateModified":"2026-08-31","author":{"@type":"Organization","name":"FunASR / Tongyi Lab"},"publisher":{"@type":"Organization","name":"FunASR"},"mainEntityOfPage":{"@type":"WebPage","@id":"https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html"},"image":"https://www.funasr.com/img/funclip-v2-1-0-interface.jpg"}</script>
|
||||
<style>
|
||||
p code,li code,td code,.proof code{overflow-wrap:anywhere}
|
||||
:root{--primary:#2563eb;--accent:#047857;--surface:#f8fafc;--border:#dbe3ec;--text:#0f172a;--soft:#475569}
|
||||
*{box-sizing:border-box}body{margin:0;font-family:Inter,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:var(--text);line-height:1.72;background:#fff}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}.container{max-width:840px;margin:auto;padding:0 24px}.nav{position:sticky;top:0;z-index:10;background:#fff;border-bottom:1px solid var(--border);padding:14px 0}.nav .container{max-width:1120px;display:flex;align-items:center;gap:20px}.nav-logo{font-weight:800;color:var(--text)}.nav-logo span{color:var(--primary)}.nav-links{display:flex;gap:16px;margin-left:auto}.nav-btn{padding:8px 14px;background:var(--primary);color:#fff;border-radius:7px}article{padding:64px 0 80px}h1{font-size:2.1rem;line-height:1.28;margin:0 0 12px}h2{font-size:1.35rem;margin:36px 0 12px;padding-top:20px;border-top:1px solid var(--border)}p,li{color:var(--soft)}.meta{color:#64748b}.lead{font-size:1.08rem;color:var(--text)}.hero-media{width:100%;aspect-ratio:2.04/1;object-fit:cover;border:1px solid var(--border);border-radius:8px;margin:18px 0 24px}pre{overflow:auto;background:#172033;color:#e2e8f0;padding:18px;border-radius:8px;line-height:1.6}code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}p code,li code,td code{background:var(--surface);padding:2px 5px;border-radius:4px;color:#1d4ed8}table{width:100%;border-collapse:collapse;margin:18px 0}th,td{text-align:left;vertical-align:top;padding:11px;border-bottom:1px solid var(--border)}th{background:var(--surface)}.proof{border-left:4px solid var(--accent);background:#f0fdf4;padding:14px 16px;color:#14532d}.cta{margin-top:30px;padding:22px;border:1px solid var(--border);border-radius:8px}.cta a{font-weight:700}footer{padding:28px;background:#0f172a;color:#94a3b8;text-align:center}@media(max-width:800px){.nav-links{display:none}h1{font-size:1.65rem}}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<nav class="nav"><div class="container"><a class="nav-logo" href="/en/">Fun<span>ASR</span></a><div class="nav-links"><a href="/en/deploy/">Deploy</a><a href="/en/blog/">Blog</a><a href="/en/ecosystem.html">Ecosystem</a></div><a href="/blog/funclip-v2-2-0-moss-speaker-clipping.html">中文</a><a class="nav-btn" href="https://github.com/modelscope/FunASR">GitHub</a></div></nav>
|
||||
<article><div class="container">
|
||||
<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><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>
|
||||
|
||||
<h2>Data path</h2>
|
||||
<table><thead><tr><th>Stage</th><th>Responsibility</th></tr></thead><tbody>
|
||||
<tr><td>vLLM</td><td>Loads the pinned MOSS revision and serves timestamped speaker markup through <code>/v1/audio/transcriptions</code>.</td></tr>
|
||||
<tr><td>FunASR 1.4.9+</td><td>Parses the response into common <code>text</code>, <code>timestamp</code>, and <code>sentence_info</code> fields.</td></tr>
|
||||
<tr><td>FunClip 2.2.0</td><td>Renders speaker-labeled SRT and sends selected speaker ranges into the existing audio/video clipping workflow.</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<h2>1. Start vLLM at the pinned revision</h2>
|
||||
<pre><code>python -m venv .venv-moss
|
||||
. .venv-moss/bin/activate
|
||||
pip install -U vllm
|
||||
|
||||
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</code></pre>
|
||||
<p>Verify the service with real audio before starting FunClip. The tested contract uses <code>response_format=json</code>:</p>
|
||||
<pre><code>curl -fsS http://127.0.0.1:8898/v1/audio/transcriptions \
|
||||
-F [email protected] \
|
||||
-F model=moss-transcribe-diarize \
|
||||
-F response_format=json \
|
||||
-F max_completion_tokens=8192</code></pre>
|
||||
|
||||
<h2>2. Start FunClip</h2>
|
||||
<pre><code>python -m pip install -U -r requirements.txt
|
||||
python funclip/launch.py \
|
||||
--model moss \
|
||||
--moss-backend vllm \
|
||||
--moss-base-url http://127.0.0.1:8898/v1 \
|
||||
--moss-max-tokens 8192</code></pre>
|
||||
<p>For an authenticated remote service, put the bearer credential in the <code>MOSS_API_KEY</code> environment variable. FunClip does not require putting the token in the command line or repository.</p>
|
||||
|
||||
<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>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>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>
|
||||
|
||||
<h2>Download and verify v2.2.0</h2>
|
||||
<pre><code>FunClip-2.2.0.tar.gz
|
||||
SHA256 994c5d9cf392b74b36284d526eca8bada1560a3e7825ab7baa9c673a1b4ef216
|
||||
|
||||
FunClip-2.2.0.zip
|
||||
SHA256 4f5a7d33d9ea65467f29b55b15ed5be18e64de7e57e2f9f36fe51a23b40557e7</code></pre>
|
||||
<p>Download the archives and <code>SHA256SUMS</code> from the <a href="https://github.com/modelscope/FunClip/releases/tag/v2.2.0">FunClip v2.2.0 release</a>.</p>
|
||||
|
||||
<div class="proof">Release content resolves to commit <code>c205bf32a8b11226ff5e8acb9a3c7a1f00cd3b06</code>. The repository suite completed with 84 passed and 1 skipped. A live H100 + vLLM two-speaker run returned S01/S02, valid SRT, and the expected S02 clip. This verifies the release path, not every language, audio condition, or production concurrency level.</div>
|
||||
<div class="cta"><p>Run one real two-speaker recording through the production guide, then bring the same service into FunClip.</p><a href="https://github.com/modelscope/FunClip/releases/tag/v2.2.0">Open the FunClip v2.2.0 release and downloads</a></div>
|
||||
</div></article>
|
||||
<footer>© 2024-2026 Tongyi Lab, Alibaba Group</footer>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
@@ -12,6 +12,8 @@
|
||||
<url><loc>https://www.funasr.com/en/ecosystem.html</loc><priority>0.8</priority><changefreq>weekly</changefreq></url>
|
||||
<url><loc>https://www.funasr.com/blog/</loc><priority>0.9</priority><changefreq>weekly</changefreq></url>
|
||||
<url><loc>https://www.funasr.com/en/blog/</loc><priority>0.9</priority><changefreq>weekly</changefreq></url>
|
||||
<url><loc>https://www.funasr.com/blog/funclip-v2-2-0-moss-speaker-clipping.html</loc><lastmod>2026-08-31</lastmod><priority>0.9</priority><changefreq>monthly</changefreq></url>
|
||||
<url><loc>https://www.funasr.com/en/blog/funclip-v2-2-0-moss-speaker-clipping.html</loc><lastmod>2026-08-31</lastmod><priority>0.9</priority><changefreq>monthly</changefreq></url>
|
||||
<url><loc>https://www.funasr.com/blog/funasr-v1-4-5-pypi-llama-cpp-release.html</loc><lastmod>2026-08-28</lastmod><priority>0.9</priority><changefreq>monthly</changefreq></url>
|
||||
<url><loc>https://www.funasr.com/en/blog/funasr-v1-4-5-pypi-llama-cpp-release.html</loc><lastmod>2026-08-28</lastmod><priority>0.9</priority><changefreq>monthly</changefreq></url>
|
||||
<url><loc>https://www.funasr.com/blog/funasr-v1-4-0-pypi-release.html</loc><lastmod>2026-07-31</lastmod><priority>0.9</priority><changefreq>monthly</changefreq></url>
|
||||
|
||||
@@ -373,18 +373,20 @@ for (const viewport of [
|
||||
{ name: 'mobile', width: 390, height: 844 },
|
||||
{ name: 'desktop', width: 1440, height: 900 },
|
||||
]) {
|
||||
test(`v1.4.5 release discovery is stable at ${viewport.name}`, async ({ page }, testInfo) => {
|
||||
test(`FunClip v2.2.0 MOSS release discovery is stable at ${viewport.name}`, async ({ page }, testInfo) => {
|
||||
await page.setViewportSize(viewport);
|
||||
for (const release of [
|
||||
{
|
||||
language: 'zh',
|
||||
index: '/blog/',
|
||||
article: '/blog/funasr-v1-4-5-pypi-llama-cpp-release.html',
|
||||
article: '/blog/funclip-v2-2-0-moss-speaker-clipping.html',
|
||||
previous: '/blog/funasr-v1-4-5-pypi-llama-cpp-release.html',
|
||||
},
|
||||
{
|
||||
language: 'en',
|
||||
index: '/en/blog/',
|
||||
article: '/en/blog/funasr-v1-4-5-pypi-llama-cpp-release.html',
|
||||
article: '/en/blog/funclip-v2-2-0-moss-speaker-clipping.html',
|
||||
previous: '/en/blog/funasr-v1-4-5-pypi-llama-cpp-release.html',
|
||||
},
|
||||
]) {
|
||||
await page.goto(release.index);
|
||||
@@ -392,18 +394,22 @@ for (const viewport of [
|
||||
page.locator(`.launch-feature a[href="${release.article}"]`),
|
||||
).toBeVisible();
|
||||
const history = page.locator('.previous-release .post-card');
|
||||
await expect(history).toHaveCount(3);
|
||||
await expect(history).toHaveCount(4);
|
||||
await expect(
|
||||
page.locator(`.previous-release a[href="${release.previous}"]`),
|
||||
).toBeVisible();
|
||||
const indexLayout = await history.evaluateAll((cards) => ({
|
||||
overflow: document.documentElement.scrollWidth - document.documentElement.clientWidth,
|
||||
rows: new Set(cards.map((card) => Math.round(card.getBoundingClientRect().top))).size,
|
||||
}));
|
||||
expect(indexLayout.overflow).toBeLessThanOrEqual(1);
|
||||
expect(indexLayout.rows).toBe(viewport.name === 'mobile' ? 3 : 1);
|
||||
expect(indexLayout.rows).toBe(viewport.name === 'mobile' ? 4 : 1);
|
||||
|
||||
await page.goto(release.article);
|
||||
await expect(page.locator('h1')).toContainText('FunASR v1.4.5');
|
||||
await expect(page.getByText('funasr[knf]==1.4.5', { exact: false })).toBeVisible();
|
||||
await expect(page.getByText('runtime-llamacpp-v0.2.1', { exact: false })).toBeVisible();
|
||||
await expect(page.locator('h1')).toContainText('FunClip v2.2.0');
|
||||
await expect(page.getByText('OpenMOSS-Team/MOSS-Transcribe-Diarize', { exact: false }).first()).toBeVisible();
|
||||
await expect(page.getByText('/v1/audio/transcriptions', { exact: false }).first()).toBeVisible();
|
||||
await expect(page.locator('img[src="/img/funclip-v2-1-0-interface.jpg"]')).toBeVisible();
|
||||
|
||||
const articleLayout = await page.evaluate(() => {
|
||||
const navigation = document.querySelector<HTMLElement>('nav.nav');
|
||||
@@ -419,7 +425,7 @@ for (const viewport of [
|
||||
|
||||
await page.screenshot({
|
||||
path: testInfo.outputPath(
|
||||
`v1.4.5-release-${release.language}-${viewport.name}.png`,
|
||||
`funclip-v2.2.0-moss-${release.language}-${viewport.name}.png`,
|
||||
),
|
||||
fullPage: true,
|
||||
});
|
||||
|
||||
@@ -421,3 +421,53 @@ def test_public_pages_do_not_overstate_sensevoice_language_or_speed_claims():
|
||||
violations.append(path.relative_to(LEGACY).as_posix())
|
||||
|
||||
assert violations == []
|
||||
|
||||
|
||||
def test_funclip_v220_moss_release_pages_are_bilingual_indexed_and_verifiable():
|
||||
slug = 'funclip-v2-2-0-moss-speaker-clipping.html'
|
||||
pages = {
|
||||
'zh': LEGACY / 'blog' / slug,
|
||||
'en': LEGACY / 'en' / 'blog' / slug,
|
||||
}
|
||||
language_contracts = {
|
||||
'zh': ('第三方模型', '段级时间戳', '不接外部 VAD 或说话人模型'),
|
||||
'en': ('third-party model', 'segment-level timestamps', 'no external VAD or speaker model'),
|
||||
}
|
||||
|
||||
for language, path in pages.items():
|
||||
text = path.read_text(encoding='utf-8')
|
||||
soup = BeautifulSoup(text, 'html.parser')
|
||||
hrefs = {link.get('href') for link in soup.select('a[href]')}
|
||||
|
||||
assert 'FunClip v2.2.0' in text
|
||||
assert 'OpenMOSS-Team/MOSS-Transcribe-Diarize' in text
|
||||
assert 'e8681d68e7042738ffca8ac8212bc8fcb1131ab8' in text
|
||||
assert '/v1/audio/transcriptions' in text
|
||||
assert 'response_format=json' in text
|
||||
assert '994c5d9cf392b74b36284d526eca8bada1560a3e7825ab7baa9c673a1b4ef216' in text
|
||||
assert '4f5a7d33d9ea65467f29b55b15ed5be18e64de7e57e2f9f36fe51a23b40557e7' in text
|
||||
assert all(marker in text for marker in language_contracts[language])
|
||||
assert {
|
||||
'https://github.com/modelscope/FunClip/releases/tag/v2.2.0',
|
||||
'/deploy/moss-transcribe-diarize.html'
|
||||
if language == 'zh'
|
||||
else '/en/deploy/moss-transcribe-diarize.html',
|
||||
} <= hrefs
|
||||
|
||||
route = f'/{"" if language == "zh" else "en/"}blog/{slug}'
|
||||
peer = f'/{"en/" if language == "zh" else ""}blog/{slug}'
|
||||
assert soup.select_one('link[rel="canonical"]')['href'].endswith(route)
|
||||
assert soup.select_one(f'link[rel="alternate"][href$="{peer}"]')
|
||||
image = soup.select_one('article img[src="/img/funclip-v2-1-0-interface.jpg"]')
|
||||
assert image
|
||||
metadata = json.loads(soup.select_one('script[type="application/ld+json"]').string)
|
||||
assert metadata['datePublished'] == '2026-08-31'
|
||||
assert metadata['dateModified'] == '2026-08-31'
|
||||
|
||||
zh_index = (LEGACY / 'blog' / 'index.html').read_text(encoding='utf-8')
|
||||
en_index = (LEGACY / 'en' / 'blog' / 'index.html').read_text(encoding='utf-8')
|
||||
sitemap = (LEGACY / 'sitemap.xml').read_text(encoding='utf-8')
|
||||
assert f'/blog/{slug}' in zh_index
|
||||
assert f'/en/blog/{slug}' in en_index
|
||||
assert f'https://www.funasr.com/blog/{slug}' in sitemap
|
||||
assert f'https://www.funasr.com/en/blog/{slug}' in sitemap
|
||||
|
||||
@@ -609,22 +609,61 @@ def test_v1_4_3_release_blog_is_bilingual_and_verifiable(
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
('relative', 'href'),
|
||||
('relative', 'feature_href', 'history_href'),
|
||||
(
|
||||
('blog/index.html', '/blog/funasr-v1-4-5-pypi-llama-cpp-release.html'),
|
||||
('en/blog/index.html', '/en/blog/funasr-v1-4-5-pypi-llama-cpp-release.html'),
|
||||
(
|
||||
'blog/index.html',
|
||||
'/blog/funclip-v2-2-0-moss-speaker-clipping.html',
|
||||
'/blog/funasr-v1-4-5-pypi-llama-cpp-release.html',
|
||||
),
|
||||
(
|
||||
'en/blog/index.html',
|
||||
'/en/blog/funclip-v2-2-0-moss-speaker-clipping.html',
|
||||
'/en/blog/funasr-v1-4-5-pypi-llama-cpp-release.html',
|
||||
),
|
||||
),
|
||||
)
|
||||
def test_blog_index_features_latest_release_and_preserves_history(
|
||||
built_site, relative, href
|
||||
built_site, relative, feature_href, history_href
|
||||
):
|
||||
soup = read_soup(built_site / relative)
|
||||
feature = soup.select_one(f'.launch-feature a[href="{href}"]')
|
||||
feature = soup.select_one(f'.launch-feature a[href="{feature_href}"]')
|
||||
|
||||
assert feature
|
||||
assert 'v1.4.5' in feature.get_text(' ', strip=True)
|
||||
assert 'FunClip v2.2.0' in feature.get_text(' ', strip=True)
|
||||
history = soup.select_one('.previous-release')
|
||||
assert history
|
||||
assert history.select_one(f'a[href="{history_href}"]')
|
||||
history_text = history.get_text(' ', strip=True)
|
||||
assert 'v1.4.5' in history_text
|
||||
assert 'v1.4.3' in history_text
|
||||
assert 'v1.4.0' in history_text
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
('relative', 'peer', 'guide'),
|
||||
(
|
||||
(
|
||||
'blog/funclip-v2-2-0-moss-speaker-clipping.html',
|
||||
'/en/blog/funclip-v2-2-0-moss-speaker-clipping.html',
|
||||
'/deploy/moss-transcribe-diarize.html',
|
||||
),
|
||||
(
|
||||
'en/blog/funclip-v2-2-0-moss-speaker-clipping.html',
|
||||
'/blog/funclip-v2-2-0-moss-speaker-clipping.html',
|
||||
'/en/deploy/moss-transcribe-diarize.html',
|
||||
),
|
||||
),
|
||||
)
|
||||
def test_funclip_v220_blog_builds_with_real_media_and_product_routes(
|
||||
built_site, relative, peer, guide
|
||||
):
|
||||
soup = read_soup(built_site / relative)
|
||||
assert soup.select_one(f'link[rel="alternate"][href$="{peer}"]')
|
||||
image = soup.select_one('article img[src]')
|
||||
assert image
|
||||
assert (built_site / image['src'].lstrip('/')).is_file()
|
||||
assert soup.select_one(f'a[href="{guide}"]')
|
||||
assert soup.select_one(
|
||||
'a[href="https://github.com/modelscope/FunClip/releases/tag/v2.2.0"]'
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user