#!/usr/bin/env bash # Generisches Audio-Batch-Script — nimmt JSON-Textbuch mit Struktur # { "lines": [ {"id": "...", "text": "..."} ] } # und generiert MP3s via ElevenLabs in sounds/radio/.mp3 # # Aufruf: # set -a; source App/.env.local; set +a # App/sims/heli/scripts/generate-audio-batch.sh tower-geo-lines.json # App/sims/heli/scripts/generate-audio-batch.sh tower-start-lines.json # FORCE=1 … überschreibt bestehende Files set -e : "${ELEVENLABS_API_KEY:?ELEVENLABS_API_KEY muss gesetzt sein}" VOICE_ID="${ELEVENLABS_VOICE_ID:-EXAVITQu4vr4xnSDxMaL}" MODEL_ID="${ELEVENLABS_MODEL_ID:-eleven_multilingual_v2}" SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" OUT_DIR="$SCRIPT_DIR/../sounds/radio" mkdir -p "$OUT_DIR" JSON_INPUT="$1" if [ -z "$JSON_INPUT" ]; then echo "Usage: $0 " exit 2 fi JSON_FILE="$SCRIPT_DIR/$JSON_INPUT" if [ ! -f "$JSON_FILE" ]; then echo "✗ Datei nicht gefunden: $JSON_FILE"; exit 2 fi generate() { local id="$1" local text="$2" local out="$OUT_DIR/${id}.mp3" if [ -f "$out" ] && [ -z "$FORCE" ]; then echo "✓ ${id}.mp3 schon da"; return 0 fi echo "→ ${id}" local payload payload=$(TEXT="$text" MODEL="$MODEL_ID" python -c ' import json, os print(json.dumps({ "text": os.environ["TEXT"], "model_id": os.environ["MODEL"], "voice_settings": {"stability": 0.58, "similarity_boost": 0.78, "style": 0.30, "use_speaker_boost": True} }))') curl -sS -X POST "https://api.elevenlabs.io/v1/text-to-speech/$VOICE_ID" \ -H "xi-api-key: $ELEVENLABS_API_KEY" \ -H "accept: audio/mpeg" \ -H "content-type: application/json" \ -d "$payload" \ --output "$out" local size; size=$(wc -c <"$out") if [ "$size" -lt 1500 ]; then echo "✗ ${id}: Fehler — Datei zu klein ($size B). Inhalt:" cat "$out"; rm -f "$out"; return 1 fi echo "✓ ${id}.mp3 ($size B)" sleep 0.4 } ok=0; fail=0 python -c " import json, sys d = json.load(sys.stdin) for line in d['lines']: print(line['id'] + '\t' + line['text']) " < "$JSON_FILE" | while IFS=$'\t' read -r id text; do [ -z "$id" ] && continue if generate "$id" "$text"; then ok=$((ok+1)); else fail=$((fail+1)); echo "STOP bei Fehler"; break; fi done echo echo "Ablage: $OUT_DIR" ls -1 "$OUT_DIR"/*.mp3 2>/dev/null | wc -l | xargs printf "Dateien insgesamt: %s\n"