Primary: /run/agenix/elevenlabs-key (read via 'read -r' which strips the trailing newline agenix files contain). Fallback: ELEVENLABS_API_KEY env var (backwards compatible). No need to export the key in shell environment anymore — if the agenix secret exists, talk picks it up automatically. Override path via ELEVENLABS_KEY_FILE env var if needed.
talk
ElevenLabs TTS voice notifications with a dismissable desktop popup. Generates speech from text via the ElevenLabs API, plays it through mpv, and shows a notification with a ⛔ Abbrechen button to stop playback.
Usage
Argument
talk "Build abgeschlossen. Alle Tests erfolgreich."
Stdin (pipe)
echo "Deployment fertig" | talk
nixos-rebuild build 2>&1 | tail -3 | talk
pi -p "Fasse zusammen" | talk
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
ELEVENLABS_API_KEY |
⚠️ | — | Fallback if agenix file is absent |
ELEVENLABS_KEY_FILE |
❌ | /run/agenix/elevenlabs-key |
Path to agenix secrets file (preferred) |
ELEVENLABS_VOICE_ID |
❌ | KXxZd16DiBqt82nbarJx |
Voice ID to use |
VOICE_NOTIFY |
❌ | 1 |
Set to 0 to silence all output |
The API key is read from the agenix file at /run/agenix/elevenlabs-key by default. The file should contain just the key (trailing newline is stripped automatically via read -r). If the file doesn't exist, talk falls back to the ELEVENLABS_API_KEY environment variable.
How It Works
- Sends text to ElevenLabs
text-to-speechAPI → receives MP3 - Plays audio via
mpv(background) - Shows
notify-sendpopup with ⛔ Abbrechen action (background) - Polls every 0.2s:
- If mpv finished → kill notification, exit
- If user clicked Abbrechen → kill mpv, exit
- Cleans up temp files on exit
Cancel Button
The notification popup has a ⛔ Abbrechen action button. Clicking it kills mpv playback immediately. The popup disappears when audio finishes or is cancelled.
The poll loop uses [ -s ] (non-empty file check) on the action output file. This ensures the loop only reacts when notify-send actually writes the action key — not when the empty file is created by the shell redirect.
Integration Patterns
After long-running tasks
nixos-rebuild switch 2>&1 | tail -5 | talk
With AI agents (print mode)
# Pi
pi -p "Review diesen Code" | talk
# OpenCode
opencode run "Erkläre diese Funktion" -q | talk
With crunch (scheduled jobs)
crunch ai pi daily "08:00" "Fasse Basecamp Todos zusammen"
# → talk speaks the summary at 08:00
NixOS Installation
# home-manager
home.packages = [ pkgs.m3ta.talk ];
The API key is read from /run/agenix/elevenlabs-key at runtime — set up the secret in your agenix configuration:
# secrets.nix
age.secrets."elevenlabs-key" = {
file = ./secrets/elevenlabs-key.age;
# Optionally set owner/group if needed
};
No need to export ELEVENLABS_API_KEY in shell environment anymore.
Dependencies
curl— API callspython3— JSON payload constructionmpv— audio playbacklibnotify— desktop notificationbusybox— coreutils (rm, cat, grep, sleep, kill, stat)