Blog
AI & Machine Learning·8 min read

praat met je AI-agent via AirPods — een Siri voice pipeline in 50 regels

Hoe je een handsfree spraakinterface bouwt voor elke AI-agent met Siri Shortcuts, Edge TTS en een kleine Node.js server

Jo Vinkenroye·February 21, 2026
praat met je AI-agent via AirPods — een Siri voice pipeline in 50 regels

Je hebt ergens een AI-agent draaien — misschien een lokaal LLM, misschien een agent met geheugen en tools, misschien gewoon een OpenAI-wrapper. Je praat ermee door te typen. In een browser. Als een holbewoner.

Wat als je gewoon kon zeggen "Siri, praat met mijn agent" terwijl je rondloopt met AirPods in? Telefoon op slot, handsfree, volledig gesprek?

Blijkt dat het zo'n 50 regels JavaScript en 45 minuten van je tijd kost.

de architectuur

Vijf onderdelen. Eentje is een Siri Shortcut. Eentje is 50 regels code. De rest heb je waarschijnlijk al.

  1. Siri Shortcut — spraak-naar-tekst op je iPhone
  2. Voice API — kleine Node.js server die alles aan elkaar lijmt
  3. Je AI-agent — elk OpenAI-compatibel chat completions endpoint
  4. Edge TTS — gratis tekst-naar-spraak (324 stemmen, nul kosten)
  5. Cloudflare Tunnel — gratis HTTPS-blootstelling voor je server

1. de siri shortcut

Maak een nieuwe Shortcut op je iPhone met drie acties:

  1. Dictate Text — Siri luistert en transcribeert
  2. Get Contents of URL — POST de tekst naar je voice API
  3. Play Sound — speel het MP3-antwoord af

Configureer de URL-actie:

  • Methode: POST
  • Headers:
    • Content-Type: application/json
    • Authorization: Bearer your-secret-token
  • Body (JSON):
    • text: Dictated Text (de magische variabele uit stap 1)

Noem het wat je wilt. "Assistent", "Jarvis", "Computer" — activeer het dan met "Siri, [naam]".

Zo ziet het eruit:

Siri Shortcut setup
Siri Shortcut setup

Werkt met telefoon op slot. Werkt met AirPods. Werkt terwijl je de hond uitlaat.

2. de voice API

Dit is de volledige server:

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'));

Installeer dependencies en start:

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

Dat is alles. De API ontvangt tekst, vraagt het aan je AI-agent, zet het antwoord om naar spraak en stuurt een MP3 terug.

3. je AI-agent

De voice API roept elk OpenAI-compatibel /v1/chat/completions endpoint aan. Dat betekent dat het werkt met:

  • OpenAI rechtstreeks (https://api.openai.com/v1/chat/completions)
  • Lokale LLM's via Ollama, LM Studio, vLLM, etc. (http://localhost:11434/v1/chat/completions)
  • AI-agents zoals OpenClaw, LangServe, of alles wat het OpenAI-formaat aanbiedt
  • Anthropic via een proxy of compatibele wrapper

Als je AI-agent geheugen, tools en persistente sessies heeft — dan heb je nu een spraakinterface naar een volledige agent, niet zomaar een chatbot. Het user-veld in de request body geeft je sessiepersistentie out of the box — je agent onthoudt eerdere spraakgesprekken.

Stel de omgevingsvariabelen in:

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

de system prompt truc

De sleutel om dit goed te laten werken is de system prompt:

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

Zonder dit antwoordt je AI-agent met opmaak, codeblokken, opsommingstekens — dat klinkt allemaal verschrikkelijk via TTS. Deze prompt dwingt gespreksmodus af terwijl alle mogelijkheden intact blijven.

4. Edge TTS — de gratis stem

Edge TTS is Microsofts tekst-naar-spraak-engine uit de "Voorlezen"-functie van Edge browser. Het is gratis, het heeft 324 stemmen en de kwaliteit is oprecht goed.

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

Goede stemmen om te proberen:

  • en-US-AndrewNeural — natuurlijk, conversationeel (mijn standaard)
  • en-US-JennyNeural — helder, professioneel
  • en-GB-SoniaNeural — Brits, warm
  • zh-CN-XiaoxiaoNeural — Chinees Mandarijn
  • de-DE-ConradNeural — Duits

Gratis. Snel. Geen API-keys. Geen limieten. Vergeleken met OpenAI TTS voor $15/miljoen tekens is dit een no-brainer voor een persoonlijk project.

5. Cloudflare Tunnel

Siri Shortcuts hebben HTTPS nodig. Als je server dat niet heeft, geeft Cloudflare Quick Tunnels je een publieke URL in één commando:

# 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

Je krijgt een URL zoals https://random-words.trycloudflare.com. Zet die in je Siri Shortcut als https://random-words.trycloudflare.com/voice.

Quick tunnels zijn gratis maar tijdelijk — de URL verandert als je herstart. Voor een permanente setup gebruik je een named tunnel met je eigen domein.

totale kosten

Alles behalve de AI zelf is gratis:

  • Siri Shortcut — gratis
  • Voice API — gratis (Node.js)
  • Edge TTS — gratis (324 stemmen, geen API-key)
  • Cloudflare Tunnel — gratis
  • Je AI-agent — hangt ervan af (lokaal LLM = gratis, OpenAI = alleen tokenkosten)

Geen TTS-kosten. Geen spraak-naar-tekst-kosten. Siri doet de transcriptie, Edge TTS doet de spraak. Je betaalt alleen voor de chat completion tokens — als dat al nodig is.

latentie

Typisch end-to-end: 3-5 seconden van het einde van je zin tot het horen van het antwoord.

  • Siri-transcriptie: ~500ms
  • Netwerk naar server: ~200ms
  • AI-antwoord: ~1-2s (varieert per model)
  • Edge TTS generatie: ~500ms
  • Netwerk terug + audio start: ~200ms

Snel genoeg om als een gesprek te voelen. Niet snel genoeg om elkaar te onderbreken. Dat is waarschijnlijk prima.

OpenClaw quickstart

Als je OpenClaw draait, hier is de kant-en-klare setup. OpenClaw biedt een OpenAI-compatibel endpoint aan op je gateway, dus de voice API praat rechtstreeks met je agent — met volledig geheugen, tools en sessiecontext.

1. Schakel het chat completions endpoint in:

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

2. Haal je gateway token op:

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

3. Stel je omgevingsvariabelen in:

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. Start de voice server + tunnel:

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

5. Maak de Siri Shortcut met de tunnel URL + je auth token.

Dat is het. Je praat nu met je volledige OpenClaw-agent via AirPods — dezelfde agent die je berichten, e-mails, bestanden en tools afhandelt. Geen uitgeklede spraakwrapper.

pro tip: actieknop

Als je een iPhone 15 Pro of nieuwer hebt, sla de spraakactivering helemaal over. Koppel je Actieknop aan de Siri Shortcut:

Instellingen → Actieknop → Snelle opdracht → selecteer je spraaksnelkoppeling

Eén druk. Dicteren. Klaar. Geen "Siri, ..." voorvoegsel nodig. Het is de snelste manier om dit te activeren.

verbeteringen

Een paar upgrades als je verder wilt gaan:

  • Streaming TTS — verdeel de AI-output in stukken en genereer TTS incrementeel om de waargenomen latentie te halveren
  • Named tunnel + eigen domein — zodat je Siri Shortcut URL niet breekt bij herstart
  • Meerdere stemmen — detecteer de taal in het antwoord en wissel automatisch van TTS-stem (Edge TTS ondersteunt 40+ talen)
  • Wachtwoord zonder Siri — draai een wake word detector op een Raspberry Pi voor altijd-aan luisteren

het geheel in een notendop

"Siri, assistent"
→ iPhone transcribeert spraak
POST naar je server
→ Server vraagt je AI-agent
→ Agent antwoordt (2-3 zinnen)
→ Edge TTS zet om naar MP3
MP3 speelt af via AirPods
3-5 seconden totaal

50 regels JavaScript. Gratis TTS. Werkt met elke AI-backend. Handsfree, telefoon op slot, AirPods in.

Soms zijn de beste hacks de simpelste.

Stay Updated

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

No spam, ever. Unsubscribe anytime.

Comments

Related Posts