voice-dialog
Adds voice conversation capabilities to AI agents via MCP, enabling local speech recognition and synthesis with tools like speak, listen, and ask_by_voice for interactive voice interactions.
README
voice-dialog
给 AI Agent 加语音对话能力的 MCP server,也能当命令行工具用。Agent 干完活可以说话告诉你,也能开口问你、听你回答。识别跑在本地的 whisper 上,合成用系统自带的 TTS,全程不联网、不传音频。
它能做什么
你(没看屏幕):"搞定了吗?"
Agent(出声):"代码写完了,测试全过。要提交吗?" ← ask_by_voice
你:"先不提交,我看看再说" ← listen 收到,本地转写
Agent(出声):"好,先留着。" ← speak
| 工具 | 用途 |
|---|---|
speak |
单向播报(任务完成、里程碑) |
listen |
录音+识别(你口述指令) |
ask_by_voice |
原子问答:说一句→听一次,绝不自动续听(防死循环) |
init |
一键初始化(见下) |
doctor |
环境体检(只查不装) |
快速开始
git clone https://github.com/VictorHuang0843/voice-dialog.git
cd voice-dialog
# 没装 uv?先来这个(Windows 用 install.ps1):
# curl -LsSf https://astral.sh/uv/install.sh | sh
uv run voice-dialog init
init 是 7 步全自动引导:装 uv → 装依赖(uv 连 Python 都帮你装好)→ 下载 whisper 模型(464MB,中国网络自动走 hf-mirror)→ 麦克风权限实测 → TTS 出声实测 → 打印 MCP 注册命令。哪步失败就给哪步的修复命令,修好重跑即可。
试一句:
uv run voice-dialog speak "语音系统就绪" --lang zh
uv run voice-dialog ask "请说话" --wait-start 60
# 你会听到:高亮上扬"叮↑"= 开始说话 → 停 3 秒 → 低沉"咚…咚↓"= 录音结束
接入你的 Agent
任何 MCP 客户端(Claude Code、Codex、Cursor、LoopX……):
{
"mcpServers": {
"voice-dialog": {
"command": "uv",
"args": ["--project", "/你的路径/voice-dialog", "run", "voice-dialog", "serve"]
}
}
}
Claude Code 一行注册:
claude mcp add voice-dialog -s user -- uv --project /你的路径/voice-dialog run voice-dialog serve
不支持 MCP 的工具:直接调 CLI,uv run voice-dialog speak/listen/ask "..."。
Claude Code Skill(可选,教 Agent 何时说/何时听):把 skills/voice-dialog/ 拷到 ~/.claude/skills/。
支持的平台
| macOS | Windows | Linux | |
|---|---|---|---|
| 语音识别 | 实测通过 | 可用 | 可用 |
| 语音合成 | 系统TTS | SAPI | 需装 espeak-ng |
| 提示音 | 可用 | 可用 | 需 ffmpeg |
语言自动检测(whisper 支持 ~100 种语言),VD_LANG=zh 可钉死;模型大小 VD_MODEL=small 可调。
常见问题
| 症状 | 解法 |
|---|---|
| init 报 uv 未装 | 跑上面 curl 安装命令,装完重开终端 |
| 麦克风探针失败 | macOS:系统设置→隐私与安全性→麦克风→勾选你的终端;Windows:设置→隐私→麦克风 |
| 模型下载失败/超慢 | export HF_ENDPOINT=https://hf-mirror.com 后重跑 |
| TTS 无声 | 检查系统输出设备是否被虚拟声卡(BlackHole 等)劫持 |
| 改了代码不生效 | MCP server 是常驻进程:pkill -f "voice-dialog serve" |
隐私
语音在本地识别(faster-whisper),文本用系统 TTS 播放,不调用任何云端 API,不上传任何音频。
License
MIT
模型说明
默认下载什么? whisper small(int8 量化,约 464MB),中英文识别效果和速度的平衡点。首次 listen/init 时自动下载,之后缓存在本地(macOS/Linux:~/.cache/huggingface/hub/,Windows:%USERPROFILE%\.cache\huggingface\hub\),永不再下。
下载源怎么选? 代码里不写死下载逻辑——WhisperModel("small", ...) 构造时由 faster-whisper 库自动从 HuggingFace 下载。默认走官方源 huggingface.co;官方源连不上时代码自动切国内镜像 hf-mirror.com 重试(通过设置 HF_ENDPOINT 环境变量实现)。国内用户也可以提前手动钉死:
export HF_ENDPOINT=https://hf-mirror.com # 加进 ~/.zshrc 一劳永逸
换更大的模型? 环境变量 VD_MODEL 控制,重跑生效:
| VD_MODEL | 大小 | 特点 |
|---|---|---|
tiny |
~75MB | 最快,精度一般 |
base |
~142MB | 快,日常够用 |
small(默认) |
~464MB | 平衡,推荐 |
medium |
~1.5GB | 更准,M 芯片秒级转写变十秒级 |
large-v3 |
~3GB | 最准最慢,短对话不建议 |
VD_MODEL=base uv run voice-dialog listen # 单次用 base
从 zip 安装(不用 git clone)
下载 zip(或朋友直接发你)→ 解压到想放的地方,比如 ~/tools/ → 打开终端进目录,后面交给 AI:
在 Claude Code(或任何能执行命令的 AI 编程工具)里,把下面这段原样发给它:
帮我安装这个目录里的 voice-dialog 项目:
1. cd 到这个目录跑 uv run voice-dialog init(没装 uv 就先装:curl -LsSf https://astral.sh/uv/install.sh | sh)
2. init 全绿后,把打印出来的 claude mcp add 命令执行掉
3. 最后跑 uv run voice-dialog doctor 给我看结果
它会装好一切并注册到 Claude Code,重启会话即可用。
也可以手动,就两条命令:
cd 解压后的目录
uv run voice-dialog init # 结束时打印注册命令,复制执行
Mac 上不熟悉终端的话:解压后在文件夹上右键 → 服务 → 新建位于文件夹位置的终端窗口,就到目录了。
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。