开源一个 Windows 实时面试助手:听译、置顶提词、按需生成英文稿
适合练习 / 语言辅助,不要拿去隐蔽"作弊"。
协议:MIT
英文面试时,真正难的往往不是"完全不会答",而是:听清问题、理解意思、用英语把经历说完整 。
Interview Copilot 是我做的一个 Windows 本地优先 小工具:它听的是会议扬声器里的声音,把面试官的英文和中文译文浮在窗口最上面;需要稿子时,再按快捷键向阿里云百炼要一段英文口述稿。

先看它能干什么
用过视频会议的人都知道:字幕如果嵌在会议软件里,眼神就得在"对方脸"和"字幕栏"之间来回跳。这个项目把显示拆成两个可拖动的置顶框:
| 你看到的 | 实际在做什么 |
|---|---|
| 面试官框 | 实时英文原文 + 中文译文 |
| 提词器 | 按需生成的英文口述稿,可跟读滚动 |
| 控制台 | 选设备、开始/停止、设置、生成按钮 |

几个刻意做成"人控"的点:
- 不自动抢答。 翻译可以一直跑,回答必须你按
F4或Ctrl+1/2/3。 - 只发问题原文给百炼。 提示词、语气、知识范围写在云端应用里,客户端不拼一大段 prompt。
- API Key 不进 Git。 用 Windows 凭据管理器保存。
- 跟读滚动只用本机音量。 麦克风判断你有没有开口,这段音频不为滚动而单独上传。
快捷键记这三个就够:
F4:按控制台选的「最近 1 / 2 / 3 句」生成Ctrl+1/Ctrl+2/Ctrl+3:直接取最近 1~3 句面试官英文
声音是怎么进来的(这是灵魂)
很多"会议助手"去抓屏幕或虚拟声卡。这里走的是 Windows 的 WASAPI loopback:系统正在播放什么,就采什么。
所以有一条很实际的坑:耳机开会,就选耳机对应的回环设备。选成扬声器、人却戴着耳机,界面会一直安静------程序没坏,它只是听错了出口。

采集线程很薄:设备在后台线程里读 PCM,回调丢给编排器。默认还会优先「和当前默认播放设备对应的回环」:
python
def _default_loopback_index(audio: pyaudio.PyAudio) -> int | None:
try:
info = audio.get_default_wasapi_loopback()
except Exception:
return None
try:
return int(info["index"])
except (KeyError, TypeError, ValueError):
return None
音频进编排器之后,会喂给 Qwen LiveTranslate(WebSocket)。UI 并不直接碰网,它只收事件:source_partial / source_final / translation_*。
项目结构:打开仓库你该从哪看
仓库不大,建议按「入口 → 编排 → 采集/云 → 界面」读:
bash
Interview_Copilot/
├── src/interview_copilot/
│ ├── app.py # Qt + asyncio 入口
│ ├── config.py # 设置、区域、知识应用 ID
│ ├── ssl_util.py # 打包 exe 时的证书信任
│ ├── models.py # SpeechEvent / Answer 等
│ ├── audio/ # WASAPI 回环、音量
│ ├── conversation/ # 编排、问题过滤、翻译台账
│ ├── providers/qwen/ # LiveTranslate + 百炼 SSE
│ ├── storage/ # 本机 SQLite
│ └── ui/ # 控制台、置顶浮层、提词器
├── tests/ # pytest
├── scripts/build.ps1 # 测试 + PyInstaller
└── docs/architecture.html # 可离线打开的架构图
对应到运行时,可以看成两块:

