面向英文学术会议的实时同声传译工具:抓取麦克风或系统回环声音,本地做语音识别(ASR),再调用大模型流式翻译成中文,中英对照实时滚动显示,并可导出 Word / PDF / Markdown。
支持物理等专业场景的术语表(ASR 提示词 + 译文纠正),会根据电源状态自动切换识别模型与 GPU 功耗。
English: A real-time English→Chinese speech translator for academic meetings on Windows. Local ASR via
faster-whisper/CTranslate2 on GPU, streaming translation via any OpenAI-compatible LLM API, live bilingual view with glossary support, and export to DOCX/PDF/Markdown. Ships without PyTorch — the VAD runs on ONNX Runtime and only ~750 MB of CUDA runtime libraries are bundled, keeping the portable build at ~1.1 GB instead of ~4.6 GB.
- 实时同传:边说边出中英对照,采集 → 分段 → 识别 → 翻译全程流水线,互不阻塞
- 两种音源:麦克风(现场会议 / 外放)或系统回环(腾讯会议、Zoom 等线上会议)
- GPU 加速识别:基于
faster-whisper+ CTranslate2,插电用distil-whisper-large-v3,离电自动换small.en+ int8 - 流式翻译:任意 OpenAI 兼容接口(智谱 GLM、硅基流动、DeepSeek…),逐 token 流式回填
- 专业术语表:
glossary.json配置术语对照与译文修正,识别时作为提示词、翻译时按段挑选相关术语,支持热重载 - 会话管理:历史记录自动落盘、搜索、双击重命名、右键删除
- 一键导出:Word / PDF / Markdown,支持纯中文、纯英文、左右对照、段段交替四种排版
- 免 Python 分发:打包后目标机器不装 Python 也能双击运行
- API Key 加密存储:Fernet 加密 + 本机机器指纹,换机自动失效而不是明文泄露
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10 / 11(64 位) |
| GPU | NVIDIA 显卡(CUDA 12 + cuDNN 9 运行库已随包内置,无需自己装 CUDA) |
| Python | 仅源码运行需要,3.12;打包版不用装任何东西 |
| 磁盘 | 打包版约 1.1 GB;ASR 模型另需 0.5~1.5 GB |
| 网络 | 翻译需要能访问所选的大模型 API |
CUDA 运行库(cuBLAS/cuDART)已经打进
_internal/ctranslate2/,目标机器不需要安装 CUDA Toolkit。
- 解压
SpeechTranslator-bundle.zip - 把 ASR 模型放到
E:\models\(或改设置,见下) - 双击
SpeechTranslator.exe - 点右上角 ⚙ → 「翻译」页填 API Key → 保存
- 点「▶ 开始翻译」
首次运行前建议先自检,确认环境没有缺件:
SpeechTranslator.exe --selftest它会把依赖、VAD、CUDA 识别、导出、界面逐个跑一遍,结果同时打印到控制台并写入 exe 同目录的 selftest_report.txt(窗口版没有控制台,所以必须落盘)。全部通过返回 0。
git clone <this-repo>
cd meeting_translator
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
python main.py识别模型不随包分发(太大),需要自己下载放到本地目录。项目默认读取 E:\models:
pip install huggingface_hub
hf download Systran/faster-distil-whisper-large-v3 ^
--local-dir E:\models\faster-distil-whisper-large-v3
hf download Systran/faster-whisper-small.en ^
--local-dir E:\models\faster-whisper-small.en| 档位 | 模型 | compute_type |
|---|---|---|
| 插电 / 台式机 | faster-distil-whisper-large-v3 |
float16 |
| 离电 | faster-whisper-small.en |
int8_float16 |
模型路径可以直接在 设置 → 识别 → 插电时模型 / 离电时模型 里改
点右上角 ⚙ 打开设置,共五页:
| 页 | 内容 |
|---|---|
| 音频 | 音源选择:麦克风 / 系统回环 |
| 识别 | 插电与离电的模型目录、静音阈值(切段灵敏度)、单段最长时长 |
| 翻译 | API 地址、模型名、API Key(密文显示,可临时查看) |
| 显示 | 正文字号(9–24)、英文字体、中文字体 |
| 术语表 | 直接编辑 glossary.json,带 JSON 格式化按钮 |
常用翻译服务配置(也可在界面里改):
智谱 https://open.bigmodel.cn/api/paas/v4 GLM-4-Flash-250414
硅基流动 https://api.siliconflow.cn/v1 Qwen/Qwen2.5-7B-Instruct
DeepSeek https://api.deepseek.com/v1 deepseek-chat
也支持环境变量:SILICONFLOW_API_KEY / MT_BASE_URL / MT_MODEL。
{
"version": 1,
"terms": {
"Hamiltonian": "哈密顿量",
"renormalization group": "重整化群"
},
"fixups": {
"哈密顿算子": "哈密顿量",
"重正化": "重整化"
}
}terms:术语对照。识别阶段作为 Whisper 提示词;翻译阶段只挑当前段落里真正出现的条目塞进 system prompt,避免一次塞几百条fixups:译文后处理替换,用来兜住模型偶尔用错的专业词
python build.py产物:
| 路径 | 说明 |
|---|---|
dist/SpeechTranslator/ |
可直接运行的目录 |
release/SpeechTranslator-bundle.zip |
分发用压缩包(约 685 MB) |
打包要点都在 build.spec 的注释里,主要包括:
- 不含 PyTorch。VAD 用 ONNX Runtime 直接跑
assets/silero_vad.onnx;ctranslate2.converters(会import torch)被整条排除 - 自带 CUDA 运行库。
cublas64_12.dll、cublasLt64_12.dll、cudart64_12.dll会被收集进_internal/ctranslate2/,并由cuda_env.py注册搜索目录(源码运行时同一个模块同样生效) - CUDA DLL 的来源优先是官方 NVIDIA 轮子(
nvidia-cublas-cu12等),找不到才回退torch\lib。缺了会直接报错终止,而不是产出一个跑不了 GPU 的包
main.py 主窗口:UI、状态机、线程编排
audio.py 采集(soundcard)+ Silero VAD 分段(onnxruntime,不依赖 torch)
asr.py faster-whisper 识别线程(CTranslate2 / CUDA)
mt.py 流式翻译线程(OpenAI 兼容接口)+ 术语表
export.py 导出 DOCX / PDF / Markdown
session.py 会话数据与本地存储
settings.py 设置读写 + API Key 加密
settings_dialog.py 设置对话框
power.py 电源档位检测、GPU 功率墙、GPU 状态查询
config.py 采样率、块大小、三种电源档位的参数
build.py 一键打包
build.spec PyInstaller 配置
cuda_env.py 注册 CUDA 运行库搜索路径(源码运行 + 打包运行共用)
assets/ 图标、欢迎图、Silero VAD ONNX 权重
glossary.json 术语表
声卡/麦克风 ──► audio_q ──► VAD 分段 ──► seg_q ──► ASR ──► text_q ──► 翻译
(32ms块) (静音切段) (GPU) (流式)
│
英文立即上屏 ◄────┤
中文占位→回填 ◄────┘
audio_q 有界(400 块 ≈ 12.8 秒,提供背压);seg_q 有界,但满了是把最旧的两段合并、而不是丢弃 —— 音频一个采样都不会少,只是那一段会更长、更晚送去识别;text_q 不设上限,因为每项只有几十字节,而且英文文本在入队前就已经写进会话了。录音结束时靠 recording_ref + 队列空判定各线程自然退出。
队列设计的取舍:「绝不丢内容」和「严格限制内存」不能同时成立。识别速度长期低于说话速度时,合并会让段越来越长、内存依然会涨(除非把溢出音频写盘暂存)。本项目选择「不丢内容」,并在开始合并时于状态栏提示你识别已经跟不上。
之前因为PyTorch,打包出来 faster-whisper 项目会连 torch 一起打包(本仓库改版前是 4.6 GB,其中 4.08 GB 是 torch)。于是请大肥鱼来这里做了三件事把它降到 1.1 GB:
- VAD 换 ONNX。
silero_vad这个包在import的瞬间就会import torch。改成用onnxruntime直接加载assets/silero_vad.onnx,推理逻辑与官方OnnxWrapper逐位一致(实测 max diff = 0)。 - 排除
ctranslate2.converters。collect_all("ctranslate2")会把仅用于模型转换的 converters 也当隐藏导入,而它在模块级import torch+transformers。运行推理根本用不到。 - 只带必需的 CUDA 运行库。这一条最容易踩坑:去掉 torch 之后 GPU 识别会直接报
Library cublas64_12.dll is not found or cannot be loaded—— 因为cublas64_12.dll原本正是由torch\lib提供的,torch 一被 import 就会把该目录加进 DLL 搜索路径。所以必须把这几个 DLL 单独挑出来随包分发,并在运行时注册搜索目录。
实测结论:真实转写过程中只会加载 cublas64_12.dll + cublasLt64_12.dll(cudnn64_9.dll 仅被探测版本),Whisper 在 CTranslate2 中不走 cuDNN 算子,因此那几百 MB 的 cudnn_*_64_9.dll 子库全部不需要。
Q:状态栏一直显示 GPU: -?
nvidia-smi 对不支持的字段会返回 [N/A](例如某些 GPU 没有可读的功率墙)。解析失败会连带丢掉温度/功耗/占用率。新版已改为逐字段容错解析,只要有一项有效就会显示。
Q:改了字号 / 字体没反应?
这是 Qt 的经典陷阱:样式表里的字体声明优先级高于 QWidget.setFont()。STYLE 里的 * { font-family } 和 QTextEdit { font-size } 会把设置盖掉。修复方式是往窗口样式表末尾追加 QTextEdit#EnView / #ZhView 的 ID 选择器规则(ID 优先级更高)。
Q:功率墙(nvidia-smi -pl)不生效?
设置 GPU 功率墙需要管理员权限。没有权限时 -pl 会失败,此时程序会自动退避重试(默认 30 秒一次),不会再每 2 秒空跑子进程。
Q:提示找不到 silero_vad.onnx?
权重在 assets/silero_vad.onnx(随包分发)。查找顺序:exe\assets → _internal\assets → 源码目录。
Q:打包后设置界面里的上下箭头 / 下拉箭头全都不见了?
这是 settings_dialog.py 特有的坑:它原先用 Path(__file__).resolve().parent 定位 assets/icons。源码运行没问题,但打包后 __file__ 指向 PyInstaller 的解包目录 _internal,而那里只放了 silero_vad.onnx、没有 icons/ —— QSS 里的 image: url(...) 于是指向一个不存在的文件,所有自绘箭头一起消失。(main.py 看不出问题,是因为它把 SVG 内联在代码里兜底,用的又是 exe 同目录的 ASSETS_DIR。)
现在统一按 exe\assets → _internal\assets → 源码目录 查找,并且在图标确实找不到时退化为系统自带箭头,而不是画不出来。
排查思路:只检查「文件存在」是不够的 —— QSS 的
image: url(*.svg)是由 Qt 的imageformats/qsvg.dll插件加载的,插件缺失时路径再对也画不出来。--selftest里的「设置对话框图标」一项两件事都查。
Q:识别没反应,界面还停在「录音中」?
采集 / VAD 线程现在会把异常回传到状态栏。如果设备不可用(没有默认扬声器、回环设备被占用),你会看到 [错误] 录音线程退出: ... 而不是静默卡死。
Q:可以不用 GPU 吗?
目前识别固定 device="cuda",没有 CPU 回退路径 —— CPU 上跑 large-v3 达不到实时。请确保有可用的 NVIDIA 显卡。
- 仅面向 英文 → 中文(识别侧
language="en"硬编码) - ASR 模型必须外置于本地目录,不随包分发
mt.py的翻译是单线程串行消费,API 变慢时延迟会累积- 会话落盘做了节流(最多 1.5 秒写一次),因此程序崩溃时可能丢最后约 1.5 秒的内容;正常关闭/停止都会强制立即落盘
- API Key 的加密只是防明文(固定 salt + 机器指纹),并非强安全边界
MIT
- 在ONNX的问题始终无法解决的时候,最终我选择请大肥鱼来帮我修好这个问题,顺便完成了这个README。如果没有大肥鱼的帮忙,release版本还得有4.几个GB,即使进行排除,也还有至少2GB。请支持大肥鱼~
- faster-whisper / CTranslate2 —— GPU 语音识别
- Silero VAD —— 语音活动检测
- PyQt6 —— 界面
- soundcard —— 音频采集与系统回环