🎙️面试官说的每一句话,我都想留下来:于是我用 Vibe Coding 做了一个免费的 macOS 面试录音工具
背景
找过工作的人应该都懂:
面试复盘有多重要,复盘就有多难。
一场技术面四五十分钟下来,面试官可能连续问你:
- Java / JVM
- MySQL / Redis
- 项目设计
- Agent / RAG
- 场景题
- 算法题
面试结束以后,你脑子里往往只剩下几个模糊片段:
“刚刚那个问题,我是不是答错了?”
“面试官追问了什么来着?”
“我项目那里是不是讲得特别乱?”
更尴尬的是:
你明明知道这场面试里暴露了很多问题,却已经记不清到底暴露了什么。
于是我想做一件非常简单的事:把面试完整录下来。
然后:
▼text复制代码线上面试 ↓ 完整录音 ↓ Whisper / AI 转录 ↓ 生成面试逐字稿 ↓ ChatGPT ↓ 逐题复盘
让 AI 帮我重新整理:
- 面试官到底问了什么?
- 我的原回答是什么?
- 哪些地方答错了?
- 哪些地方虽然没错,但表达很差?
- 一个更好的面试回答应该是什么?
- 这场面试暴露了哪些知识薄弱点?
- 下一场面试前应该重点补什么?
想法非常简单。
结果真正到了 Mac 上,我发现:
“把面试官声音 + 自己声音一起录下来”居然没想象中那么省事。
我只是想录个面试,为什么突然开始学虚拟声卡了?
我的需求真的非常朴素:
▼text复制代码面试官的声音 + 我自己的回答 ↓ 一个音频文件
甚至:
我连屏幕都不需要录。
结果调研了一圈以后,发现现有方案大概是这样。
方案一:系统自带录音备忘录
简单是简单。
但很多情况下你最终得到的是:
▼text复制代码✅ 自己的麦克风 ❌ 系统内部声音
也就是说:
你说的话录下来了,面试官的问题没了。
那还复盘什么……
方案二:OBS
OBS 当然非常强。
但第一次打开:
▼text复制代码场景 来源 音频混音器 音轨 编码器 输出 容器
我当时只有一个想法:
我真的只是想录个音。
😂
方案三:BlackHole / 虚拟声卡
这条路线也完全能解决问题。
但很快就变成:
▼text复制代码安装 BlackHole ↓ Audio MIDI Setup ↓ Multi-Output Device ↓ Aggregate Device ↓ 检查 Clock Source ↓ 检查 Drift Correction
我:
“等一下,我不是来准备面试的吗?”
后来我发现了 LoopRec
在调研过程中,我看到了一款让我非常喜欢的软件:
LoopRec。
它真正让我喜欢的不是功能特别多,而是:
功能特别少。
打开以后基本就是:
▼text复制代码系统声音 ON 麦克风 ON 系统声音音量 90% 麦克风音量 100% 开始录音
- 没有场景。
- 没有复杂混音台。
- 没有一堆专业录音参数。
这才是我理解中的:“面试录音工具”。
但它的免费版本存在单次录制时长限制。问题是技术面试这种东西,很难控制时长:

