Atlas: Deploy-Buendel vor Staustufen-Sprint
- Logistik: Musik-Player Playlist-Modus (5 Gruppen, 20 Tracks) - Heli: End-Screen auf .ggs-endscreen, Mission-Bilder, Voice-Lines, Briefing-Audio - Logistik: Layout-Tausch Auftraege+Fahrzeuge links, Karte rechts - Logistik: Tier-1-Staedte ausgebaut, Auto-Timescale-Badge - Logistik: Roadnet/Railnet Dijkstra-Routing, Balance-Updates - Atlas: 5 Atlas-Inbox-Nachrichten (Cards-Pattern, DALL-E-Key, Musik-Playlists) - Status-Updates Heli + Logistik Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env bash
|
||||
# Generiert Tower-Funkansagen pro Hubschrauber via ElevenLabs.
|
||||
# Liest tower-lines.json, speichert MP3s in App/sims/heli/sounds/radio/
|
||||
#
|
||||
# Voraussetzung: ELEVENLABS_API_KEY + curl + python
|
||||
#
|
||||
# Aufruf:
|
||||
# set -a; source App/.env.local; set +a
|
||||
# App/sims/heli/scripts/generate-tower-lines.sh
|
||||
# FORCE=1 … überschreibt bestehende
|
||||
set -e
|
||||
: "${ELEVENLABS_API_KEY:?Env-Variable ELEVENLABS_API_KEY muss gesetzt sein}"
|
||||
|
||||
# Default-Voice: 'Sarah' — klar, weiblich, multilingual-fähig.
|
||||
# Eigene Stimme: ELEVENLABS_VOICE_ID=xxx vor dem Aufruf.
|
||||
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"
|
||||
JSON_FILE="$SCRIPT_DIR/tower-lines.json"
|
||||
mkdir -p "$OUT_DIR"
|
||||
|
||||
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
|
||||
fi
|
||||
echo "→ ${id}: generiere …"
|
||||
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.55, "similarity_boost": 0.78, "style": 0.25, "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
|
||||
}
|
||||
|
||||
# Liste laden und pro Zeile generieren (via stdin — umgeht Windows-Pfad-Probleme)
|
||||
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
|
||||
generate "$id" "$text"
|
||||
done
|
||||
|
||||
echo
|
||||
echo "Fertig. Ablage: $OUT_DIR"
|
||||
ls -1 "$OUT_DIR"/r_tower_*.mp3 2>/dev/null | wc -l | xargs printf "Tower-Dateien vorhanden: %s\n"
|
||||
Reference in New Issue
Block a user