From 3841719d5ae4279c60e1326eacd1077841f15d20 Mon Sep 17 00:00:00 2001 From: huangjianwu Date: Tue, 23 Jun 2026 10:01:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(transcriber):=20=E4=BF=AE=E5=A4=8D=20large-?= =?UTF-8?q?v3-turbo=20=E5=9B=A0=E4=BB=93=E5=BA=93=20404=20=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Systran/faster-whisper-large-v3-turbo 已从 HuggingFace 下架(API 返回 401/404,仓库不存在)。用户点击下载后,后台 snapshot_download 立即抛错 被吞掉,_downloading 置为 failed 但状态接口只回传 downloading/downloaded 两个布尔,于是表现为:无进度转圈、状态一直「未下载」、前端无错误提示。 改用社区维护的 CT2 转换版 deepdml/faster-whisper-large-v3-turbo-ct2: HF 直链可达(200,无重定向,保证缓存目录名与存在性检测一致),含 model.bin 等全部所需文件,与 faster-whisper 的 large-v3-turbo 等价。 附回归测试,断言 large-v3-turbo 解析到存活仓库而非已失效的 Systran 仓库。 Closes #402 Co-Authored-By: Claude Opus 4.8 (1M context) --- backend/app/transcriber/whisper_models.py | 11 ++++++++--- backend/tests/test_whisper_models.py | 14 +++++++++++++- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/backend/app/transcriber/whisper_models.py b/backend/app/transcriber/whisper_models.py index 71dde1c..3a57b8f 100644 --- a/backend/app/transcriber/whisper_models.py +++ b/backend/app/transcriber/whisper_models.py @@ -6,7 +6,8 @@ 检测三处,用户想用命名不符合该约定的模型(比如社区微调版、或自己下到本地的模型)就接不上。 本模块把映射**显式化 + 可配置**(对齐 mlx_whisper_transcriber.MLX_MODEL_MAP 的模式): - - 内置:size → Systran/faster-whisper-{size} + - 内置:size → faster-whisper 兼容的 CT2 repo_id(多数为 Systran/faster-whisper-{size}; + turbo 用社区维护版,见 BUILTIN_WHISPER_MODELS) - 自定义:用户在 config/whisper_models.json 登记 {名称: ""} (JSON 持久化;Docker 下随 config 卷持久化) @@ -22,7 +23,8 @@ from app.utils.logger import get_logger logger = get_logger(__name__) -# 内置模型:size → faster-whisper 兼容的 HF repo_id(CTranslate2 转换版,Systran 官方维护)。 +# 内置模型:size → faster-whisper 兼容的 HF repo_id(CTranslate2 转换版)。 +# 多数档位用 Systran 官方维护的转换版;turbo 例外见下。 BUILTIN_WHISPER_MODELS: Dict[str, str] = { "tiny": "Systran/faster-whisper-tiny", "base": "Systran/faster-whisper-base", @@ -31,7 +33,10 @@ BUILTIN_WHISPER_MODELS: Dict[str, str] = { "large-v1": "Systran/faster-whisper-large-v1", "large-v2": "Systran/faster-whisper-large-v2", "large-v3": "Systran/faster-whisper-large-v3", - "large-v3-turbo": "Systran/faster-whisper-large-v3-turbo", + # issue #402:Systran 没有 turbo 的 CT2 转换版(Systran/faster-whisper-large-v3-turbo + # 在 HF 上 401/404),点下载会静默失败、状态一直「未下载」。改用社区维护的 CT2 转换版 + # (deepdml,直链可达、含 model.bin,与 faster-whisper 的 large-v3-turbo 等价)。 + "large-v3-turbo": "deepdml/faster-whisper-large-v3-turbo-ct2", } # 前端下拉默认展示的内置档位(保持与历史 WHISPER_MODEL_SIZES 一致,不把 8 个全列出来) diff --git a/backend/tests/test_whisper_models.py b/backend/tests/test_whisper_models.py index 0f323c1..9f57dba 100644 --- a/backend/tests/test_whisper_models.py +++ b/backend/tests/test_whisper_models.py @@ -50,7 +50,19 @@ class TestResolve(unittest.TestCase): def test_builtin_resolves_to_systran(self): self.assertEqual(self.reg.resolve("tiny"), "Systran/faster-whisper-tiny") - self.assertEqual(self.reg.resolve("large-v3-turbo"), "Systran/faster-whisper-large-v3-turbo") + + def test_large_v3_turbo_resolves_to_live_repo(self): + # 回归 issue #402:Systran 从未发布 turbo 的 CT2 转换版, + # 原映射 Systran/faster-whisper-large-v3-turbo 在 HF 上 401/404, + # 导致下载静默失败、状态一直「未下载」。改用社区维护的 CT2 转换版。 + self.assertEqual( + self.reg.resolve("large-v3-turbo"), + "deepdml/faster-whisper-large-v3-turbo-ct2", + ) + self.assertNotEqual( + self.reg.resolve("large-v3-turbo"), + "Systran/faster-whisper-large-v3-turbo", + ) def test_passthrough_repo_id(self): # 用户直接把 HF repo_id 当 model_size 传进来(含 "/")