#!/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