Blog
AI & Machine Learning·11 min read

通过 AirPods 和你的 AI 智能体对话 — 50 行代码打造 Siri 语音管线

如何使用 Siri Shortcuts、Edge TTS 和一个小型 Node.js 服务器,为任何 AI 智能体构建免提语音接口

Jo Vinkenroye·February 21, 2026
通过 AirPods 和你的 AI 智能体对话 — 50 行代码打造 Siri 语音管线

你有一个 AI 智能体在某个地方运行着——也许是本地 LLM,也许是带记忆和工具的智能体,也许只是一个 OpenAI 的封装。你跟它交流的方式是打字。在浏览器里。像个原始人一样。

如果你能戴着 AirPods 走在路上,直接说"Siri,跟我的智能体聊聊"呢?手机锁屏,解放双手,完整对话?

事实证明,这只需要大约 50 行 JavaScript 和 45 分钟的时间。

架构

五个部分。一个是 Siri Shortcut。一个是 50 行代码。其余的你可能已经有了。

  1. Siri Shortcut — iPhone 上的语音转文字
  2. Voice API — 把所有东西粘在一起的小型 Node.js 服务器
  3. 你的 AI 智能体 — 任何 OpenAI 兼容的 chat completions 端点
  4. Edge TTS — 免费文字转语音(324 种声音,零成本)
  5. Cloudflare Tunnel — 为你的服务器提供免费 HTTPS 暴露

1. Siri 快捷指令

在你的 iPhone 上创建一个新的快捷指令,包含三个操作:

  1. Dictate Text — Siri 监听并转录
  2. Get Contents of URL — 将文本 POST 到你的 voice API
  3. Play Sound — 播放 MP3 响应

配置 URL 操作:

  • 方法: POST
  • Headers:
    • Content-Type: application/json
    • Authorization: Bearer your-secret-token
  • Body (JSON):
    • textDictated Text(步骤 1 的魔法变量)

随便起个名字。"助手"、"Jarvis"、"电脑"——然后用 "Siri,[名字]" 来触发它。

看起来是这样的:

Siri Shortcut setup
Siri Shortcut setup

锁屏状态下可用。戴着 AirPods 可用。遛狗的时候也可用。

2. Voice API

这就是整个服务器:

const express = require('express');
const { execSync } = require('child_process');
const fs = require('fs');
const app = express();
app.use(express.json());
const AUTH_TOKEN = process.env.AUTH_TOKEN || 'your-secret-token';
const AI_URL = process.env.AI_URL || 'https://api.openai.com/v1/chat/completions';
const AI_TOKEN = process.env.AI_TOKEN || 'your-ai-api-key';
const AI_MODEL = process.env.AI_MODEL || 'gpt-4o';
const TTS_VOICE = process.env.TTS_VOICE || 'en-US-AndrewNeural';
app.post('/voice', async (req, res) => {
try {
const token = (req.headers['authorization'] || '')
.replace('Bearer ', '').trim();
if (token !== AUTH_TOKEN)
return res.status(401).json({ error: 'unauthorized' });
const text = req.body?.text;
if (!text)
return res.status(400).json({ error: 'no text' });
// 1. Ask your AI agent
const r = await fetch(AI_URL, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + AI_TOKEN,
},
body: JSON.stringify({
model: AI_MODEL,
max_tokens: 300,
user: 'voice-user', // persistent session across calls
messages: [
{
role: 'system',
content: 'User is speaking via voice. Keep responses '
+ 'SHORT (2-3 sentences). Spoken aloud. '
+ 'No markdown, bullets, code, or URLs.'
},
{ role: 'user', content: text }
],
}),
});
const data = await r.json();
let reply = data.choices?.[0]?.message?.content || 'No response.';
// 2. Convert to speech (free!)
const tmp = '/tmp/voice-' + Date.now() + '.mp3';
execSync(
`edge-tts --voice ${TTS_VOICE} ` +
`--text '${reply.replace(/'/g, "'\\''")}' ` +
`--write-media ${tmp} 2>/dev/null`,
{ timeout: 15000 }
);
const audio = fs.readFileSync(tmp);
fs.unlinkSync(tmp);
res.set('Content-Type', 'audio/mpeg');
res.send(audio);
} catch (err) {
if (!res.headersSent)
res.status(500).json({ error: err.message });
}
});
app.get('/health', (req, res) => res.json({ ok: true }));
app.listen(3456, () => console.log('Voice API on :3456'));

安装依赖并运行:

npm init -y
npm install express
pip install edge-tts
node server.js

就这样。API 接收文本,询问你的 AI 智能体,将回复转换为语音,然后发回一个 MP3。

3. 你的 AI 智能体