▼text复制代码30 min 45 min 60 min 90 min 120 min
都有可能。
总不能面试进行到一半说:
“面试官您好,我这个录音软件免费额度快到了,要不今天先到这里?”
😂
然后那个非常典型的程序员念头就出现了:要不我自己写一个?
于是 InterviewRec 出现了。
InterviewRec
一句话介绍:
一个免费、开源、原生、轻量的 macOS 面试 / 会议录音工具。
它的工作流程只有:
▼text复制代码Mac 系统声音 ─┐ ├──→ InterviewRec ──→ M4A 麦克风声音 ───┘
系统声音就是:
面试官 / 会议对方的声音。
麦克风就是:
你自己的回答。
录完以后得到:
▼text复制代码InterviewRec-2026-08-28-xxxxxx.m4a
然后你想:
- 直接回放;
- 拖进 Whisper;
- 用本地模型转录;
- 丢给 ChatGPT;
都可以。
它目前能做什么?
V0.1 的功能我刻意控制得非常克制:
▼text复制代码✅ 录制 Mac 系统声音 ✅ 录制麦克风 ✅ 系统声音 + 麦克风同时录制 ✅ 输出单个 M4A ✅ 不需要 BlackHole ✅ 不需要配置虚拟声卡 ✅ 系统声音 / 麦克风独立开关 ✅ 两路独立录音音量 ✅ 双路实时音量电平 ✅ 选择麦克风设备 ✅ AirPods / USB 麦克风等输入设备 ✅ 自定义保存目录 ✅ 录完直接播放 ✅ Finder 中定位录音文件 ✅ 设置自动保存 ✅ 完全本地运行 ✅ 免费 ✅ MIT 开源
项目当前代码就是围绕“系统声音 + 麦克风 → 单个 M4A”这一目标设计的,没有加入 AI、云端或账号系统。
不需要虚拟声卡
这是我自己最在意的一点。
InterviewRec 直接使用 macOS 的:
ScreenCaptureKit
来获取系统声音和麦克风。
当前实现中:
▼text复制代码ScreenCaptureKit │ ┌─────────────┴─────────────┐ ↓ ↓ System Audio Microphone │ │ └─────────────┬─────────────┘ ↓ PCM Normalize ↓ 48 kHz Float32 ↓ ┌───────────┴──────────┐ ↓ ↓ System Gain Mic Gain │ │ └───────────┬──────────┘ ↓ Mixer ↓ Limiter ↓ AAC ↓ M4A
系统声音和麦克风通过同一个 ScreenCaptureKit Session 获取,最终进入统一的音频处理链路。
所以使用的时候不用:
▼text复制代码BlackHole Soundflower Loopback VB-Cable
也不会为了录音去修改你的系统默认输出设备。
代码中也使用了 excludesCurrentProcessAudio,避免把 InterviewRec 自己产生的声音再次抓进录音链路。
对普通用户来说,最终感知应该只有:
▼text复制代码安装 ↓ 授权 ↓ 选择麦克风 ↓ 开始录音
真正的原生 macOS App
我没有使用:
▼text复制代码Electron WebView Tauri Flutter
整个项目技术栈非常简单:
▼text复制代码Swift 6 + SwiftUI + ScreenCaptureKit + AVFoundation
目前平台范围也砍得很直接:
▼text复制代码macOS 15 Sequoia+ Apple Silicon Only
支持:
▼text复制代码M1 M2 M3 M4 M5
不考虑 Intel。
不考虑 Rosetta。
因为这是一个我自己真正要用的小工具:
与其为了兼容所有机器把第一版做复杂,不如先把自己的核心场景做好。
UI也十分简洁:

