diff --git a/docs/community_projects.md b/docs/community_projects.md index 45ee4aeae3..9d4ccaff26 100644 --- a/docs/community_projects.md +++ b/docs/community_projects.md @@ -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). | diff --git a/docs/community_projects_zh.md b/docs/community_projects_zh.md index cdf8d24e1e..a4fadcc971 100644 --- a/docs/community_projects_zh.md +++ b/docs/community_projects_zh.md @@ -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)。 | diff --git a/scripts/check_funasr_website_static.py b/scripts/check_funasr_website_static.py index caa854f70d..de4d434937 100755 --- a/scripts/check_funasr_website_static.py +++ b/scripts/check_funasr_website_static.py @@ -73,6 +73,7 @@ class StaticAssetContract: "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 @@ class StaticAssetContract: "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+",), ), diff --git a/web-pages/product-site/content/legacy-manifest.json b/web-pages/product-site/content/legacy-manifest.json index eb55fe8c23..409843b053 100644 --- a/web-pages/product-site/content/legacy-manifest.json +++ b/web-pages/product-site/content/legacy-manifest.json @@ -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", diff --git a/web-pages/product-site/legacy/ecosystem.html b/web-pages/product-site/legacy/ecosystem.html index 1c971fd09d..4b661962d7 100644 --- a/web-pages/product-site/legacy/ecosystem.html +++ b/web-pages/product-site/legacy/ecosystem.html @@ -258,8 +258,8 @@

AI 平台与框架

GPT-SoVITS
58K stars
-
一分钟语音数据即可训练 TTS。使用 FunASR 进行训练数据标注。
-
TTS训练
+
训练数据标注与 WebUI 转写支持 Fun-ASR-Nano、SenseVoice 和经典 FunASR 模型。已合并的 #2824 将项目依赖修正为 Transformers >=4.51,<5:4.51 是其验证矩阵中首个可构建 Qwen3 的版本,避免选择 Fun-ASR-Nano 后在转写前触发 KeyError: qwen3。另见 runtime fallbackbackend 文档
+
TTS数据集转写Qwen3
LocalAI
diff --git a/web-pages/product-site/legacy/en/ecosystem.html b/web-pages/product-site/legacy/en/ecosystem.html index a253d5924d..902ed79361 100644 --- a/web-pages/product-site/legacy/en/ecosystem.html +++ b/web-pages/product-site/legacy/en/ecosystem.html @@ -259,8 +259,8 @@

AI Platforms & Frameworks

58K stars
-
1-minute voice data TTS. Uses FunASR for training data annotation — automatic speech-to-text labeling.
-
TTSTraining
+
Dataset annotation and WebUI transcription support Fun-ASR-Nano, SenseVoice, and classic FunASR models. Merged #2824 corrects the project requirement to Transformers >=4.51,<5: 4.51 is the first version in its validation matrix that constructs Qwen3, preventing KeyError: qwen3 before Fun-ASR-Nano transcription starts. See also the runtime fallback and backend guide.
+
TTSDataset transcriptionQwen3
diff --git a/web-pages/product-site/tests/browser/product-site.spec.ts b/web-pages/product-site/tests/browser/product-site.spec.ts index b93d809150..7fe3c4a0c1 100644 --- a/web-pages/product-site/tests/browser/product-site.spec.ts +++ b/web-pages/product-site/tests/browser/product-site.spec.ts @@ -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/'); diff --git a/web-pages/product-site/tests/test_legacy.py b/web-pages/product-site/tests/test_legacy.py index 327c4c195c..f920e8869e 100644 --- a/web-pages/product-site/tests/test_legacy.py +++ b/web-pages/product-site/tests/test_legacy.py @@ -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 = { diff --git a/web-pages/product-site/tests/test_output.py b/web-pages/product-site/tests/test_output.py index 8cc682bab0..a2412facd1 100644 --- a/web-pages/product-site/tests/test_output.py +++ b/web-pages/product-site/tests/test_output.py @@ -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'), (