feat(stimme): Lucys echte Stimme auf der Box - pocket-tts 2.1.0 als lucy-stimme.service
Ampel / ampel (push) Successful in 21s
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:
co-authored by
Claude Opus 5
parent
fa69edc1aa
commit
25dbfb2b61
@@ -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`
|
`tar -xzf /srv/models/mc2-backups/mc2-state-*.tar.gz ./hermes/cron/jobs.json`
|
||||||
- Tagesaktualitaet muss man erzwingen: Datum per `date` feststellen lassen,
|
- Tagesaktualitaet muss man erzwingen: Datum per `date` feststellen lassen,
|
||||||
mehrere Suchen verlangen, und Meldungen ohne belegbares Datum verwerfen.
|
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 5–17× groesser:
|
||||||
|
Qwen3-TTS 0,6–1,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.
|
||||||
|
|||||||
@@ -10,17 +10,23 @@
|
|||||||
# $1 Textfassung (mit Emojis, Links, Formatierung — geht nach Telegram)
|
# $1 Textfassung (mit Emojis, Links, Formatierung — geht nach Telegram)
|
||||||
# $2 Sprechfassung (kurz, ohne Links/Emojis — wird vorgelesen)
|
# $2 Sprechfassung (kurz, ohne Links/Emojis — wird vorgelesen)
|
||||||
#
|
#
|
||||||
# Stimme: MC2s voice-service auf :8650 — das ist Lucys ECHTE Stimme (Piper/
|
# ‼️ STIMME: :8021, nicht :8650.
|
||||||
# Chatterbox, deutsch). Hermes' eingebautes TTS steht auf `edge` mit
|
# :8021 = lucy-stimme.service — Kyutai pocket-tts 2.1.0, Modell `german_24l`,
|
||||||
# `en-US-AriaNeural` und waere englisch — deshalb hier bewusst nicht benutzt.
|
# 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
|
set -uo pipefail
|
||||||
|
|
||||||
TEXTDATEI="${1:-/tmp/news-text.md}"
|
TEXTDATEI="${1:-/tmp/news-text.md}"
|
||||||
SPRECHDATEI="${2:-/tmp/news-sprich.txt}"
|
SPRECHDATEI="${2:-/tmp/news-sprich.txt}"
|
||||||
NOTIFY="${NOTIFY:-$HOME/mission-control-v2/deploy/notify.sh}"
|
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}"
|
HERMES="${HERMES_BIN:-$HOME/.local/bin/hermes}"
|
||||||
TON="/tmp/news-stimme.wav"
|
TON="/tmp/news-stimme.wav"
|
||||||
|
TON_OGG="/tmp/news-stimme.ogg"
|
||||||
|
|
||||||
if [ ! -s "$TEXTDATEI" ]; then
|
if [ ! -s "$TEXTDATEI" ]; then
|
||||||
bash "$NOTIFY" -s "[News]" "Der Nachrichtenbericht ist leer geblieben ($TEXTDATEI). Da lief etwas schief."
|
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
|
exit $TEXT_OK
|
||||||
fi
|
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
|
|| echo "[news-melden] Sprachdatei liess sich nicht senden — Text ist raus" >&2
|
||||||
|
|
||||||
exit $TEXT_OK
|
exit $TEXT_OK
|
||||||
|
|||||||
Reference in New Issue
Block a user