更细的可交互图在仓库里:docs/architecture.html。
代码怎么串起来
1. 入口:GUI 和 asyncio 共用一个循环
Windows 桌面用 PySide6,网络和实时会话用 asyncio。qasync.QEventLoop 把两套事件循环焊在一起,避免"界面卡死"或"协程跑不起来"。
python
def main() -> int:
store = SettingsStore()
settings = store.load()
configure_ssl()
application = QApplication(sys.argv)
loop = QEventLoop(application)
asyncio.set_event_loop(loop)
window = MainWindow(store)
window.show()
application.aboutToQuit.connect(loop.stop)
with loop:
loop.run_forever()
文件:src/interview_copilot/app.py。
2. 编排器:开会时它才是"大脑"
ConversationOrchestrator.start() 会:
- 在 SQLite 开一场 session
- 连上 LiveTranslate
- 启动 loopback 采集线程
- 把 PCM 推给实时识别
需要稿子时走 generate_for_text():只提交面试官原话,不在客户端拼中英双语 prompt。
python
async def generate_for_text(self, question: str, translation: str = "") -> None:
del translation # 风格限制放在百炼应用里
if not self.answer_enabled:
return
cleaned = question.strip()
if not cleaned:
return
await self._emit_speech(SpeechEvent(SpeechEventType.ANSWER_PENDING, cleaned))
await self._schedule_answer(cleaned)
文件:src/interview_copilot/conversation/orchestrator.py。
中间还有一层问题过滤:明显不是问题的插话会被标成"已忽略",避免误触发。真正生成仍然要你按键。
3. 百炼:SSE 流出英文稿
知识库、简历、JD 都在百炼控制台维护。客户端只带 agent_id 和 messages,stream: True:
python
payload = {
"input": {
"messages": [{"role": "user", "content": content}],
},
"parameters": {
"agent_options": {"agent_id": app_id},
},
"stream": True,
}
文件:src/interview_copilot/providers/qwen/application.py。
流式结果会尽量抽成英文(模型偶尔仍带中文标记时会清洗),再送进提词器。
4. 置顶窗口:Qt 标志位 + Win32 再钉一次
无边框 + Tool 窗口默认没有任务栏入口,会议软件全屏时很容易把它们压住。创建时就带 WindowStaysOnTopHint,显示和拖动结束后再 SetWindowPos(HWND_TOPMOST):
python
flags = (
Qt.WindowType.FramelessWindowHint
| Qt.WindowType.Tool
| Qt.WindowType.WindowStaysOnTopHint
)
文件:src/interview_copilot/ui/overlay.py。控制台有「置顶」开关,默认开。
5. 数据放哪
| 东西 | 放哪 |
|---|---|
| API Key | Windows Credential Manager |
| 窗口位置、设备 | %LOCALAPPDATA%\InterviewCopilot\settings.json |
| 会话轮次 | 同目录下 SQLite |
| 会议音频 / 问题文本 | 发往你配置的阿里云接口 |
| 简历等文档 | 只在百炼,不进这个 Git 仓库 |
公司代理做 HTTPS 解密时,常见症状是证书校验失败。项目里有 ssl_util,打包成 exe 时尽量走系统信任库。
在自己电脑上跑起来
环境:Windows 10/11、Python 3.12+、阿里云百炼 / DashScope Key、Workspace ID、已发布的知识应用 ID(aid-...)。
powershell
git clone https://github.com/magau123/Interview_Copilot.git
cd Interview_Copilot
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e ".[dev]"
python -m interview_copilot
打开 设置 :填 Key、Workspace、区域、知识应用 ID。
开会时选对回环设备 → 点开始 → 勾选「回答建议」→ 需要稿子时按 Ctrl+1。
开发者常用:
powershell
pytest
ruff check .
.\scripts\build.ps1 # 产出 dist\InterviewCopilot\InterviewCopilot.exe
写在最后
这是一个 可 fork 的桌面小项目,不是 SaaS:核心就四段------采声、实时翻译、按需问知识应用、把字钉在最上层。
如果你也在做会议辅助 / 桌面 AI,欢迎直接看源码和架构图,提 Issue 或 PR。
再次提醒:练习和语言辅助可以,正式面试请遵守对方规则。
- GitHub:github.com/magau123/In...
- 架构图:docs/architecture.html