语音层
你的AI代理听不见你的声音。VoiceLayer赋予它耳朵和声音。
](https://www.npmjs.com/package/voicelayer-mcp)    
AI编码助手的语音输入/输出。 按F5,与Claude Code对话,在1.5秒内完成设备转录。你的AI会回应。适用于任何MCP客户端。
You ──🎤──> whisper.cpp ──> Claude Code ──> edge-tts ──🔊──> You
STT (local) MCP tools TTS (free)本地优先。免费。开源。 没有云API,没有API密钥,没有数据离开您的机器。部分 魔像 生态系统。
VoiceLayer作为Unix套接字上的持久单例守护进程运行——每个Claude会话都通过轻量级的 socat shim而不是生成自己的进程。11个MCP工具 工具注释.
建筑
┌─────────────────────────────────────┐
│ VoiceLayer Daemon │
│ /tmp/voicelayer-mcp.sock │
│ │
│ MCP JSONRPC ──> Tool Handlers │
│ (Content-Length ├── voice_speak │
│ framing) └── voice_ask │
│ │
│ TTS: edge-tts (retry + 30s timeout) │
│ STT: whisper.cpp / Wispr Flow │
│ VAD: Silero ONNX (speech detection) │
│ IPC: Voice Bar ← NDJSON events │
└──────────┬──────────────────────────┘
│ Unix socket
┌──────────────┼──────────────┐
│ │ │
Claude Code Claude Code Cursor/Codex
(socat shim) (socat shim) (socat shim)为什么是守护进程? 原始设计在每次Claude会话中都产生了一个新的Bun过程。随着17个以上的存储库打开,这意味着17个相互竞争的进程(700+MB RAM),争夺一个语音栏套接字,因PATH问题导致边缘tts崩溃,并留下从未死亡的孤儿。PR#67-72中提供的守护进程架构用一个进程取代了所有这些 socat 垫片。
| 度量 | 之前(每个会话生成) | 之后(守护进程) |
|---|---|---|
| 进程 | N个/会话(17+典型) | 1个守护进程+socat-shims |
| RAM | 约700 MB(17 x 41 MB) | 约50 MB |
| 孤儿清理 | 手动 pkill | PID锁文件自动终止过时 |
| edge-tts失败 | 随机(PATH,争用) | 在30秒硬超时后重试 |
| voice_ask挂起 | 最长300秒(5分钟!) | 默认30秒+外护 |
快速开始
# Install from npm
bun add -g voicelayer-mcp
# Prerequisites
brew install sox socat
pip3 install edge-tts
brew install whisper-cpp # optional — local STT
# Download a whisper model (recommended)
mkdir -p ~/.cache/whisper
curl -L -o ~/.cache/whisper/ggml-large-v3-turbo.bin \
https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo.bin或者从源代码安装:
git clone https://github.com/EtanHey/voicelayer.git
cd voicelayer && bun install启动守护进程
# Option A: LaunchAgent (auto-start on login, auto-restart on crash)
./launchd/install.sh
# Option B: Manual
bun run src/mcp-server-daemon.ts禁用VoiceLayer
DISABLE_VOICELAYER=1 是MCP守护进程的硬终止开关。
# Install the LaunchAgent in a disabled state and sync the runtime daemon flag
DISABLE_VOICELAYER=1 ./launchd/install.sh
# Or edit the template-generated plist and add:
# DISABLE_VOICELAYER
# 1如果守护进程已在运行,请创建 /tmp/.voicelayer-daemon-disabled 它将在5秒内关闭。 ./launchd/install.sh 还使该文件与保持同步 DISABLE_VOICELAYER,因此VoiceBar启动的守护程序也保持禁用状态。要重新启用它,请从中删除env变量 ~/Library/LaunchAgents/com.voicelayer.mcp-daemon.plist,删除 /tmp/.voicelayer-daemon-disabled 如果存在,则重新启动代理:
launchctl kickstart -k "gui/$(id -u)/com.voicelayer.mcp-daemon"配置MCP客户端
添加到您的 .mcp.json (在任何使用Claude Code的仓库中):
{
"mcpServers": {
"voicelayer": {
"command": "socat",
"args": ["STDIO", "UNIX-CONNECT:/tmp/voicelayer-mcp.sock"]
}
}
}或者一次迁移所有存储库:
bash scripts/migrate-to-daemon.sh # migrates every .mcp.json under ~/Gits
bash scripts/migrate-to-daemon.sh --dry-run # preview without changes允许麦克风访问您的终端(macOS:系统设置>隐私>麦克风)。
语音工具
主要工具
| 工具 | 行为 | 阻塞 | 只读 | 破坏性 | 幂等 |
|---|---|---|---|---|---|
voice_speak | TTS具有自动模式(宣布/简报/咨询/思考)、回放、切换 | 否 | 假 | 假 | 真 |
voice_ask | 说出问题+录制麦克风+转录响应 | 是 | 假 | 假 | 假的 |
向后兼容别名
| 别名 | 映射到 | 幂等 |
|---|---|---|
qa_voice_announce | voice_speak(mode='announce') | 真的 |
qa_voice_brief | voice_speak(mode='brief') | 真的 |
qa_voice_consult | voice_speak(mode='consult') | 真的 |
qa_voice_say | voice_speak(mode='announce') | 真的 |
qa_voice_think | voice_speak(mode='think') 错误的 | |
qa_voice_replay | voice_speak(replay_index=N) | 真的 |
qa_voice_toggle | voice_speak(enabled=bool) | 真的 |
qa_voice_converse | voice_ask 错误的 | |
qa_voice_ask | voice_ask 错误的 |
所有11个工具都包括MCP 工具注释。没有VoiceLayer工具具有破坏性。所有人都有 openWorldHint: false.
voice_ask的工作原理
- 等待任何游戏
voice_speak音频结束 - 通过边缘tts回答问题(失败后重试)
- 以设备本机速率录制麦克风,重新采样至16kHz
- Silero VAD检测语音开始和静音结束
- whisper.cpp在本地转录(在Apple Silicon上约200-400ms)
- 将转录返回给AI代理
可靠性特征
- PID锁定文件 (
/tmp/voicelayer-mcp.pid):启动时,检测并杀死前一个会话中的任何孤立MCP服务器 - 边缘tts重试:健康检查(缓存60秒)+每次尝试自动重试30秒硬超时
- 外部超时保护:
Promise.race对整个voice_ask流进行包装——如果有任何挂起,则返回错误,而不是永远阻塞 - 会议预订:锁文件互斥防止并发会话之间的麦克风冲突
录音控制
| 方法 | 如何 |
|---|---|
| 停车信号 | touch ~/.local/state/voicelayer/stop-{token} |
| VAD静音 | 可配置:快速(0.5秒)、标准(1.5秒)、周到(2.5秒) |
| 超时 | 默认30秒,每次通话可配置5-3600秒 |
| 推动对话 | press_to_talk: true --无VAD,仅在信号时停车 |
STT后端
| 后端 | 类型 | 延迟 | 设置 |
|---|---|---|---|
| whisper.cpp | 本地(默认) | ~200-400ms | brew install whisper-cpp +模型下载 |
| Wispr流程 | 云(回退) | ~500ms+网络 | 设置 QA_VOICE_WISPR_KEY 有人是。 |
自动检测到。覆盖 QA_VOICE_STT_BACKEND=whisper|wispr|auto.
语音栏(macOS)
浮动SwiftUI小部件在语音交互过程中提供视觉反馈。通过NDJSON连接到守护进程 /tmp/voicelayer.sock.
- 带单词级突出显示和自动滚动的提示器
- 记录过程中的波形可视化
- 可扩展药丸UI——闲置5秒后折叠成点
- 可拖动,位置在发射过程中保持不变
- 全局热键: F5(按住可按键通话)
bun add -g voicelayer-mcp
voicelayer hotkey install # Install F5/Dictation -> F18 relay
voicelayer bar # Build and launch Voice Bar热键注释:
- 需要输入监控权限(系统设置>隐私和安全)
- 在物理键为苹果听写键的键盘上,
voicelayer hotkey install安装ahidutilLaunchAgent将F5/听写映射到VoiceBar的内部F18中继。 - 安装程序保留非VoiceBar
hidutil映射,可以安全地重新运行。Shift+F5重新粘贴最新的成绩单。
高级:语音克隆
用于克隆语音的三层TTS引擎级联:
- XTTS-v2 微调(节奏+音色)
- F5-TTS MLX 零样本(本地,无守护进程)
- Qwen3-TTS 守护进程(基于HTTP)
- 边缘tts 回退(始终可用)
voicelayer extract # Extract voice samples
voicelayer clone # Build voice profile
voicelayer daemon --port 8880 # Run Qwen3-TTS serverQwen3守护进程现在使用来自的承载身份验证 ~/.voicelayer/daemon.secret (在首次使用模式启动时创建 0600).TypeScript桥读取 自动生成相同的文件。用以下内容覆盖位置 VOICELAYER_TTS_DAEMON_SECRET_FILE, VOICELAYER_TTS_AUTH_TOKEN_FILE,或 voicelayer daemon --daemon-secret-file ... 如果你需要一个自定义启动器 路径。守护进程只接受 Host: 127.0.0.1:8880 / Host: localhost:8880,拒绝非本地 Origin 标题,并且只读取 reference_wav 在下解析的文件 ~/.voicelayer/voices/.
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
QA_VOICE_STT_BACKEND | auto | STT后端: whisper, wispr,或 auto |
QA_VOICE_WHISPER_MODEL | 自动检测 | whisper.cpp GGML模型的路径 |
QA_VOICE_WISPR_KEY | -- | Wispr Flow API密钥(云回退) |
QA_VOICE_TTS_VOICE | en-US-JennyNeural | 边缘tts语音ID |
QA_VOICE_TTS_RATE | +0% | 基本语音速率 |
VOICELAYER_TTS_DAEMON_SECRET_FILE | ~/.voicelayer/daemon.secret | 共享Qwen3守护进程承载秘密文件的首选覆盖 |
VOICELAYER_TTS_AUTH_TOKEN_FILE | ~/.voicelayer/daemon.secret | 共享Qwen3守护进程承载秘密文件的向后兼容覆盖 |
测试
bun test # 585 Bun tests + 1 skip (latest verified on PR #190 pre-push gate)
bash flow-bar/run_tests.sh # 144 Swift tests for VoiceBar
git config core.hooksPath .githooks # install repo pre-push hook once per clone (#181, #182)测试范围包括:MCP协议框架、工具处理程序、TTS合成+重试、VAD语音检测、会话预订、进程锁生命周期、套接字客户端重新连接、边缘TTS健康检查、模式验证、希伯来语STT评估基线、守护进程弹性、ToolAnnotations、SSML净化和安全路径强化。
近期硬化(2026-04-27→2026-05-02)
一周的冲刺集中在VoiceBar的可靠性和一个记录语料库上,以对抗STT回归。下面的每一行都指向一个合并的PR。
记录可靠性
- 录制控件可点击性恢复——F6插座控件在药丸动画期间保持交互式(#188).
- 调整大小时保留药丸底部锚点,因此UI不会偏离屏幕(#187).
- 波形在真实音频输入上再次动画化+删除冗余的“收听”副本(#184).
- 波形动态范围恢复到静音门上方(#185).
- 支持自定义VoiceBar安装路径(不再硬编码
/Applications/VoiceBar.app) (#186). - VoiceBar转录通过录音RMS门保存,因此安静的语音得以保留(#177).
- 停滞的后台程序重启检测——后台程序重启后,VoiceBar转录会自动恢复(#183).
STT质量
VoiceBar听写语料库(第一阶段) — #190
- 每个成功的VoiceBar听写都存档在
~/.local/share/voicelayer/recordings/YYYY-MM-DD//随着audio.wav+voicelayer-transcript.txt+metadata.json(模式v1,WAV字节上的SHA-256)。 - 原子重命名+fsync,因此部分写入永远不会出现在语料库中。
- 取消的或空的转录被跳过——只有真实的听写会放在磁盘上。
- 重新粘贴热键移动到
Shift+F5;平原F5现在是通过VoiceBar的F18中继进行的默认记录启动/停止激活。
测试基础设施
项目结构
voicelayer/
├── src/ # TypeScript/Bun (18K lines, 69 files)
│ ├── mcp-server-daemon.ts # Singleton daemon entry point
│ ├── mcp-server.ts # Stdio MCP server (legacy)
│ ├── mcp-daemon.ts # Unix socket server (dual-protocol)
│ ├── mcp-framing.ts # Content-Length + NDJSON framing
│ ├── mcp-handler.ts # JSONRPC request router
│ ├── process-lock.ts # PID lockfile (orphan prevention)
│ ├── handlers.ts # Tool handler implementations
│ ├── tts.ts # Multi-engine TTS with playback queue
│ ├── tts-health.ts # edge-tts health check + retry
│ ├── input.ts # Mic recording + STT pipeline
│ ├── vad.ts # Silero VAD (ONNX inference)
│ ├── stt.ts # STT backend abstraction
│ ├── socket-client.ts # Voice Bar IPC (auto-reconnect)
│ ├── session-booking.ts # Lockfile mutex
│ ├── paths.ts # Centralized path constants
│ └── __tests__/ # 536 tests across 48 files
├── flow-bar/ # SwiftUI macOS app (1.9K lines, 9 files)
│ ├── Sources/VoiceBar/ # App source
│ └── Tests/ # Swift tests
├── scripts/
│ ├── migrate-to-daemon.sh # Batch .mcp.json migration
│ └── edge-tts-words.py # Word-level TTS with timestamps
├── launchd/ # macOS LaunchAgent auto-start
├── models/ # Silero VAD ONNX model
└── package.json # v2.0.0平台支持
| 平台 | TTS | STT | 录音 | 语音栏 |
|---|---|---|---|---|
| macOS | edgetts+afplay | whisper.cpp(CoreML) | sox | SwiftUI应用程序 |
| Linux | 边缘tts+mpv/ffplay | whisper.cpp | sox | -- |
傀儡的一部分
VoiceLayer是三个开源MCP服务器之一 魔像 生态系统:
| 服务器 | 功能 | 工具 |
|---|---|---|
| BrainLayer | AI代理的持久内存——知识图+混合搜索 | 12 |
| 语音层 | 语音输入/输出——本地STT、神经TTS、F5按键通话 | 11 |
| cmuxLayer | 终端编排--生成窗格、读取屏幕、协调代理 | 22 |
与BrainLayer配对,记住会话中的语音对话。
