架构与插件生命周期
TransBox 以流水线为中心:音频或字幕进来 → 识别 → 翻译 → 展示/朗读。插件挂在明确的扩展点上。
1. 流水线与中间件插入点
[音频捕获 / 浏览器字幕]
│
▼
process_audio ← middleware
│
▼
VAD 断句
│
▼
ASR 识别 ← asr Provider
│
▼
process_transcript ← middleware
│
▼
术语 Prompt 注入 + MT ← mt Provider + glossary
│
▼
process_translation ← middleware
│
├──► UI 字幕
└──► TTS 朗读 ← tts Provider
│
▼
process_tts_audio ← middleware
│
▼
声卡播放中间件按 priority 升序执行(数字越小越先跑,默认 100)。单个中间件抛异常会被隔离,不拖垮整条链。
术语库实际顺序:翻译前注入提示词 → mt.translate(...) → 中间件改译文 → 术语强制替换。
2. 插件发现
启动时扫描:
- 内置 manifests(builtin 引擎、默认主题、浏览器字幕桥等)
- 应用/项目
extensions/*/ %APPDATA%/transbox/extensions/*/- Steam:
steamapps/workshop/content/1316080/*/(每子目录需有mod.json)
清单文件名:优先 mod.json,回退 manifest.json。没有 id 的清单会被拒绝。
用户在界面开关的状态会写入 QSettings(plugins_state),下次启动恢复。
3. 启用 / 禁用行为(代码事实)
| 类型 | 启用 | 禁用 |
|---|---|---|
glossary | 注册进全局术语管理器 | 注销 |
i18n | 切换到该语言;与其他第三方语言包互斥 | 若当前是该语言则回退 zh-CN |
theme (full) | 应用主题;与其他 full 主题互斥 | 回退默认主题 |
| 同插槽 UI 扩展 | 占用同一插槽时互斥停用他人 | 移除该插槽组件 |
asr/mt/tts | 可设为当前引擎 | 若是活跃引擎则 fallback 到其它已启用引擎 |
middleware | 挂入中间件管理器 | 卸载 |
| 内置默认主题 | 禁止禁用 | — |
| 内置浏览器字幕桥 | 联动 Web 服务开关 | 联动关闭服务 |
4. Python 类加载
对 asr / mt / tts / middleware:
- 解析
entrypoint为相对路径.py:ClassName(无冒号则ClassName="Plugin") importlib从文件加载模块- 要求类继承
BasePlugin子类 cls(manifest)→initialize(config)- 实例缓存;卸载时
shutdown()
配置:
- UI 用
config_schema渲染表单 - 保存进 QSettings
plugins_config/<id> - Python 侧在
self._config读取;update_config热更新
5. 与 UI 的关系
- 字幕、设置、历史等窗口通过插槽加载 QML(见 UI 插槽)。
has_settings_tab: true时,启用后设置中心会多出一个 Tab(tab_id/tab_title)。- 引擎类插件无需写设置 UI:声明
config_schema即可自动生成表单。
6. 安全模型(务必阅读)
- 无沙箱:Python 插件与主程序同进程、同权限。
- 数据类(
theme/glossary/i18n)风险较低;脚本类请审计后安装。 - 工坊提供安全须知与「一键停用全部第三方扩展」。