feat(stimme): Lucys echte Stimme auf der Box - pocket-tts 2.1.0 als lucy-stimme.service
Ampel / ampel (push) Successful in 21s

:8650 lieferte ElevenLabs 'Artoria/Saber' = Hermes' Stimme, nicht Lucys (und
Cloud). Jetzt :8021 mit Kyutai pocket-tts, Modell german_24l, geklont aus
ref.mp3 - samt text_norm, Emotions-Presets und Pegel-Abstimmung. Sprachnachricht
als OGG/Opus via ffmpeg. Recherche: pocket ist weiter die richtige Wahl.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-08-21 17:01:23 +02:00
co-authored by Claude Opus 5
parent fa69edc1aa
commit 25dbfb2b61
2 changed files with 83 additions and 5 deletions
+64
View File
@@ -133,3 +133,67 @@ Beide Abschnitte ersetzt (Sicherung: `~/.hermes/SOUL.md.bak-20260821`).
`tar -xzf /srv/models/mc2-backups/mc2-state-*.tar.gz ./hermes/cron/jobs.json`
- Tagesaktualitaet muss man erzwingen: Datum per `date` feststellen lassen,
mehrere Suchen verlangen, und Meldungen ohne belegbares Datum verwerfen.
---
## Nachtrag 3 (21.08.): Lucys ECHTE Stimme, echte Sprachnachricht
### Der Fehler: :8650 ist nicht Lucy
Ich hatte `/tts` auf MC2s `voice-service` (`:8650`) ohne Angabe von Engine und
Stimme aufgerufen. Dessen `/health` sagt:
```
"engines":["elevenlabs","edge"]
```
Piper und Chatterbox sind dort **gar nicht geladen** — die Vorgabe fiel auf die
erste verfuegbare: ElevenLabs *„Artoria DE · Saber · Hermes-Stimme"*. Das ist
**Hermes' Stimme**, nicht Lucys. Deutsch und weiblich, deshalb faellt es nicht
sofort auf. Beide verfuegbaren Engines sind ausserdem **Cloud** — gegen die
100-%-lokal-Praemisse.
### Lucys Stimme: `lucy-stimme.service` auf `:8021`
| | |
|---|---|
| Engine | **Kyutai pocket-tts 2.1.0** (neueste, seit 04.05. unveraendert) |
| Modell | **`german_24l`** — die volle Fassung, nicht die destillierte |
| Stimme | geklont aus `ref.mp3`, gecacht in `lucy_voice.safetensors` (44 MB) |
| Laeuft | `~/.lucy-stimme/`, systemd-**user**-Dienst, `enable`d, CPU |
| Start | ~48 s Ladezeit, danach ~5 s fuer 3,7 s Audio |
Mitgezogen wurde die **ganze Abstimmung**, nicht nur das Modell: `text_norm.py`
(Symbole/Pfade/URLs → Zahlen → Akronyme), Emotions-Voreinstellungen mit
Anlaufwoertern, Umlaut-Wortliste, Hochpass auf der Referenz, kalibrierter Pegel.
Ohne die klingt pocket nicht wie Lucy.
‼️ Der Sweep im TTS-Plan (*„seriell schlaegt parallel"*) wurde auf einem **9700X**
gemessen. Die Box ist ein Ryzen AI MAX+ 395 — das Ergebnis ist **nicht
uebertragen**, nur uebernommen. Wer Tempo braucht, misst neu.
### Recherche 21.08.: pocket bleibt
Nichts seit Mai schlaegt es auf dieser Achse. Die Alternativen sind 517× groesser:
Qwen3-TTS 0,61,7 Mrd. (Apache 2.0, Deutsch, 3-Sekunden-Klon), NeuTTS Air 0,5 Mrd.
(GGUF), CosyVoice2 0,5 Mrd. — gegen pockets **100 Mio.** Fuer einen taeglichen
Sprachnachrichten-Job auf CPU ist das der falsche Handel.
**Ihr wart bereits auf dem neuesten Stand** — nichts zu aktualisieren.
### Echte Sprachnachricht braucht OGG/Opus
Eine WAV kommt in Telegram als **Dateianhang** an. Fuer das runde Sprachmemo mit
Wellenform braucht es OGG/Opus — dafuer wurde **ffmpeg installiert** (8.0.1):
```bash
ffmpeg -y -i ton.wav -c:a libopus -b:a 32k -ar 48000 -ac 1 ton.ogg
hermes send --to telegram "MEDIA:ton.ogg"
```
Ganze Kette (Text + Stimme + Versand) gemessen: **10 Sekunden**.
### Altlast am Rande
`F:\Coding Stuff\lucy\lucy-tts\Lucy-Startklar.bat` zeigt auf
`mission-control-2\client\lucy-tts` — den Ordner gibt es seit der Repo-Trennung
nicht mehr.
+19 -5
View File
@@ -10,17 +10,23 @@
# $1 Textfassung (mit Emojis, Links, Formatierung — geht nach Telegram)
# $2 Sprechfassung (kurz, ohne Links/Emojis — wird vorgelesen)
#
# Stimme: MC2s voice-service auf :8650 — das ist Lucys ECHTE Stimme (Piper/
# Chatterbox, deutsch). Hermes' eingebautes TTS steht auf `edge` mit
# `en-US-AriaNeural` und waere englisch — deshalb hier bewusst nicht benutzt.
# ‼️ STIMME: :8021, nicht :8650.
# :8021 = lucy-stimme.service — Kyutai pocket-tts 2.1.0, Modell `german_24l`,
# Stimme geklont aus ref.mp3. DAS ist Lucy. Laeuft lokal auf der CPU.
# :8650 = MC2s voice-service. Dort sind nur `elevenlabs` und `edge` geladen —
# beides CLOUD, und die Vorgabe ist die ElevenLabs-Stimme
# "Artoria/Saber", also HERMES' Stimme, nicht Lucys. Am 21.08. genau
# damit reingefallen: klang deutsch und weiblich, war aber die falsche.
# Hermes' eingebautes TTS waere `edge`/`en-US-AriaNeural` — englisch.
set -uo pipefail
TEXTDATEI="${1:-/tmp/news-text.md}"
SPRECHDATEI="${2:-/tmp/news-sprich.txt}"
NOTIFY="${NOTIFY:-$HOME/mission-control-v2/deploy/notify.sh}"
VOICE="${VOICE_URL:-http://127.0.0.1:8650}"
VOICE="${VOICE_URL:-http://127.0.0.1:8021}"
HERMES="${HERMES_BIN:-$HOME/.local/bin/hermes}"
TON="/tmp/news-stimme.wav"
TON_OGG="/tmp/news-stimme.ogg"
if [ ! -s "$TEXTDATEI" ]; then
bash "$NOTIFY" -s "[News]" "Der Nachrichtenbericht ist leer geblieben ($TEXTDATEI). Da lief etwas schief."
@@ -49,7 +55,15 @@ if [ "$CODE" != "200" ] || [ ! -s "$TON" ]; then
exit $TEXT_OK
fi
"$HERMES" send --to telegram "MEDIA:$TON" >/dev/null 2>&1 \
# Telegram zeigt eine ECHTE Sprachnachricht (runde Blase, Wellenform) nur bei
# OGG/Opus. Eine WAV kaeme als Dateianhang an — abspielbar, aber eben kein
# Sprachmemo. Deshalb ffmpeg. Mono/48k ist das Format, das Telegram erwartet.
if ! ffmpeg -y -loglevel error -i "$TON" -c:a libopus -b:a 32k -ar 48000 -ac 1 "$TON_OGG" 2>/dev/null; then
echo "[news-melden] ffmpeg-Wandlung fehlgeschlagen — schicke die WAV als Anhang" >&2
TON_OGG="$TON"
fi
"$HERMES" send --to telegram "MEDIA:$TON_OGG" >/dev/null 2>&1 \
|| echo "[news-melden] Sprachdatei liess sich nicht senden — Text ist raus" >&2
exit $TEXT_OK