Meeting scribe for macOS and Windows — captures both speaker and microphone audio, auto-transcribes, and produces AI-generated meeting notes or interview summaries.
| Item | Detail |
|---|---|
| macOS 12+ | Uses CoreAudio API |
| Python 3.9+ | Verify with python3 --version |
| Node.js 18+ | Required for Claude Code CLI |
| Homebrew | Required to install BlackHole |
| Item | Detail |
|---|---|
| Windows 10/11 | 64-bit |
| Python 3.9+ | Download from python.org — check "Add to PATH" and "tcl/tk" during install |
| Node.js 18+ | Required for Claude Code CLI |
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"brew install --cask blackhole-2ch # virtual audio driver (captures system audio)
brew install ffmpeg # required by FunASR for audio decodingThis step routes system audio to both your speakers and BlackHole simultaneously.
-
Open Audio MIDI Setup — search in Spotlight, or run:
open "/System/Applications/Utilities/Audio MIDI Setup.app" -
Click "+" at the bottom left → "Create Multi-Output Device"
-
Check both:
- ✅ Your speakers (e.g.
MacBook Air Speakers/ external headphones) - ✅
BlackHole 2ch
- ✅ Your speakers (e.g.
-
Check the "Drift Correction" checkbox on the
BlackHole 2chrow -
Right-click the new Multi-Output Device → "Use This Device For Sound Output"
-
Note the device name (default is
Multi-Output Device; you can rename it)
After this setup, system audio will flow into BlackHole and MeetingScribe can capture it.
Claude Code CLI is used for AI polishing and generating meeting notes.
npm install -g @anthropic-ai/claude-code
claude login # Follow the prompts to authorize
claude --version # Confirm installationcd meetingscribe
# Install PyTorch first (CPU version; visit https://pytorch.org for GPU options)
pip3 install torch torchaudio
# Install remaining dependencies
pip3 install -r requirements.txtOpen config.jsonc and update the following fields to match your device names:
How to find device names:
python3 meetingscribe.py devicesSpeaker names can be found in System Settings → Sound → Output.
Download and install VB-Audio Virtual Cable (free): https://vb-audio.com/Cable/
This is the Windows equivalent of BlackHole — it creates a virtual audio device to capture system audio.
Download and install VoiceMeeter Banana (free): https://vb-audio.com/Voicemeeter/banana.htm
VoiceMeeter routes system audio to both your speakers and Virtual Cable simultaneously (equivalent to macOS Multi-Output Device).
Configure VoiceMeeter:
- Open VoiceMeeter Banana
- In HARDWARE INPUT 1, select your microphone
- In HARDWARE OUT A1, select your real speakers / headphones
- In VIRTUAL INPUTS, enable routing to B1 (Virtual Cable)
- Right-click the Windows speaker icon in the taskbar → Sound settings → set output to VoiceMeeter Input
Once configured, VoiceMeeter runs in the background. No need to change audio devices before each recording.
npm install -g @anthropic-ai/claude-code
claude logincd meetingscribe
pip install torch torchaudio
pip install -r requirements.txtOn Windows, audio device auto-switching is not supported — VoiceMeeter handles routing permanently. Set output_record and output_restore to empty strings, and update the device names:
"output_record": "", // leave empty on Windows
"output_restore": "", // leave empty on Windows
"device_system_audio": "CABLE Output (VB-Audio Virtual Cable)",
"device_mic": "Microphone (your mic name here)"How to find device names:
python meetingscribe.py devicespython3 meetingscribe.py ui- Click ▶ Start Recording to begin
- Click ◼ Stop Recording when done
- Click Generate Meeting Notes or Generate Interview Summary
- When complete, click Open Result to view the Markdown output
# Record and auto-generate meeting notes (Ctrl+C to stop)
python3 meetingscribe.py record
# Interview mode
python3 meetingscribe.py record --mode interview
# Process an existing recording
python3 meetingscribe.py transcribe /path/to/audio.wav
python3 meetingscribe.py transcribe /path/to/audio.wav --mode interviewRecordings are saved to ~/Documents/meetingscribe/recordings/. All output files are placed alongside the recording:
| Extension | Content |
|---|---|
.wav |
Recording (system audio + microphone, dual stream) |
.raw.txt |
Raw transcript (with timestamps) |
.proofread.txt |
AI-polished transcript |
.md |
Meeting notes / interview summary (Markdown) |
Re-running automatically detects completed steps and skips them — no need to re-transcribe.
Edit config.jsonc in the project directory (supports // comments). Common options:
| Key | Default | Description |
|---|---|---|
mode |
meeting |
meeting or interview |
transcribe_provider |
funasr |
funasr (local, default) / whisper / openai / gemini |
polish_provider |
claude |
claude / openai / gemini |
meeting_notes_provider |
claude |
claude / openai / gemini |
stt.funasr.hotword |
"" |
Space-separated hotwords to boost recognition accuracy |
FunASR models (configured in stt.funasr):
| Key | Default | Description |
|---|---|---|
model |
paraformer-zh |
ASR model — downloaded automatically on first run (~400 MB) |
vad_model |
fsmn-vad |
Voice activity detection — enables long-audio support |
punc_model |
ct-punc |
Punctuation restoration |
hotword |
"" |
Domain-specific terms (space-separated) to improve accuracy |
chunk_secs |
300 |
Split audio into chunks of this length (seconds) for parallel transcription; 0 = always serial |
workers |
0 |
Parallel FunASR instances; 0 = auto (max(2, cpu_count / 2)); memory scales with this value |
Optional: switch back to Whisper
Install faster-whisper and set transcribe_provider to whisper in config.jsonc:
pip3 install faster-whisper| Whisper Model | Size | Speed | Accuracy |
|---|---|---|---|
tiny |
~75 MB | Fastest | Fair |
base |
~150 MB | Fast | Good |
small |
~480 MB | Medium | Better |
medium |
~1.5 GB | Slow | Very good |
large-v3 |
~3 GB | Slowest | Best |
Q: No system audio captured (can't hear meeting app audio)
- Check Audio MIDI Setup — confirm BlackHole 2ch is checked in the Multi-Output Device
- Check System Settings → Sound → Output — confirm Multi-Output Device is selected
- Check that
output_recordinconfig.jsoncexactly matches the device name (spaces matter)
Q: claude command not found
npm install -g @anthropic-ai/claude-code
claude loginConfirm Node.js is installed: node --version (requires 18+)
Q: First run is slow / downloading models
FunASR downloads paraformer-zh, fsmn-vad, and ct-punc on the first run (~400 MB total). They are cached locally and not re-downloaded. Ensure a stable network connection for the first run.
Q: How to confirm device names
python3 meetingscribe.py devicesThe listed names are exactly what you should put in config.jsonc. Names are case-sensitive.
Q: macOS requests microphone permission Click Allow when prompted. If you previously denied it, re-enable it in System Settings → Privacy & Security → Microphone.
支持 macOS 和 Windows 的会议记录助手 — 同时录制扬声器与麦克风声音,自动转写,最终由 AI 生成会议纪要或面试总结。
| 条件 | 说明 |
|---|---|
| macOS 12+ | 使用 CoreAudio API |
| Python 3.9+ | python3 --version 确认 |
| Node.js 18+ | 用于安装 Claude Code CLI |
| Homebrew | 用于安装 BlackHole |
| 条件 | 说明 |
|---|---|
| Windows 10/11 64位 | |
| Python 3.9+ | 从 python.org 下载,安装时勾选 "Add to PATH" 和 "tcl/tk" |
| Node.js 18+ | 用于安装 Claude Code CLI |
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"brew install --cask blackhole-2ch # 虚拟音频驱动,用于捕获系统播放的音频
brew install ffmpeg # FunASR 转写所需的音频解码工具这一步让系统在播放声音给扬声器的同时,也把声音送入 BlackHole,从而实现录制。
-
打开「音频 MIDI 设置」:Spotlight 搜索,或运行
open "/System/Applications/Utilities/Audio MIDI Setup.app" -
左下角点击「+」→「创建多输出设备」
-
在右侧列表中勾选:
- ✅ 你的扬声器(如
MacBook Air 扬声器/ 外接耳机) - ✅
BlackHole 2ch
- ✅ 你的扬声器(如
-
勾选
BlackHole 2ch那行的「漂移校正」复选框 -
右键新建的「多输出设备」→「将此设备用作系统声音输出」
-
记下该设备的名称(默认是「多输出设备」,可双击重命名)
完成后,系统播放声音时会同时进入 BlackHole,MeetingScribe 即可捕获。
Claude Code CLI 用于 AI 校对和生成会议纪要。
npm install -g @anthropic-ai/claude-code
claude login # 按提示完成授权登录
claude --version # 确认安装成功cd meetingscribe
# 先安装 PyTorch(CPU 版;如需 GPU 版请访问 https://pytorch.org 选择对应命令)
pip3 install torch torchaudio
# 再安装其余依赖
pip3 install -r requirements.txt打开项目目录下的 config.jsonc,根据你自己的设备名称修改以下三项:
"output_record": "多输出设备", // 第三步创建的多输出设备名称
"output_restore": "MacBook Air Speakers", // 录音结束后恢复的扬声器名称
"device_mic": "MacBook Air Microphone" // 麦克风名称如何查看设备名称:
python3 meetingscribe.py devices扬声器名称可在系统「声音」设置 → 输出 中查看。
下载并安装 VB-Audio Virtual Cable(免费): https://vb-audio.com/Cable/
这是 BlackHole 的 Windows 等价工具,用于捕获系统播放的音频。
下载并安装 VoiceMeeter Banana(免费): https://vb-audio.com/Voicemeeter/banana.htm
VoiceMeeter 可以将系统音频同时送到真实扬声器和 Virtual Cable,等价于 macOS 的「多输出设备」。
VoiceMeeter 配置方法:
- 打开 VoiceMeeter Banana
- 在 HARDWARE INPUT 1 中选择你的麦克风
- 在 HARDWARE OUT A1 中选择你的扬声器 / 耳机
- 在 VIRTUAL INPUTS 中,将路由启用到 B1(即 Virtual Cable)
- 右键任务栏扬声器图标 → 「声音设置」→ 将输出设备改为 VoiceMeeter Input
配置完成后 VoiceMeeter 后台运行,每次录音无需手动切换音频设备。
npm install -g @anthropic-ai/claude-code
claude logincd meetingscribe
pip install torch torchaudio
pip install -r requirements.txtWindows 下不需要自动切换输出设备(VoiceMeeter 已常驻处理路由),将 output_record 和 output_restore 置空,并更新设备名称:
"output_record": "", // Windows 下留空
"output_restore": "", // Windows 下留空
"device_system_audio": "CABLE Output (VB-Audio Virtual Cable)",
"device_mic": "麦克风 (你的麦克风名称)"查看设备名称:
python meetingscribe.py devicespython3 meetingscribe.py ui使用流程:
- 点击「▶ 开始录音」→ 开始会议
- 会议结束后点「◼ 停止录音」
- 点击「开始整理会议纪要」或「开始整理面试记录」
- 等待处理完成,点击「打开结果文件」查看 Markdown 纪要
# 录音 + 自动生成会议纪要(Ctrl+C 停止录音)
python3 meetingscribe.py record
# 面试模式
python3 meetingscribe.py record --mode interview
# 处理已有录音文件
python3 meetingscribe.py transcribe /path/to/audio.wav
python3 meetingscribe.py transcribe /path/to/audio.wav --mode interview录音文件默认保存在 ~/Documents/meetingscribe/recordings/,处理结果与录音同目录:
| 文件后缀 | 内容 |
|---|---|
.wav |
录音文件(系统音频 + 麦克风双路) |
.raw.txt |
原始转写文本(含时间戳) |
.proofread.txt |
AI 校对后文本 |
.md |
会议纪要 / 面试总结(Markdown 格式) |
重复运行时会自动检测已完成的步骤并跳过,无需重新转写。
配置文件为项目目录下的 config.jsonc,支持 // 注释。常用配置项:
| 配置项 | 默认值 | 说明 |
|---|---|---|
mode |
meeting |
默认模式:meeting(会议)/ interview(面试) |
transcribe_provider |
funasr |
转写引擎:funasr(本地,默认)/ whisper / openai / gemini |
polish_provider |
claude |
校对模型:claude / openai / gemini |
meeting_notes_provider |
claude |
纪要模型:claude / openai / gemini |
stt.funasr.hotword |
"" |
热词(空格分隔),提升专有名词识别率 |
FunASR 配置项(stt.funasr 下):
| 配置项 | 默认值 | 说明 |
|---|---|---|
model |
paraformer-zh |
ASR 模型,首次运行自动下载(约 400 MB) |
vad_model |
fsmn-vad |
语音活动检测,支持长音频分句 |
punc_model |
ct-punc |
标点恢复模型 |
hotword |
"" |
热词(空格分隔),提升领域专有词识别率 |
chunk_secs |
300 |
超过此时长自动分块并发转写(秒),0 = 始终串行 |
workers |
0 |
并发实例数,0 = 自动(max(2, CPU核数/2)),内存随之线性增长 |
可选:切换回 Whisper
安装 faster-whisper 并在 config.jsonc 中将 transcribe_provider 改为 whisper:
pip3 install faster-whisper| Whisper 模型 | 大小 | 速度 | 准确度 |
|---|---|---|---|
tiny |
~75 MB | 最快 | 一般 |
base |
~150 MB | 快 | 较好 |
small |
~480 MB | 中等 | 好 |
medium |
~1.5 GB | 慢 | 很好 |
large-v3 |
~3 GB | 最慢 | 最佳 |
Q:录不到会议软件的声音
- 检查「音频 MIDI 设置」→ 多输出设备是否勾选了 BlackHole 2ch
- 检查系统「声音」→「输出」是否选择了多输出设备
- 检查
config.jsonc中output_record的名称是否与多输出设备完全一致(包括空格)
Q:claude 命令找不到
npm install -g @anthropic-ai/claude-code
claude login确认 Node.js 已安装:node --version(需要 18+)
Q:首次运行转写很慢 / 正在下载模型
FunASR 在首次运行时会自动下载 paraformer-zh、fsmn-vad、ct-punc 三个模型(合计约 400 MB),下载完成后本地缓存,后续无需重新下载。请确保首次运行时网络畅通。
Q:如何确认设备名称是否正确
python3 meetingscribe.py devices列出的名称即为可填入 config.jsonc 的值。注意名称区分大小写。
Q:macOS 要求麦克风权限 首次运行时系统会弹出权限请求,点击「允许」即可。 如已拒绝,可在「系统设置」→「隐私与安全性」→「麦克风」中重新开启 Terminal / Python 的权限。