Voice API 调用任何 OpenAI 兼容的 /v1/chat/completions 端点。这意味着它可以配合以下使用:

  • OpenAI 直连(https://api.openai.com/v1/chat/completions
  • 本地 LLM 通过 Ollama、LM Studio、vLLM 等(http://localhost:11434/v1/chat/completions
  • AI 智能体 如 OpenClaw、LangServe,或任何暴露 OpenAI 格式的服务
  • Anthropic 通过代理或兼容封装

如果你的 AI 智能体有记忆、工具和持久会话——你现在拥有了一个连接到完整智能体的语音接口,而不仅仅是一个聊天机器人。请求体中的 user 字段直接提供会话持久性——你的智能体会记住之前的语音对话。

设置环境变量:

export AI_URL="http://localhost:11434/v1/chat/completions" # ollama example
export AI_TOKEN="not-needed-for-local"
export AI_MODEL="llama3"

system prompt 的技巧

让这一切运作良好的关键是 system prompt:

User is speaking via voice. Keep responses SHORT (2-3 sentences).
Spoken aloud. No markdown, bullets, code, or URLs.

没有这个,你的 AI 智能体会用格式化文本、代码块、项目符号来回复——这些通过 TTS 播放出来简直难以忍受。这个 prompt 强制使用对话模式,同时保持所有能力不变。

4. Edge TTS — 免费的声音

Edge TTS 是微软从 Edge 浏览器的"大声朗读"功能中提取的文字转语音引擎。免费,有 324 种声音,质量确实不错。

pip install edge-tts
# list all voices
edge-tts --list-voices
# generate speech
edge-tts --voice en-US-AndrewNeural \
--text "Hello from your AI assistant" \
--write-media output.mp3

一些值得尝试的声音:

  • en-US-AndrewNeural — 自然、对话式(我的默认选择)
  • en-US-JennyNeural — 清晰、专业
  • en-GB-SoniaNeural — 英式、温暖
  • zh-CN-XiaoxiaoNeural — 中文普通话
  • de-DE-ConradNeural — 德语

免费。快速。不需要 API 密钥。没有配额限制。相比 OpenAI TTS 每百万字符 15 美元的价格,对于个人项目来说这毫无疑问是最佳选择。

5. Cloudflare Tunnel

Siri Shortcuts 需要 HTTPS。如果你的服务器没有,Cloudflare Quick Tunnels 一条命令就能给你一个公共 URL:

# install
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 \
-o /usr/local/bin/cloudflared
chmod +x /usr/local/bin/cloudflared
# run
cloudflared tunnel --url http://localhost:3456

你会得到一个类似 https://random-words.trycloudflare.com 的 URL。把它放到你的 Siri Shortcut 中,设为 https://random-words.trycloudflare.com/voice

Quick tunnels 是免费但临时的——重启后 URL 会变。要永久使用,请用你自己的域名配置 named tunnel

总成本

除了 AI 本身,一切都是免费的:

  • Siri Shortcut — 免费
  • Voice API — 免费(Node.js)
  • Edge TTS — 免费(324 种声音,无需 API 密钥)
  • Cloudflare Tunnel — 免费
  • 你的 AI 智能体 — 视情况而定(本地 LLM = 免费,OpenAI = 仅 token 费用)

没有 TTS 费用。没有语音识别费用。Siri 负责转录,Edge TTS 负责语音合成。你只需要为 chat completion tokens 付费——如果需要的话。

延迟

典型的端到端延迟:从说完话到听到回复 3-5 秒

  • Siri 转录:~500ms
  • 网络到服务器:~200ms
  • AI 响应:~1-2s(因模型而异)
  • Edge TTS 生成:~500ms
  • 网络返回 + 音频开始:~200ms

快到足以感觉像在对话。慢到不会互相打断。这大概刚刚好。

OpenClaw 快速上手

如果你在运行 OpenClaw,这里是一键复制的配置。OpenClaw 在你的网关上暴露一个 OpenAI 兼容的端点,所以 voice API 直接跟你的智能体通信——拥有完整的记忆、工具和会话上下文。

1. 启用 chat completions 端点:

openclaw config patch '{
"http": {
"endpoints": {
"chatCompletions": { "enabled": true }
}
}
}'

2. 获取你的 gateway token:

cat ~/.openclaw/gateway.json | jq -r '.auth.bearerTokens[0]'

3. 设置环境变量:

export AI_URL="http://127.0.0.1:18789/v1/chat/completions"
export AI_TOKEN="your-gateway-bearer-token"
export AI_MODEL="openclaw:main"
export AUTH_TOKEN="pick-a-secret-for-siri"
export TTS_VOICE="en-US-AndrewNeural"

4. 运行语音服务器 + tunnel:

node server.js &
cloudflared tunnel --url http://localhost:3456

5. 创建 Siri Shortcut,填入 tunnel URL + 你的 auth token。

搞定了。你现在可以通过 AirPods 和你完整的 OpenClaw 智能体对话了——同一个处理你的消息、邮件、文件和工具的智能体。不是一个功能缩水的语音封装。

小技巧:操作按钮

如果你有 iPhone 15 Pro 或更新的机型,完全跳过语音激活。把你的操作按钮映射到 Siri Shortcut:

设置 → 操作按钮 → 快捷指令 → 选择你的语音快捷指令

按一下。说话。完成。不需要"Siri,..."前缀。这是触发它的最快方式。

进一步优化

如果你想更进一步,这里有一些升级方向:

  • 流式 TTS — 将 AI 输出分块,增量生成 TTS,将感知延迟减半
  • Named tunnel + 自定义域名 — 让你的 Siri Shortcut URL 不会在重启时失效
  • 多语言声音 — 检测回复中的语言,自动切换 TTS 声音(Edge TTS 支持 40+ 种语言)
  • 无需 Siri 的唤醒词 — 在 Raspberry Pi 上运行唤醒词检测器,实现持续监听

总结

"Siri,助手"
→ iPhone 转录语音
POST 到你的服务器
→ 服务器询问你的 AI 智能体
→ 智能体回复(2-3 句话)
→ Edge TTS 转换为 MP3
MP3 通过 AirPods 播放
← 总共 3-5

50 行 JavaScript。免费 TTS。兼容任何 AI 后端。解放双手,手机锁屏,AirPods 戴上。

有时候最好的 hack 就是最简单的那种。

Stay Updated

Get notified about new posts on automation, productivity tips, indie hacking, and web3.

No spam, ever. Unsubscribe anytime.

Comments

Related Posts