Dit is de complete technische uitleg van de live-stem-Conductor.
Daarmee praat Jamal live met Claude (de Conductor) via zijn stem.
Net als de back-end-handleiding die we voor Jarvis hebben.
De stem-Conductor is een webpagina.
Je opent de pagina, drukt op de microfoon, en praat.
Je ziet live je eigen tekst verschijnen.
Je ziet ook het antwoord van Conductor als tekst.
En Conductor praat terug met de Sulafat-stem.
Het brein is Claude/Conductor mét tools — dus mét geheugen én volle macht over Jamals computers.
Het is dus geen kale chatbot, maar de echte Conductor met handen.
Adres:
http://localhost:8765https://conductor-macbook.tail2d7247.ts.netLogin (Basic-auth):
Belangrijk over het adres:
.ts.net-naam op de MacBook een dood adres (NXDOMAIN).De stem-Conductor heeft vier onderdelen.
A. De server (het hart)
~/.claude/scripts/praat-conductor-server.pyhttp.server (geen extra framework).127.0.0.1 (localhost) en op de Tailscale-IP 100.88.240.64.0.0.0.0 — dat zou een LAN-datalek zijn.B. De LaunchAgent (houdt het aan)
~/Library/LaunchAgents/nl.haarvisie.praat-conductor.plistnl.haarvisie.praat-conductor/usr/bin/python3 .../praat-conductor-server.py.RunAtLoad = true → start meteen bij inloggen.KeepAlive = true → start automatisch opnieuw als hij stopt.~/.claude/praat/server.log (uitvoer) + ~/.claude/praat/server.err (fouten).C. De motor (Anthropic Messages-API)
claude-CLI opnieuw op (9 seconden vaste boot).urllib)._anthropic() doet de API-call.MESSAGES.D. De hand (run_bash-tool)
run_bash.bash -lc)._bash() voert het uit (timeout 120s, output afgekapt op 4000 tekens).Hoe een beurt loopt:
/ask_stream.run_conductor() praat met de Messages-API.| Onderdeel | Pad |
|---|---|
| Server-script | ~/.claude/scripts/praat-conductor-server.py |
| Webpagina | ~/.claude/praat/index.html |
| Secrets (API-keys) | ~/.claude/praat/.env (rechten 600) |
| LaunchAgent | ~/Library/LaunchAgents/nl.haarvisie.praat-conductor.plist |
| Uitvoer-log | ~/.claude/praat/server.log |
| Fout-log | ~/.claude/praat/server.err |
| Werkmap / cameraplaatje | ~/.claude/praat-workspace/ (camera = cam.jpg) |
| TTS-script (Sulafat) | ~/.claude/scripts/tts-gemini.py |
| Telegram-verzender | ~/.claude/scripts/telegram-send.sh |
| ffmpeg | ~/.local/bin/ffmpeg |
| Geheugen-index | ~/.claude/projects/-Users-macbookjamal/memory/MEMORY.md |
| Voorkeuren-register | ~/.claude/projects/-Users-macbookjamal/memory/voorkeuren_jamal.md |
In .env staan:
GEMINI_API_KEY (voor de Sulafat-stem)ANTHROPIC_API_KEY (voor de motor)Reden voor een 600-bestand: onder de LaunchAgent kan de Keychain locked zijn.
Als de server hapert of je hebt het script aangepast: herstart alleen de LaunchAgent.
launchctl kickstart -k gui/$(id -u)/nl.haarvisie.praat-conductor
Verifiëren dat hij leeft:
curl 127.0.0.1:8765
Krijg je 401 terug, dan leeft de server (dat is de login-vraag).
NOOIT doen:
Logs bekijken bij problemen:
tail -50 ~/.claude/praat/server.log
tail -50 ~/.claude/praat/server.err
Geheugen + context-injectie
_load_context() laadt bij het opstarten zijn geheugen in de system-prompt.~/CLAUDE.md, ~/.claude/CLAUDE.md, MEMORY.md, voorkeuren_jamal.md, reference_hermes_agent.md, reference_praat_conductor.md en reference_machine_namen.md.run_bash (cat/grep in de geheugenmap).Volle macht via de shell
run_bash: research (curl), websites openen (open), ssh naar de fleet (imac-nl, coco-veranda, paco-spanje, de VPS), scripts draaien, secrets ophalen.Sulafat-stem met streaming
tts_sulafat() maakt de audio via tts-gemini.py --voice Sulafat./ask_stream): het antwoord wordt in zinnen geknipt (split_sentences()) en zin voor zin als audio gestuurd, zodat hij begint te praten zodra de eerste zin klaar is.Camera (vision)
cam.jpg, zodat Conductor ernaar kan kijken.Transcript zichtbaar
/end → analyse-verslag naar Telegram
publish_verslag().Zelflerend (voorkeuren)
run_bash weg.voorkeuren_jamal.md, met een datumregel onder de juiste kop.claude -p ... --continue. Live-spraak via Web Speech API. Werkt op Chrome (Mac/Android). Sulafat-audio bewezen./end of 3 min stilte: samenvatting → verslag.haartips.nl → Telegram-link..env. Latency aangepakt met --strict-mcp-config (geen MCP-boot).claude -p (9s boot) vervangen door directe Anthropic Messages-API + bash-tool. ~10s → ~6s per beurt. ANTHROPIC_API_KEY in .env./ask_stream, ndjson): TTS per zin, gapless audio-wachtrij in de pagina._load_context), zelfherstellende historie, verslag-fix met Popen (build loslaten), do_HEAD voor de live-indicator, volle macht expliciet in de system-prompt.tailscale serve) na "HTTPS Certificates" aanzetten./transcribe (faster-whisper "small", NL), want iOS-Safari heeft geen Web Speech API. DNS-gotcha gevonden (MacBook = localhost).voorkeuren_jamal.md), iOS-fix (forceer opname-modus op iPhone), Jarvis-lessen toegepast, playbook gepubliceerd.De 'te ingewikkeld'-fix (lus 8 → 24)
run_conductor._turn() stond op range(8). Een installatie/fleet-taak doet méér dan 8 bash-calls → de lus liep vol → kale foutmelding.De geheugen-wis-bug (v11)
IDLE_FLUSH van 180 naar 1800 seconden (30 min).| # | Probleem | Oorzaak | Fix |
|---|---|---|---|
| 1 | Microfoon "not allowed" | Mic mag alleen op een veilig adres (https of localhost); Tailscale-IP via http telt niet | MacBook = http://localhost:8765; iPhone = de https-link |
| 2 | Sulafat valt weg (robotstem) | Service vond ffmpeg niet (kale PATH onder launchd) |
PATH ~/.local/bin:... meegeven aan de TTS-subprocess + GEMINI_API_KEY uit .env |
| 3 | Loodzwaar traag (~10s/beurt) | Elke beurt startte de hele claude-CLI op (9s vaste boot, los van het model) |
Motor vervangen door de directe Anthropic Messages-API |
| 4 | "Verbinding mislukt" blijft hangen (HTTP 400) | Na een hapering raakte de MESSAGES-historie corrupt |
Zelfherstel: mislukte beurt eruit (del MESSAGES[start:]); bij 400 MESSAGES.clear() + 1x schoon opnieuw |
| 5 | Geen geheugen ("kale" Claude) | Niets ingeladen | _load_context(): CLAUDE.md + regels + MEMORY + Hermes ingeladen; leest zelf dieper via run_bash |
| 6 | Verslag komt niet binnen | build.py op de VPS te traag (218 verslagen) → ssh-build timede out |
Build loslaten met subprocess.Popen → Telegram-link gaat meteen, html volgt later |
| 7 | "offline" bovenin de pagina | De HEAD-ping werd niet afgehandeld | do_HEAD toegevoegd (geeft nu 200) |
| 8 | Gemini-stem hikt (geen audio, finishReason OTHER) | Transient Gemini-beperking | In tts_sulafat() tot 3x opnieuw proberen; faalt zacht → browserstem |
| 9 | Link werkt niet op de MacBook (NXDOMAIN) | MagicDNS staat op de MacBook UIT (Telegram-IPv6-fix) | MacBook = localhost, iPhone = de .ts.net-link |
| 10 | iPhone kan niet praten | iOS-Safari heeft geen (betrouwbare) Web Speech API | Forceer opname-modus op iOS: record → /transcribe → faster-whisper |
Pagina laadt niet / "kan geen verbinding maken"
curl 127.0.0.1:8765 → moet 401 geven.launchctl kickstart -k gui/$(id -u)/nl.haarvisie.praat-conductor.tail -50 ~/.claude/praat/server.err."offline" staat bovenin
Microfoon werkt niet ("not allowed")
http://localhost:8765, niet de https-link.conductor-macbook.tail2d7247.ts.net).Conductor praat met robotstem (geen Sulafat)
tts-fout: grep tts-fout ~/.claude/praat/server.log.~/.claude/praat/.env?ls ~/.local/bin/ffmpeg.Alles is traag
"Het werd te ingewikkeld" bij een echte klus
run_conductor._turn() (range(24)), dan herstarten."Verbinding mislukt" blijft komen
MESSAGES schoon).Geen verslag binnengekomen na een gesprek
verslag-fout.https://verslag.haartips.nl/r-conductor-gesprek-...html.iPhone: link doet het niet
tailscale serve nog? Opnieuw: tailscale serve --bg http://127.0.0.1:8765.Algemene check-volgorde bij elke storing
curl 127.0.0.1:8765 → 401 = leeft.tail -50 ~/.claude/praat/server.log en server.err.launchctl kickstart -k gui/$(id -u)/nl.haarvisie.praat-conductor.