mirror of
https://github.com/modelscope/FunASR.git
synced 2026-10-12 02:19:18 +00:00
docs(site): publish GPT-SoVITS Fun-ASR runtime contract (#3537)
Signed-off-by: LauraGPT <[email protected]>
This commit is contained in:
@@ -20,7 +20,7 @@ These integrations are community-maintained. Their release cadence, hardware sup
|
||||
| [QuQu](https://github.com/yan5xu/ququ) | A Chinese desktop voice-to-text workflow and open-source Wispr Flow alternative with a local FunASR Paraformer pipeline, bundled `funasr_server.py`, VAD, punctuation restoration, and optional LLM text optimization. | [Project README](https://github.com/yan5xu/ququ#readme), [FunASR server](https://github.com/yan5xu/ququ/blob/main/funasr_server.py), and [package metadata](https://github.com/yan5xu/ququ/blob/main/package.json). |
|
||||
| [OpenLess](https://github.com/Open-Less/openless) | An open-source macOS and Windows voice input app whose unified Bailian ASR provider exposes Fun-ASR-Flash recorded-file transcription alongside realtime ASR choices for cursor dictation and AI-prompt workflows. | [Project README](https://github.com/Open-Less/openless#readme), [DashScope multimodal ASR provider](https://github.com/Open-Less/openless/blob/beta/openless-all/app/src-tauri/src/asr/dashscope_multimodal.rs), [provider settings copy](https://github.com/Open-Less/openless/blob/beta/openless-all/app/src/i18n/en.ts), and merged [#793](https://github.com/Open-Less/openless/pull/793). |
|
||||
| [OmniVoice Studio](https://github.com/debpalash/OmniVoice-Studio) | A local voice-cloning, dubbing, dictation, and audiobook app with both an OpenAI-compatible remote ASR backend for self-hosted FunASR/SenseVoice servers and a native FunASR/SenseVoice + CAM++ path that keeps speaker identities consistent across whole recordings. | [OpenAI-compatible ASR guide](https://github.com/debpalash/OmniVoice-Studio/blob/main/docs/engines/openai-compatible-asr.md), [FunASR backend](https://github.com/debpalash/OmniVoice-Studio/blob/main/backend/services/asr_backend.py), merged [#1003](https://github.com/debpalash/OmniVoice-Studio/pull/1003), and merged [#1167](https://github.com/debpalash/OmniVoice-Studio/pull/1167). |
|
||||
| [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) | Dataset preparation and WebUI transcription with Fun-ASR-Nano, SenseVoice, and classic FunASR models. | [`funasr_asr.py`](https://github.com/RVC-Boss/GPT-SoVITS/blob/main/tools/asr/funasr_asr.py), runtime fallback [#2801](https://github.com/RVC-Boss/GPT-SoVITS/pull/2801), and backend documentation [#2803](https://github.com/RVC-Boss/GPT-SoVITS/pull/2803). |
|
||||
| [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) | Dataset preparation and WebUI transcription with Fun-ASR-Nano, SenseVoice, and classic FunASR models. Its merged Qwen3 dependency fix requires `Transformers >=4.51,<5`, preventing `KeyError: qwen3` before Nano transcription starts. | [`funasr_asr.py`](https://github.com/RVC-Boss/GPT-SoVITS/blob/main/tools/asr/funasr_asr.py), runtime fallback [#2801](https://github.com/RVC-Boss/GPT-SoVITS/pull/2801), backend documentation [#2803](https://github.com/RVC-Boss/GPT-SoVITS/pull/2803), and merged Transformers fix [#2824](https://github.com/RVC-Boss/GPT-SoVITS/pull/2824). |
|
||||
| [AudioNotes](https://github.com/harry0703/AudioNotes) | Audio and video note extraction to structured Markdown with Fun-ASR-MLT-Nano routed through the Fun-ASR Nano inference profile, including cache, batch size, and list-based hotwords. | [Project README](https://github.com/harry0703/AudioNotes#readme), [FunASR service](https://github.com/harry0703/AudioNotes/blob/main/app/services/asr_funasr.py), and merged [#65](https://github.com/harry0703/AudioNotes/pull/65). |
|
||||
| [Stet](https://github.com/DengNaichen/Stet) | A macOS local dictation app with an in-process Fun-ASR Nano engine, a universal static runtime derived from FunASR's `llama.cpp` path, Settings-managed encoder/decoder/VAD downloads, runtime reuse, and hotword support from the personal dictionary. | [FunASR package notes](https://github.com/DengNaichen/Stet/blob/main/Packages/StetEngine/Vendor/FunASRPackage/README.md), [Fun-ASR Nano spec](https://github.com/DengNaichen/Stet/blob/main/specs/009-fun-asr-nano/spec.md), and merged release [#44](https://github.com/DengNaichen/Stet/pull/44). |
|
||||
| [NarratoAI](https://github.com/linyqh/NarratoAI) | An AI video narration and editing app whose OpenAI-compatible transcription endpoint can point subtitle generation at a self-hosted FunASR service. | [FunASR subtitle service](https://github.com/linyqh/NarratoAI/blob/main/app/services/fun_asr_subtitle.py), [configuration example](https://github.com/linyqh/NarratoAI/blob/main/config.example.toml), and merged [#259](https://github.com/linyqh/NarratoAI/pull/259). |
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
| [蛐蛐 / QuQu](https://github.com/yan5xu/ququ) | 中文桌面语音转文字工作流,也是 Wispr Flow 的开源替代方案;内置本地 FunASR Paraformer pipeline、`funasr_server.py`、VAD、标点恢复,并可接入 LLM 文本优化。 | [项目 README](https://github.com/yan5xu/ququ#readme)、[FunASR server](https://github.com/yan5xu/ququ/blob/main/funasr_server.py) 和 [package metadata](https://github.com/yan5xu/ququ/blob/main/package.json)。 |
|
||||
| [OpenLess](https://github.com/Open-Less/openless) | macOS 与 Windows 开源语音输入应用;统一 Bailian ASR provider 暴露 Fun-ASR-Flash 录音文件转写,并与实时 ASR 选项一起服务于光标听写和 AI prompt 工作流。 | [项目 README](https://github.com/Open-Less/openless#readme)、[DashScope multimodal ASR provider](https://github.com/Open-Less/openless/blob/beta/openless-all/app/src-tauri/src/asr/dashscope_multimodal.rs)、[provider settings copy](https://github.com/Open-Less/openless/blob/beta/openless-all/app/src/i18n/zh-CN.ts) 和已合并 [#793](https://github.com/Open-Less/openless/pull/793)。 |
|
||||
| [OmniVoice Studio](https://github.com/debpalash/OmniVoice-Studio) | 本地语音克隆、配音、听写和有声书应用;既可通过 OpenAI 兼容远程 ASR backend 连接自托管 FunASR/SenseVoice 服务,也提供原生 FunASR/SenseVoice + CAM++ 路径,让整段录音里的 speaker identity 保持一致。 | [OpenAI 兼容 ASR 指南](https://github.com/debpalash/OmniVoice-Studio/blob/main/docs/engines/openai-compatible-asr.md)、[FunASR backend](https://github.com/debpalash/OmniVoice-Studio/blob/main/backend/services/asr_backend.py)、已合并 [#1003](https://github.com/debpalash/OmniVoice-Studio/pull/1003) 和已合并 [#1167](https://github.com/debpalash/OmniVoice-Studio/pull/1167)。 |
|
||||
| [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) | 使用 Fun-ASR-Nano、SenseVoice 和经典 FunASR 模型完成数据集预处理与 WebUI 转写。 | [`funasr_asr.py`](https://github.com/RVC-Boss/GPT-SoVITS/blob/main/tools/asr/funasr_asr.py)、runtime fallback [#2801](https://github.com/RVC-Boss/GPT-SoVITS/pull/2801) 和 backend 文档 [#2803](https://github.com/RVC-Boss/GPT-SoVITS/pull/2803)。 |
|
||||
| [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) | 使用 Fun-ASR-Nano、SenseVoice 和经典 FunASR 模型完成数据集预处理与 WebUI 转写。已合并的 Qwen3 依赖修复要求 `Transformers >=4.51,<5`,避免 Nano 转写开始前触发 `KeyError: qwen3`。 | [`funasr_asr.py`](https://github.com/RVC-Boss/GPT-SoVITS/blob/main/tools/asr/funasr_asr.py)、runtime fallback [#2801](https://github.com/RVC-Boss/GPT-SoVITS/pull/2801)、backend 文档 [#2803](https://github.com/RVC-Boss/GPT-SoVITS/pull/2803) 和已合并 Transformers 修复 [#2824](https://github.com/RVC-Boss/GPT-SoVITS/pull/2824)。 |
|
||||
| [AudioNotes](https://github.com/harry0703/AudioNotes) | 将音视频内容提取为结构化 Markdown 笔记,并把 Fun-ASR-MLT-Nano 路由到 Fun-ASR Nano 推理配置,保留 cache、batch size 和列表式 hotwords。 | [项目 README](https://github.com/harry0703/AudioNotes#readme)、[FunASR 服务](https://github.com/harry0703/AudioNotes/blob/main/app/services/asr_funasr.py) 和已合并 [#65](https://github.com/harry0703/AudioNotes/pull/65)。 |
|
||||
| [Stet](https://github.com/DengNaichen/Stet) | macOS 本地听写应用,内置 in-process Fun-ASR Nano 引擎;其 universal static runtime 源自 FunASR `llama.cpp` 路径,并通过 Settings 管理 encoder、decoder、VAD 下载,支持 runtime 复用和个人词典 hotwords。 | [FunASR package 说明](https://github.com/DengNaichen/Stet/blob/main/Packages/StetEngine/Vendor/FunASRPackage/README.md)、[Fun-ASR Nano spec](https://github.com/DengNaichen/Stet/blob/main/specs/009-fun-asr-nano/spec.md) 和已合并 release [#44](https://github.com/DengNaichen/Stet/pull/44)。 |
|
||||
| [NarratoAI](https://github.com/linyqh/NarratoAI) | AI 视频解说与剪辑应用,可通过 OpenAI 兼容转写 endpoint,把字幕生成连接到自托管 FunASR 服务。 | [FunASR 字幕服务](https://github.com/linyqh/NarratoAI/blob/main/app/services/fun_asr_subtitle.py)、[配置示例](https://github.com/linyqh/NarratoAI/blob/main/config.example.toml) 和已合并 [#259](https://github.com/linyqh/NarratoAI/pull/259)。 |
|
||||
|
||||
@@ -73,6 +73,7 @@ PAGE_CONTRACTS: dict[str, PageContract] = {
|
||||
"https://github.com/0xShug0/audio.cpp",
|
||||
"https://github.com/0xShug0/audio.cpp/pull/155",
|
||||
"https://github.com/0xShug0/audio.cpp/blob/1778b23a5f6a4951c788e4bb0e7baa04f20012a2/docs/models/fun_asr_nano.md",
|
||||
"https://github.com/RVC-Boss/GPT-SoVITS/pull/2824",
|
||||
),
|
||||
forbidden=("16K+",),
|
||||
),
|
||||
@@ -94,6 +95,7 @@ PAGE_CONTRACTS: dict[str, PageContract] = {
|
||||
"https://github.com/0xShug0/audio.cpp",
|
||||
"https://github.com/0xShug0/audio.cpp/pull/155",
|
||||
"https://github.com/0xShug0/audio.cpp/blob/1778b23a5f6a4951c788e4bb0e7baa04f20012a2/docs/models/fun_asr_nano.md",
|
||||
"https://github.com/RVC-Boss/GPT-SoVITS/pull/2824",
|
||||
),
|
||||
forbidden=("16K+",),
|
||||
),
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
"css/index.1682178c.css": "b5f6034ce886c25773928c114e4290d1c491a3d081677b488810198efd76b4e1",
|
||||
"decoder.js": "f2023a28036b1ff58e5bdabbb72ea427f8faaf60e89acd78ff183c313bdb0a2c",
|
||||
"donors.html": "eec6b789b29c27d372925ae0ad3e13d4c6e62978b3c38c4da9e3aec129f10934",
|
||||
"ecosystem.html": "31d47b029688be0d76b78472e2c880bcdaa1ea6d7bfb42bc35fe4d4850d2359a",
|
||||
"ecosystem.html": "ed798d76a2ece6140695f76097299d04187c7844c8575b16132d2aadbda96d76",
|
||||
"en/blog/cantonese-speech-recognition.html": "b9bd146198206f781c37f341c370a690dc83cd7163334e34b4e7f65e69af8ff2",
|
||||
"en/blog/chinese-speech-recognition.html": "16b68bd2a1122236c580c62275002ae2c0875ca14e32686e88d3b5ccfa9f56ef",
|
||||
"en/blog/fun-asr-nano-guide.html": "1746c708bd0606188de4266d8255984dd9e14634af33c54ad65a5f05b767be1b",
|
||||
@@ -75,7 +75,7 @@
|
||||
"en/blog/voice-activity-detection-python.html": "d12f5d0f4ae07c3434f6188d12f5603b8abb9578413b79133668638d1c5e18a7",
|
||||
"en/blog/which-funasr-model.html": "1207180aa929a3aa51db136c1098f4edc8f07405e2b56fe033998bf996f8ec7f",
|
||||
"en/donors.html": "eacb7f9434b1b29e13e9b0175bb9680556ee72ab4dbd155e68f9c912eb0212b1",
|
||||
"en/ecosystem.html": "8995530458be152971aba62ff6a4004af8d309ecafee82d9807746d058bde1ab",
|
||||
"en/ecosystem.html": "7fca42c76c1884f26847884c32d29fddc5c020b208979dee0930009d65533c0d",
|
||||
"en/index.html": "d86effc3bf4d218eabd465cbbe026f62c98dd50110ddd58251d9d271a64882a2",
|
||||
"en/llama-cpp.html": "dbfbd125ebbf07f7d923c91b122818f8b09484ce54c1e80eba66a89d22dfb5b4",
|
||||
"en/models.html": "321a63caace107d5ce6d470948c2f5954f2d8e25306d8227b4a85ec3663ad49e",
|
||||
|
||||
@@ -258,8 +258,8 @@ footer a{color:#60a5fa}
|
||||
<div class="card">
|
||||
<div class="card-title"><a href="https://github.com/RVC-Boss/GPT-SoVITS">GPT-SoVITS</a></div>
|
||||
<div class="card-stars">58K stars</div>
|
||||
<div class="card-desc">一分钟语音数据即可训练 TTS。使用 FunASR 进行训练数据标注。</div>
|
||||
<div><span class="card-tag">TTS</span><span class="card-tag">训练</span></div>
|
||||
<div class="card-desc">训练数据标注与 WebUI 转写支持 Fun-ASR-Nano、SenseVoice 和经典 FunASR 模型。已合并的 <a href="https://github.com/RVC-Boss/GPT-SoVITS/pull/2824">#2824</a> 将项目依赖修正为 <code>Transformers >=4.51,<5</code>:4.51 是其验证矩阵中首个可构建 Qwen3 的版本,避免选择 Fun-ASR-Nano 后在转写前触发 <code>KeyError: qwen3</code>。另见 <a href="https://github.com/RVC-Boss/GPT-SoVITS/pull/2801">runtime fallback</a> 与 <a href="https://github.com/RVC-Boss/GPT-SoVITS/pull/2803">backend 文档</a>。</div>
|
||||
<div><span class="card-tag">TTS</span><span class="card-tag">数据集转写</span><span class="card-tag">Qwen3</span></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-title"><a href="https://github.com/mudler/LocalAI">LocalAI</a></div>
|
||||
|
||||
@@ -259,8 +259,8 @@ footer a{color:#60a5fa}
|
||||
<div class="card">
|
||||
<div class="card-title"><a href="https://github.com/RVC-Boss/GPT-SoVITS">GPT-SoVITS</a></div>
|
||||
<div class="card-stars">58K stars</div>
|
||||
<div class="card-desc">1-minute voice data TTS. Uses FunASR for training data annotation — automatic speech-to-text labeling.</div>
|
||||
<div><span class="card-tag">TTS</span><span class="card-tag">Training</span></div>
|
||||
<div class="card-desc">Dataset annotation and WebUI transcription support Fun-ASR-Nano, SenseVoice, and classic FunASR models. Merged <a href="https://github.com/RVC-Boss/GPT-SoVITS/pull/2824">#2824</a> corrects the project requirement to <code>Transformers >=4.51,<5</code>: 4.51 is the first version in its validation matrix that constructs Qwen3, preventing <code>KeyError: qwen3</code> before Fun-ASR-Nano transcription starts. See also the <a href="https://github.com/RVC-Boss/GPT-SoVITS/pull/2801">runtime fallback</a> and <a href="https://github.com/RVC-Boss/GPT-SoVITS/pull/2803">backend guide</a>.</div>
|
||||
<div><span class="card-tag">TTS</span><span class="card-tag">Dataset transcription</span><span class="card-tag">Qwen3</span></div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-title"><a href="https://github.com/mudler/LocalAI">LocalAI</a></div>
|
||||
|
||||
@@ -293,6 +293,35 @@ for (const viewport of [
|
||||
});
|
||||
}
|
||||
|
||||
for (const viewport of [
|
||||
{ name: 'mobile', width: 390, height: 844 },
|
||||
{ name: 'desktop', width: 1440, height: 900 },
|
||||
]) {
|
||||
test(`GPT-SoVITS dependency contract is stable at ${viewport.name}`, async ({ page }, testInfo) => {
|
||||
await page.setViewportSize(viewport);
|
||||
|
||||
for (const route of ['/ecosystem.html', '/en/ecosystem.html']) {
|
||||
await page.goto(route);
|
||||
const card = page.locator('.card').filter({ hasText: 'GPT-SoVITS' });
|
||||
|
||||
await expect(card).toHaveCount(1);
|
||||
await expect(card).toContainText('Transformers >=4.51,<5');
|
||||
await expect(card.locator('.card-tag', { hasText: 'Qwen3' })).toBeVisible();
|
||||
await expect(card.locator('a[href="https://github.com/RVC-Boss/GPT-SoVITS/pull/2824"]')).toBeVisible();
|
||||
|
||||
const layout = await page.evaluate(() => ({
|
||||
overflow: document.documentElement.scrollWidth - document.documentElement.clientWidth,
|
||||
}));
|
||||
expect(layout.overflow).toBeLessThanOrEqual(1);
|
||||
}
|
||||
|
||||
await page.screenshot({
|
||||
path: testInfo.outputPath(`gpt-sovits-ecosystem-${viewport.name}.png`),
|
||||
fullPage: true,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
test('reduced motion disables smooth scrolling', async ({ page }) => {
|
||||
await page.emulateMedia({ reducedMotion: 'reduce' });
|
||||
await page.goto('/en/');
|
||||
|
||||
@@ -219,6 +219,13 @@ def test_recent_merged_ecosystem_integrations_are_bilingual_and_attributed():
|
||||
'pull': 'https://github.com/OpenBMB/UltraEval-Audio/pull/47',
|
||||
'terms': ('Fun-ASR-Nano', 'revision'),
|
||||
},
|
||||
'GPT-SoVITS': {
|
||||
'repo': 'https://github.com/RVC-Boss/GPT-SoVITS',
|
||||
'pull': 'https://github.com/RVC-Boss/GPT-SoVITS/pull/2824',
|
||||
'terms': ('Fun-ASR-Nano', 'Transformers', '4.51', '<5'),
|
||||
'zh_terms': ('Qwen3', '转写'),
|
||||
'en_terms': ('Qwen3', 'transcription'),
|
||||
},
|
||||
}
|
||||
|
||||
for language, path in pages.items():
|
||||
@@ -239,6 +246,17 @@ def test_recent_merged_ecosystem_integrations_are_bilingual_and_attributed():
|
||||
assert all(term in text for term in language_terms)
|
||||
|
||||
|
||||
def test_gpt_sovits_community_docs_track_the_merged_qwen3_dependency_fix():
|
||||
for relative in ('community_projects.md', 'community_projects_zh.md'):
|
||||
text = (Path(__file__).resolve().parents[3] / 'docs' / relative).read_text(
|
||||
encoding='utf-8'
|
||||
)
|
||||
assert 'https://github.com/RVC-Boss/GPT-SoVITS/pull/2824' in text
|
||||
assert 'Transformers' in text
|
||||
assert '4.51' in text
|
||||
assert '<5' in text
|
||||
|
||||
|
||||
def test_v140_release_pages_are_bilingual_indexed_and_precise():
|
||||
slug = 'funasr-v1-4-0-pypi-release.html'
|
||||
pages = {
|
||||
|
||||
@@ -393,6 +393,28 @@ def test_ecosystem_refresh_tracks_current_release_and_merged_native_runtime(
|
||||
assert marker in card_text
|
||||
|
||||
|
||||
@pytest.mark.parametrize('relative', ('ecosystem.html', 'en/ecosystem.html'))
|
||||
def test_gpt_sovits_card_exposes_the_merged_qwen3_runtime_contract(
|
||||
built_site, relative
|
||||
):
|
||||
soup = read_soup(built_site / relative)
|
||||
anchor = soup.select_one(
|
||||
'.card-title a[href="https://github.com/RVC-Boss/GPT-SoVITS"]'
|
||||
)
|
||||
assert anchor
|
||||
card = anchor.find_parent(class_='card')
|
||||
assert card
|
||||
links = {link.get('href') for link in card.select('a[href]')}
|
||||
assert {
|
||||
'https://github.com/RVC-Boss/GPT-SoVITS/pull/2801',
|
||||
'https://github.com/RVC-Boss/GPT-SoVITS/pull/2803',
|
||||
'https://github.com/RVC-Boss/GPT-SoVITS/pull/2824',
|
||||
} <= links
|
||||
text = card.get_text(' ', strip=True)
|
||||
for marker in ('Fun-ASR-Nano', 'Transformers', '>=4.51,<5', 'Qwen3', 'KeyError'):
|
||||
assert marker in text
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
('relative', 'peer', 'markers'),
|
||||
(
|
||||
|
||||
Reference in New Issue
Block a user