diff --git a/deploy/jobs/README.md b/deploy/jobs/README.md index 0b3dc3d..faa637f 100644 --- a/deploy/jobs/README.md +++ b/deploy/jobs/README.md @@ -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 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. diff --git a/deploy/jobs/news-melden.sh b/deploy/jobs/news-melden.sh index c92ad45..f72ee17 100644 --- a/deploy/jobs/news-melden.sh +++ b/deploy/jobs/news-melden.sh @@ -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