From 721bda52805ff4ca2767e239bd93471a8eb7f55a Mon Sep 17 00:00:00 2001 From: huangjianwu Date: Sat, 9 May 2026 14:32:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(transcriber):=20=E9=BB=98=E8=AE=A4=20size?= =?UTF-8?q?=20=E6=94=B9=20tiny=20+=20=E5=88=87=E6=9C=AC=E5=9C=B0=E5=BC=95?= =?UTF-8?q?=E6=93=8E=E5=89=8D=20confirm=20=E6=A8=A1=E5=9E=8B=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 桌面端用户首次跑视频时挂在 fast-whisper 模型下载(默认 medium ~1.5GB), 两处改动: 1. backend/app/services/transcriber_config_manager.py: 默认 whisper_model_size 从 'medium' (~1.5GB) → 'tiny' (~75MB)。 新装用户没主动设置时不再被首次下载卡住;想要更高精度的用户去配置页主动切。 2. BillNote_frontend/src/pages/SettingPage/transcriber.tsx: handleSave 在保存前判断:选了 fast-whisper / mlx-whisper 且当前 size 在 modelStatuses 里既未下载也不在下载中 → window.confirm 弹一个体积提示, 推荐改用 Groq / 必剪 / 快手 等在线引擎;用户取消则不保存。 不改业务逻辑;零回归风险(已有用户 transcriber.json 里写了什么就还是什么)。 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/pages/SettingPage/transcriber.tsx | 22 +++++++++++++++++++ .../services/transcriber_config_manager.py | 9 ++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/BillNote_frontend/src/pages/SettingPage/transcriber.tsx b/BillNote_frontend/src/pages/SettingPage/transcriber.tsx index e13eb93..17f298c 100644 --- a/BillNote_frontend/src/pages/SettingPage/transcriber.tsx +++ b/BillNote_frontend/src/pages/SettingPage/transcriber.tsx @@ -73,6 +73,28 @@ export default function Transcriber() { }, [modelStatuses, mlxModelStatuses, fetchModelsStatus]) const handleSave = async () => { + // 切到本地 whisper 引擎且选了未下载的模型时,提前 confirm,避免用户保存后到首次任务才发现要下 GB 级模型 + if (isWhisperType(selectedType)) { + const pool = selectedType === 'mlx-whisper' ? mlxModelStatuses : modelStatuses + const target = pool.find(m => m.model_size === selectedModelSize) + if (target && !target.downloaded && !target.downloading) { + const sizeHint: Record = { + 'tiny': '~75MB', + 'base': '~150MB', + 'small': '~500MB', + 'medium': '~1.5GB', + 'large-v3': '~3GB', + 'large-v3-turbo': '~1.6GB', + } + const ok = window.confirm( + `选择 ${selectedType} / ${selectedModelSize} 后,首次转写时会下载该模型(${sizeHint[selectedModelSize] || '体积未知'})。\n` + + `网络较差时容易中断;推荐改用 Groq / 必剪 / 快手 等在线引擎。\n\n` + + '继续保存吗?', + ) + if (!ok) return + } + } + setSaving(true) try { const payload: { transcriber_type: string; whisper_model_size?: string } = { diff --git a/backend/app/services/transcriber_config_manager.py b/backend/app/services/transcriber_config_manager.py index d3a69e4..8205372 100644 --- a/backend/app/services/transcriber_config_manager.py +++ b/backend/app/services/transcriber_config_manager.py @@ -25,7 +25,12 @@ class TranscriberConfigManager: json.dump(data, f, ensure_ascii=False, indent=2) def get_config(self) -> Dict[str, Any]: - """获取当前转写器配置,fallback 到环境变量默认值。""" + """获取当前转写器配置,fallback 到环境变量默认值。 + + whisper 默认 size 从 'medium' (~1.5GB) 改为 'tiny' (~75MB): + 新装用户没主动设置时不应该被首次下载卡住。想要更高精度可在「音频转写配置」 + 页主动切换。 + """ data = self._read() return { "transcriber_type": data.get( @@ -34,7 +39,7 @@ class TranscriberConfigManager: ), "whisper_model_size": data.get( "whisper_model_size", - os.getenv("WHISPER_MODEL_SIZE", "medium"), + os.getenv("WHISPER_MODEL_SIZE", "tiny"), ), }