开源一个 Windows 实时面试助手:听译、置顶提词、按需生成英文稿

开源一个 Windows 实时面试助手:听译、置顶提词、按需生成英文稿

适合练习 / 语言辅助,不要拿去隐蔽"作弊"。

仓库:https://github.com/magau123/Interview_Copilot

协议:MIT

英文面试时,真正难的往往不是"完全不会答",而是:听清问题、理解意思、用英语把经历说完整

Interview Copilot 是我做的一个 Windows 本地优先 小工具:它听的是会议扬声器里的声音,把面试官的英文和中文译文浮在窗口最上面;需要稿子时,再按快捷键向阿里云百炼要一段英文口述稿


先看它能干什么

用过视频会议的人都知道:字幕如果嵌在会议软件里,眼神就得在"对方脸"和"字幕栏"之间来回跳。这个项目把显示拆成两个可拖动的置顶框

你看到的 实际在做什么
面试官框 实时英文原文 + 中文译文
提词器 按需生成的英文口述稿,可跟读滚动
控制台 选设备、开始/停止、设置、生成按钮

几个刻意做成"人控"的点:

  1. 不自动抢答。 翻译可以一直跑,回答必须你按 F4Ctrl+1/2/3
  2. 只发问题原文给百炼。 提示词、语气、知识范围写在云端应用里,客户端不拼一大段 prompt。
  3. API Key 不进 Git。 用 Windows 凭据管理器保存。
  4. 跟读滚动只用本机音量。 麦克风判断你有没有开口,这段音频不为滚动而单独上传。

快捷键记这三个就够:

  • 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_*


项目结构:打开仓库你该从哪看

仓库不大,建议按「入口 → 编排 → 采集/云 → 界面」读:

复制代码
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() 会:

  1. 在 SQLite 开一场 session
  2. 连上 LiveTranslate
  3. 启动 loopback 采集线程
  4. 把 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_idmessagesstream: 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。

再次提醒:练习和语言辅助可以,正式面试请遵守对方规则。

相关推荐
克里斯蒂亚诺更新1 小时前
机器学习和深度学习的主要区别--特征提取
人工智能·深度学习·机器学习
方银的技术分享11 小时前
十五、AI训练师:机器学习-过拟合与欠拟合
人工智能·深度学习·机器学习
Dfreedom.13 小时前
目标检测后处理核心:NMS非极大值抑制详解
图像处理·人工智能·深度学习·目标检测·目标跟踪
峰向AI14 小时前
GenOffice:开源 Office 套件,字节级保留、本地转换、BYOK模式
github
β添砖java15 小时前
深度学习28RNN循环神经网络
人工智能·深度学习
EQUINOX115 小时前
【论文精读】| LLaVA
论文阅读·人工智能·深度学习
其实防守也摸鱼16 小时前
权限提升与横向移动:从内网渗透到域控的完整技术图谱
运维·服务器·数据库·安全·github·copilot·渗透
m4Rk_16 小时前
【论文阅读】Agent 记忆机制(57):MemSearch-o1——从查询词元生长证据,重组 Deep Search 记忆路径
论文阅读·人工智能·学习·开源·github
其实防守也摸鱼17 小时前
免杀与持久化入门:从载荷免杀到隐蔽通道的完整指南
运维·服务器·数据库·安全·github·copilot·渗透