88 lines
2.3 KiB
Markdown
88 lines
2.3 KiB
Markdown
# 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
|
||
|
|
|
||
|
|
```bash
|
||
|
|
talk "Build abgeschlossen. Alle Tests erfolgreich."
|
||
|
|
```
|
||
|
|
|
||
|
|
### Stdin (pipe)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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` | ✅ | — | API key for ElevenLabs |
|
||
|
|
| `ELEVENLABS_VOICE_ID` | ❌ | `KXxZd16DiBqt82nbarJx` | Voice ID to use |
|
||
|
|
| `VOICE_NOTIFY` | ❌ | `1` | Set to `0` to silence all output |
|
||
|
|
|
||
|
|
## How It Works
|
||
|
|
|
||
|
|
1. Sends text to ElevenLabs `text-to-speech` API → receives MP3
|
||
|
|
2. Plays audio via `mpv` (background)
|
||
|
|
3. Shows `notify-send` popup with **⛔ Abbrechen** action (background)
|
||
|
|
4. Polls every 0.2s:
|
||
|
|
- If mpv finished → kill notification, exit
|
||
|
|
- If user clicked **Abbrechen** → kill mpv, exit
|
||
|
|
5. 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
|
||
|
|
|
||
|
|
```bash
|
||
|
|
nixos-rebuild switch 2>&1 | tail -5 | talk
|
||
|
|
```
|
||
|
|
|
||
|
|
### With AI agents (print mode)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Pi
|
||
|
|
pi -p "Review diesen Code" | talk
|
||
|
|
|
||
|
|
# OpenCode
|
||
|
|
opencode run "Erkläre diese Funktion" -q | talk
|
||
|
|
```
|
||
|
|
|
||
|
|
### With crunch (scheduled jobs)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
crunch ai pi daily "08:00" "Fasse Basecamp Todos zusammen"
|
||
|
|
# → talk speaks the summary at 08:00
|
||
|
|
```
|
||
|
|
|
||
|
|
## NixOS Installation
|
||
|
|
|
||
|
|
```nix
|
||
|
|
# home-manager
|
||
|
|
home.packages = [ pkgs.m3ta.talk ];
|
||
|
|
|
||
|
|
# Requires in environment:
|
||
|
|
environment.sessionVariables.ELEVENLABS_API_KEY = "your-key";
|
||
|
|
# Or via agenix secrets
|
||
|
|
```
|
||
|
|
|
||
|
|
## Dependencies
|
||
|
|
|
||
|
|
- `curl` — API calls
|
||
|
|
- `python3` — JSON payload construction
|
||
|
|
- `mpv` — audio playback
|
||
|
|
- `libnotify` — desktop notification
|
||
|
|
- `busybox` — coreutils (rm, cat, grep, sleep, kill, stat)
|