Vibe Coding
这个项目还有一个很有意思的地方:它基本是靠 Vibe Coding 做出来的
InterviewRec 本身其实也是我的一次实验:
现在的大模型,到底能不能从 0 做出一个真正能使用的 macOS 原生工具?
但我没有采用:
▼text复制代码“帮我写一个录音软件”
然后坐等 AI 吐完整项目的方式。而是真正按照软件开发流程来做的。
第一步:先做需求,而不是先写代码
我先把 V0.1 需求收缩成一句话:
系统声音 + 麦克风 → 单个 M4A。
然后把边界冻结:
▼text复制代码macOS 15+ Apple Silicon 只录音 不录屏 不联网 不做 AI 不做后端
这一步看起来没有写一行代码。
但后来回头看:
它可能是整个项目最重要的一步。
因为 Vibe Coding 特别容易出现:
“既然 AI 写代码不要钱,那不如全加上。”
结果 Scope 直接爆炸。
第二步:先写 Design,再让 Agent 开始干活
项目现在不是只有源码。
还专门保留了:
▼text复制代码docs/ ├── DESIGN.md ├── PLAN.md └── TESTING.md
DESIGN.md 回答:
这个软件怎么实现?
PLAN.md 回答:
Agent 应该按照什么顺序实现?
TESTING.md 回答:
你怎么证明这个东西真的能用?
这和:
▼text复制代码Prompt ↓ 疯狂生成代码 ↓ 能编译 ↓ 宣布完成
完全是两回事。
第三步:把系统拆成 Agent 能理解的小模块
现在项目里的音频核心大概是:
▼text复制代码AudioFrame PCMBufferReader PCMConverter GainProcessor AudioMixer AudioLimiter AudioLevelMeter RecordingWriter ScreenCaptureAudioService RecordingEngine
而不是:
▼text复制代码RecordingManager.swift 3000 行
😂
例如:
GainProcessor
就只负责:
数字增益。
AudioMixer
就只负责:
合并音频。
AudioLevelMeter
就只负责:
音量计算。
RecordingWriter
就只负责:
PCM → AAC/M4A。
我现在越来越觉得:
好的架构不仅方便人维护,也非常方便 Coding Agent 工作。
你告诉 Codex:
“修 AudioMixer。”
它只需要理解一个明确的小模块。
而不是每次把整个项目重新读一遍。
第四步:不要相信 AI 说“已经完成”
这可能是这次 Vibe Coding 给我最大的体会。
Coding Agent 特别喜欢说:
“Implementation complete.”
但软件工程真正重要的是:测试。
所以我给核心音频 Pipeline 做了自动化测试。
目前覆盖了:
▼text复制代码GainProcessor AudioMixer AudioLimiter AudioLevelMeter PCMConverter RecordingWriter RecordingState Settings FileNaming
比如 Mixer 测试会真正验证:
▼text复制代码System Audio + Microphone ↓ 混音结果
还做了:
▼text复制代码Synthetic System Tone + Synthetic Mic Tone ↓ Mixer ↓ AAC / M4A ↓ 重新读取生成文件 ↓ 检查两种声音是否都还存在
以及不同麦克风输入格式的转换测试。
MVP思维
这个项目目前仍然是:
V0.1。
我现在尤其关注:
▼text复制代码30~120 分钟真实长录 不同采样率设备的长期同步 Writer Backpressure 异常中断 麦克风热插拔 Crash Recovery 分段保存
这些属于下一阶段要继续重点验证和改进的内容。
当前仓库里也明确把:
完整崩溃恢复 / segment recording
留到了 V0.2。
我觉得开源项目没必要一上来就吹:
“完美、稳定、工业级。”
反而应该告诉大家:
哪里已经做了,哪里还在继续验证。
Issue 和 PR 本来就是开源的一部分。
隐私方面
InterviewRec 当前:
▼text复制代码不联网 不上传 无账号 无服务器 无埋点 无广告
所有录音文件只保存在:
你自己选择的本地目录。
默认:
▼text复制代码~/Music/InterviewRec/
毕竟:
技术面试录音本身就是非常敏感的数据。
如果一个纯录音工具还要求我:
▼text复制代码登录 上传 同步 注册账号
那反而不是我想要的东西。
对 Vibe Coding 的理解
以前大家讲 Vibe Coding:
“一句话生成一个网站。”
但真正把 InterviewRec 做下来以后,我越来越觉得,一个更靠谱的流程应该是:
▼text复制代码Idea ↓ Requirements ↓ Design ↓ Implementation Plan ↓ Coding ↓ Tests ↓ Manual Verification ↓ 迭代
AI 并不是:
让软件工程消失。
而是:让软件工程的每一步都变快。
需求可以和 AI 一起讨论。
架构可以让 AI Review。
实施计划可以让 Agent 拆。
代码可以交给 Codex。
测试可以交给 Agent 补。
Bug 可以让 Agent Debug。
文档可以自动维护。
但最终:
方向、取舍和验收,还是得由人负责。
至少这是我做 InterviewRec 最大的感受。
我自己最终准备怎么使用它?
其实 InterviewRec 只是整个工作流的第一步。
真正让我觉得它有价值的是:
▼text复制代码腾讯会议 / Zoom / 飞书 ↓ InterviewRec ↓ interview.m4a ↓ Whisper ↓ interview.md ↓ ChatGPT
然后把逐字稿交给 AI:
▼text复制代码请根据这份技术面试逐字稿: 1. 按时间顺序整理面试官所有问题 2. 还原我的回答 3. 对每个回答进行评价 4. 找出错误、遗漏和表达问题 5. 给出更好的面试标准答案 6. 总结这场面试暴露出的知识薄弱点 7. 给出下一轮复习优先级
最后,代码开源
项目地址:⭐ InterviewRec
GitHub:https://github.com/sz-xiaohuolong/InterviewRec
目前:
▼text复制代码📌 macOS 15 Sequoia+ 📌 Apple Silicon 📌 Swift 6 + SwiftUI 📌 ScreenCaptureKit 📌 AVFoundation 📌 MIT License 📌 免费 📌 完全开源 📌 完全本地 📌 无会员 📌 无服务器 📌 无广告
如果你也是:
- 准备秋招 / 春招;
- 找实习;
- 准备跳槽;
- 经常参加线上技术面;
- 需要录线上会议;
- 想用 AI 复盘自己的表达;
欢迎拿去用。
如果这个小工具刚好解决了你的问题
欢迎:
点一个 Star ⭐
也欢迎:
▼text复制代码Issue PR Bug Report Feature Suggestion
尤其欢迎帮我测试:
- AirPods
- USB 麦克风
- 腾讯会议
- Zoom
- 飞书
- Teams
- 不同型号 Apple Silicon Mac
- 长时间录音
一个开源小工具最有价值的地方,就是:一个人的需求,最后可能刚好解决了一群人的问题。
