让 AI 开口说话 — 基于 MLXAudio 的高质量本地语音播报
写代码时懒得看屏幕?iSpeak 自动把你的 AI 助手的回复读给你听。
音色自然、响应快、只说最新那句,不打扰你正在播的音乐。
| 🗣️ 替我读 | ⚡ 秒回 | 🧹 少噪音 | 🎵 不打断 | 🔌 开箱即用 |
|---|---|---|---|---|
| AI 回复自动播报 不用盯着屏幕 |
开口不到半秒 听到的速度 |
跳过代码/表格 清掉路径和 URL |
播报前暂停音乐 播完自动恢复 |
一条命令装好 自动注册自启动 |
- MLXAudio + VoxCPM2 原生 TTS —
mlx-audio-swift加载 VoxCPM2 架构(4bit 量化),统一模型加载和生成 API - Apple Silicon MLX — 本地 GPU 推理,隐私安全,RTF > 1.0(快于实时)
- 4 种预置音色 — 温暖、甜美、知性、沉稳,按来源自动匹配
- 零样本合成 — 无需参考音频即可生成自然语音
- Streaming — 边生成边播,不等待
git clone https://github.com/xdfnet/iSpeak && cd iSpeak
./install.sh # 编译 + 部署 + 初始化 + 模型下载,一条命令搞定播报时通过 iDict 自动暂停/恢复音乐,
需同时安装 iDict 并保持运行。
安装完成后,服务已经在后台运行,无需任何操作。AI 助手回复时会自动播报。
ispeak status # 查看服务是否在跑
ispeak version # 版本信息
ispeak speak "你好" # 手动播报一段文本
ispeak speak -s codex "文本" # 指定来源(匹配音色)
ispeak speak -v dayi "文本" # 指定音色ispeak restart # 重启服务
ispeak stop # 停止服务
ispeak serve # 前台启动(调试用)ispeak voice list # 列出所有音色
ispeak voice add -i my -n "我的音色" --ref-audio voice.wav --ref-text "参考文本"
ispeak voice remove my # 删除音色| 音色 ID | 名称 | 说明 |
|---|---|---|
| mizai | 米仔 | 温暖自然,默认音色 |
| taozi | 甜妹桃子 | 活泼甜美,Claude 默认 |
| wanwan | 湾湾小何 | 温柔知性,Codex 默认 |
| dayi | 大易 | 沉稳可靠,Pi 默认 |
音色匹配规则:显式指定 --voice > sourceVoices 映射 > defaultVoice
refAudio / refText 只作为音色参考使用,不会作为要续读或朗读的正文。iSpeak 每条播报都是独立合成,不向模型传 continuation prompt。
make model # 准备模型缓存目录(模型由 MLXAudio 自动下载)默认模型:VoxCPM2(4bit 量化),托管于 Hugging Face — mlx-community/Qwen3-TTS-12Hz-0.6B-Base-4bit
安装后自动接入三个 AI 工具:
- Claude Code →
~/.claude/settings.json— Stop Hook - Codex →
~/.codex/hooks.json— Stop Hook(首次触发时授权即可) - Pi →
~/.pi/agent/settings.json— Extension 注册
Codex 用户注意:首次触发 Hook 时需要确认允许,之后自动生效。
iSpeak 会在播报前做两层清洗:
- Markdown 结构过滤:跳过代码块、行内代码、HTML、图片、表格、分隔线
- 行内噪音过滤:清掉 URL、常见绝对路径、commit hash、UUID、终端转义、下载速度和 ETA 等朗读噪音
版本号、API 名、百分比和普通语义文本会保留。
make build # 编译 release
make deploy # 部署 runtime 文件
make run # 编译 + 前台启动(看日志)
make clean # 清理 .build| 模块 | 文件 | 说明 |
|---|---|---|
| VoxCPM2 TTS | mlx-audio-swift |
VoxCPM2 模型加载、流式合成、三模式音色(design/reference/hifi) |
| TTS Engine | TTS/TTSEngine.swift |
配置接入、合成、重试 |
| 音频播放 | Audio/ |
PCM 播放队列、媒体控制(iDict 联动) |
| 守护进程 | Daemon/Daemon.swift |
Unix Socket 服务,接收播报请求 |
| 命令行 | Commands/ |
ArgumentParser 子命令 |
| 配置 | iSpeakKit/Config.swift |
JSON 配置读写 |
~/.config/ispeak/config.json:
{
"model": { "path": "mlx-community/Qwen3-TTS-12Hz-0.6B-Base-8bit" },
"defaultVoice": "mizai",
"sourceVoices": { "claude": "taozi", "codex": "wanwan", "pi": "dayi" },
"voices": [
{ "id": "mizai", "name": "米仔", "refAudio": "voices/ref_mizai.wav", "refText": "大家好…" }
]
}refText 应填写参考音频里真实说出的文本,用于帮助模型对齐音色;它不是播报内容,也不会被自动续读。
部署文件全部在 ~ 下,删掉项目目录不影响运行。
AI 助手回复
↓ (Stop Hook)
ispeak speak "文本"
↓ (Unix Socket)
守护进程 → TTS 合成 (MLXAudio on MLX GPU)
↓ (PCM int16,保持模型采样率)
音频播放器 → 暂停音乐 (iDict) → 扬声器 → 恢复音乐
- macOS 14 Sonoma+
- Apple Silicon (M1+)
- Swift 6 / Xcode 15+
- iDict — 媒体控制(保持运行即可,无需额外配置)
MIT