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>
70 lines
3.1 KiB
Bash
70 lines
3.1 KiB
Bash
#!/usr/bin/env bash
|
|
# news-melden.sh — schickt den fertigen Nachrichtenbericht als TEXT und als
|
|
# SPRACHE an den Commander (21.08.2026).
|
|
#
|
|
# Warum ein Skript statt zwei Anweisungen im Prompt: der Agent soll genau EINEN
|
|
# Befehl aufrufen. Alles danach ist deterministisch — Zustellung darf nicht davon
|
|
# abhaengen, ob ein Modell die Reihenfolge einhaelt.
|
|
#
|
|
# Erwartet zwei Dateien, die der Agent vorher geschrieben hat:
|
|
# $1 Textfassung (mit Emojis, Links, Formatierung — geht nach Telegram)
|
|
# $2 Sprechfassung (kurz, ohne Links/Emojis — wird vorgelesen)
|
|
#
|
|
# ‼️ 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: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."
|
|
exit 1
|
|
fi
|
|
|
|
# ------------------------------------------------------------------ Text ----
|
|
# notify.sh erreicht Telegram UND Lucys Briefkasten in einem Aufruf.
|
|
bash "$NOTIFY" -s "" "$(cat "$TEXTDATEI")"
|
|
TEXT_OK=$?
|
|
|
|
# ---------------------------------------------------------------- Stimme ----
|
|
# Ab hier ist alles Kuer: klappt die Stimme nicht, ist der Text trotzdem raus.
|
|
if [ ! -s "$SPRECHDATEI" ]; then
|
|
echo "[news-melden] keine Sprechfassung — nur Text verschickt" >&2
|
|
exit $TEXT_OK
|
|
fi
|
|
|
|
CODE=$(curl -s -m 180 -X POST "$VOICE/tts" \
|
|
-H 'Content-Type: application/json' \
|
|
--data "$(python3 -c 'import json,sys; print(json.dumps({"text": open(sys.argv[1], encoding="utf-8").read()[:1500]}))' "$SPRECHDATEI")" \
|
|
-o "$TON" -w '%{http_code}' 2>/dev/null)
|
|
|
|
if [ "$CODE" != "200" ] || [ ! -s "$TON" ]; then
|
|
echo "[news-melden] TTS antwortete mit '$CODE' — Text ist raus, Stimme nicht" >&2
|
|
exit $TEXT_OK
|
|
fi
|
|
|
|
# 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
|