Skip to content

【bug】UI 选择 MLX Whisper 后生成笔记必报“服务器错误”:MLXWhisperTranscriber 用环境变量做守卫,与配置流冲突 #467

Open

Description

@TomRush-qn

现象

设置页选择 MLX Whisper 并保存成功(TranscriberConfigManager 正确落盘,/api/transcriber_config 也返回 transcriber_type: "mlx-whisper"),但点生成笔记必报"服务器错误"。后端日志:

请求转录器类型: mlx-whisper
创建 MLXWhisperTranscriber 实例: TranscriberType.MLX_WHISPER
MLXWhisperTranscriber 创建失败: 必须设置环境变量 TRANSCRIBER_TYPE=mlx-whisper 才能使用 MLX Whisper

根因

app/transcriber/mlx_whisper_transcriber.py 的 __init__:

if platform.system() != "Darwin":
    raise RuntimeError("MLX Whisper 仅支持 Apple 平台")

if os.environ.get("TRANSCRIBER_TYPE") != "mlx-whisper":
    raise RuntimeError("必须设置环境变量 TRANSCRIBER_TYPE=mlx-whisper 才能使用 MLX Whisper")

问题:

  1. 守卫读的是环境变量,而转写器选择的 source of truth 是配置文件(TranscriberConfigManager,env 仅作缺省 fallback)。UI 保存的 mlx-whisper 不会写进进程环境变量 → 两者永远对不上,UI 路径选 MLX 必然失败。
  2. 守卫不对称:WhisperTranscriber/Bcut/Groq/快手 都没有同类检查,唯独 MLX 有。且上一行已经有 platform.system() != "Darwin" 的平台守卫,env 检查属于冗余。
  3. 对桌面版(PyInstaller)用户是无解的:冻结环境无法设环境变量,等于 UI 里的 MLX 选项永远点不通。

建议修复

直接删除该 env 检查(平台检查已足够);如确需保留开关语义,应由调用方(transcriber_provider 按配置路由)传入,而不是在构造器里读全局环境变量。

桌面版临时绕过

在后端 cwd 放 .env 写入 TRANSCRIBER_TYPE=mlx-whisper(main.py 的 load_dotenv() 会加载),守卫即放行。已在 macOS 桌面版 v2.4.5 + 注入 mlx-whisper 0.4.3 的环境实测放行成功。

环境

  • BiliNote 桌面版 v2.4.5(macOS arm64,Apple Silicon)
  • mlx-whisper 0.4.3 / mlx 0.32.4(手工注入验证可用,mlx_whisper_available: true)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions