# LeafInterview **Repository Path**: Yangshengzhou/leaf-interview ## Basic Information - **Project Name**: LeafInterview - **Description**: 我跟你讲,面试的时候最怕什么?不是不会,是突然大脑一片空白!面试官抛出一个你有点熟但就是卡住的问题,那几秒钟的沉默简直比一万年还长。更别提笔试的时候,一道算法题思路断了,真的恨不得有人偷偷在耳边告诉你答案。 但是!你总不能明目张胆地百度吧?对面看着你呢! 所以我就想,能不能做一款工具,让你在面试中拥有一个"隐形的助手"——它能帮你听、帮你想、帮你回答,但对面的面试官完全察觉不到。这就是轻羽面试 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: https://gitee.com/Yangshengzhou/leaf-interview - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-09-24 - **Last Updated**: 2026-10-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 轻羽面试助手 (Leaf Interview)
一款让你在任何面试中都能从容作答的桌面神器。离线识别、实时字幕、AI 回答——所有魔法发生在你的机器上。
## 它到底在解决什么问题? 我跟你讲,面试的时候最怕什么?不是不会,是突然大脑一片空白!面试官抛出一个你有点熟但就是卡住的问题,那几秒钟的沉默简直比一万年还长。更别提笔试的时候,一道算法题思路断了,真的恨不得有人偷偷在耳边告诉你答案。 但是!你总不能明目张胆地百度吧?对面看着你呢! 所以我就想,能不能做一款工具,**让你在面试中拥有一个"隐形的助手"**——它能帮你听、帮你想、帮你回答,但对面的面试官完全察觉不到。这就是轻羽面试助手的由来。 ## 听起来很酷,它到底怎么做到的? 来来来,我给你讲讲这个产品有多"黑科技"。 它的核心能力是**系统音频实时识别**。什么意思呢?就是说,一旦你进入轻羽面试模式,它会自动从你扬声器的音频回路里采集声音——也就是从会议软件里传出来的面试官的声音。 这路声音被送入本地的语音识别模型,然后变成一条灰褐色的字幕流,实时滚动在你的屏幕上。**灰褐色的是面试官说的,蓝色的是AI的回答**——就像在看一场带实时字幕的视频通话! 而且!**这个识别是完全离线的**。我们的语音识别引擎用的是 sherpa-onnx 搭载的 SenseVoice 模型,int8 量化之后大概 230 MB。音频数据从头到尾不会离开你的机器,不会被上传到任何云端的服务器。这意味着什么?意味着你面试的内容,除了你自己,没有任何人知道。 ## 从声音到文字,再到你想要的答案 光是变成文字就完了吗?远远不够! 当字幕开始滚动的时候,**真正的魔法才刚刚开始**。你可以用鼠标直接点击任意一条面试官说的话——"啪"一下,它就会被作为问题立刻发给 AI,然后 AI 就会结合你的职位信息、简历全文、还有你提前准备好的知识库条目,给你生成一个**完全贴合你个人背景**的回答建议。 等一下,如果你觉得点字幕还不够快怎么办?我们还做了一个**沉默检测**的功能。当面试官停止说话超过 3 秒钟,系统会自动把最近那一段语音打包发给 AI——你什么都不用做,只需要安安静静等着答案浮现在屏幕上。这体验,**真的是太爽了**! 在 AI 这块,轻羽支持 DeepSeek API,同时兼容 OpenAI Chat、OpenAI Responses 还有 Anthropic Messages 三种协议格式。你可以接入任何你喜欢的兼容服务。我们内置了好多种回答风格的模板,你可以在设置里切换默认风格,面试过程中临时切换也完全没问题。 ## 隐私!隐私!隐私!重要的事情说三遍 做面试辅助工具,隐私就是生命线。我在这里可以非常负责任地告诉你——轻羽在隐私防护这块,做得**极其极其极致**。 我们用的是 Win32 最底层的 API,`SetWindowDisplayAffinity` 配合 `WDA_EXCLUDEFROMCAPTURE` 标志。这个标志一旦设置,**你的窗口在截屏、录屏、屏幕共享的时候就会变成全黑**——不管对面用的是腾讯会议还是钉钉,他们看到的就是一块黑板,完全看不到你在看什么! 而且面试模式下窗口会被强制始终置顶,同时从任务栏消失。你绝对不会因为误触其他应用而暴露自己。还有全局快捷键——`Ctrl+Shift+H` 在任何界面下一键显隐窗口,`Ctrl+Shift+E` 一键结束面试——全程不需要碰任务栏,**真的是行云流水**。 面试结束之后,窗口自动恢复为普通状态,`WDA_EXCLUDEFROMCAPTURE` 标志被清除,一切都像没发生过一样。 需要 Windows 10 版本 2004(build 19041)或更高。 ## 笔试场景,同样强大 你以为它只能面试吗?错! 轻羽还有一个**笔试模式**。你只需要按下 PrintScreen 键——或者点一下截屏按钮——它就会用 GDI 截取你选定显示器的全屏画面,然后通过内置的 Tesseract OCR 识别截图里的文字,提取出题目,直接交给 AI 解答。 如果你配置了支持视觉的模型,截图还会以 base64 直接发给 AI,**让 AI 直接看图解题**!这个体验,真的不是一般的方便。 不过我要坦诚地告诉你,笔试模式的设计理念是**辅助**,而不是**监考**。它不会检测你开了什么窗口、切到了什么应用。截屏就是单纯地抓取显示器的像素画面。**工具是辅助你的,不是监控你的**。 ## 面试前的准备,一站式搞定 轻羽自带一个**三步向导**——面试设置、设备调试、确认开始。这个向导真的非常贴心。 设置的时候你可以选职位名称、选简历、设定面试时长(15 分钟到 90 分钟,或者不限时)。岗位材料可以从你之前录入过的岗位库里挑,也可以临时粘贴一段 JD。知识库是可选的,你可以创建多个知识库,每个里面放若干"标题 + 条目"的知识点,面试时勾选相关条目,它们就会被自动注入到 AI 上下文里。 **设备调试这个环节非常重要**。开始面试之前你可以检测系统音频,实时音量条会可视化输入信号,让你确认面试官的声音真的被拾取到了。这个细节,真的是**太关键**了。面试过程中还可以选择录制面试官的音频,面试结束后在历史记录里回听。 简历支持纯文本、Markdown 和 PDF 三种格式,PDF 会通过 pdfjs-dist 自动提取全文。岗位管理支持按名称和 JD 全文搜索,归档和恢复也都有。 面试过程中右侧面板可以随时切到笔记 Tab,用 Markdown 写,输入的时候自动防抖保存。你也可以切到知识库 Tab 快速查阅。面试时间到了设定的阈值,进度条会变红弹出超时提醒;不限时模式就安安静静不打扰你。 每次面试结束后,会话会被自动归档——时长、字数、职位、笔记、AI 对话、字幕、录音(如果开启了录音功能),**全量保存**。你在历史记录里随时可以回看某次面试的详情,每一条字幕、每一次对话、每一段录音,都历历在目。 ## 技术这块,我们也是非常较真的 前端用的是 Vue 3 + TypeScript,Pinia 做状态管理,Element Plus 提供 UI 组件,Vite 负责构建。桌面壳是 Tauri 2——**安装包只有几 MB,不是 Electron 那种动不动一百多 MB 的巨物**。 后端核心全在 Rust。WASAPI 音频采集、SenseVoice 推理、SAPI 自检播报、窗口防截屏、全局键盘钩子、会话持久化——全部是直接调用 Win32 API 或者 Rust 生态的 crate。语音识别用的是 sherpa-onnx 绑定的 SenseVoice,PDF 解析用的是 pdfjs-dist 的 WASM 版本,截屏 OCR 用的是 Rust 封装的 Tesseract。 数据存储这块我要给你讲清楚。所有岗位、简历、知识库、日志数据都存在浏览器的 localStorage 里,跟着 WebView 数据目录走。面试会话记录存在 Rust 侧的 `app-data-dir/app-state.json`。DeepSeek API Key 存在 localStorage,是明文但只有本机能访问。音频数据只存在于内存,识别完就丢掉,**绝对不会落盘**。AI 调用只有在你主动提问或者沉默检测触发的时候才会发生,发送的是拼接后的文本上下文。 ## 项目布局 前端源码在 `src/`。`views/` 有九个视图文件,每个对应一个页面——首页、面试向导、面试界面、历史记录、岗位管理、简历管理、知识库、运行日志、设置。`stores/` 有两个 Pinia store,一个管应用状态,一个管 AI 对话和配置。`composables/` 里有可复用的组合式函数。`config/nav.ts` 配置侧边栏导航。`types/index.ts` 定义所有 TypeScript 类型。`utils/` 里有 localStorage 封装(带配额告警)、Markdown 渲染、日期格式化等工具。路由在 `src/router/index.ts`,包含面试模式的导航守卫。 后端在 `src-tauri/src/`。`tauri_main.rs` 是入口,注册全局快捷键、切换应用模式。`commands.rs` 暴露所有 IPC 命令给前端调用。`state.rs` 维护三态机——普通态、准备态、面试态。`window.rs` 封装防截屏、置顶、任务栏隐藏。`audio.rs` 实现 WASAPI 系统音频捕获和静音断句缓冲。`asr.rs` 加载 SenseVoice 模型、跑实时识别线程、处理闭环自检。`tts.rs` 封装 SAPI TTS 用于自检播报。`store.rs` 负责会话持久化和历史读写。`hook.rs` 注册全局低级别键盘钩子监听 PrintScreen。`screen.rs` 实现 GDI 截屏和 BMP 编码。`ocr.rs` 封装 Tesseract OCR。`audio_devices.rs` 枚举音频设备。 ## 开始上手 先装依赖,`npm install`。开发模式跑 `npm run start`,Tauri 会同时启动前端 dev server 和 Rust 编译,前端代码热重载。生产构建跑 `npm run build-pro`,前端先 `vite build`,然后 `tauri build` 打出安装包。 前端类型检查是 `npm run lint`(`vue-tsc --noEmit --strict`)。Rust 端是 `npm run lint:rust`(cargo clippy 带 all + pedantic + nursery 严格级别)。双端全量检查 `npm run lint:all`。清理 `npm run clean` 会删掉 `node_modules`、`dist`、`src-tauri/target`。 首次使用需要在设置里填入 DeepSeek API Key,或者配置一个兼容 OpenAI / Anthropic 协议的自定义服务。语音识别模型会在你第一次开启实时字幕时自动下载,大约 230 MB,下载一次终身使用。 ## 系统要求 需要 Windows 10 版本 2004(build 19041)或更高。需要 WebView2 Runtime——Windows 11 自带,Windows 10 通常也已预装,缺失时会提示安装。首次开启实时字幕需要联网下载 SenseVoice 模型,此后识别全程离线。