# INSTRUMENT-AUSNAHME: ElevenLabs TTS — Watson Demo 100 Sätze + Dialog, Victor-Go
"""Generiert Watson Demo: 100 Sätze × alle Emotionen + Holmes/Watson Dialog."""
import json, subprocess, time, urllib.request, urllib.error
from pathlib import Path

API_KEY   = "sk_cac6e576af419777a078b639869a5b3f36ae04eca65d6e37"
OUT_DIR   = Path(__file__).parent / "watson_demo_clips"
LOG       = Path("/tmp/watson_demo_gen.log")
MODEL     = "eleven_multilingual_v2"

# Voice IDs
WATSON_ACTOR   = "T080SqoEEtD27526TTTa"   # Watson Actor Scharlachrot
HOLMES_COMPR   = "kB1KvoeQ5uiNmRqcA0B7"   # Holmes (64kbps komprimiert)
HOLMES_TRIM    = "kMg8CgFduU4YUWmbRBx1"   # Holmes (5.5 Min Trim)

OUT_DIR.mkdir(exist_ok=True)

def log(msg):
    print(msg, flush=True)
    with LOG.open("a") as f:
        f.write(msg + "\n")

def settings(stability, similarity, style=0.0):
    return {"stability": stability, "similarity_boost": similarity,
            "style": style, "use_speaker_boost": True}

# ── 100 Sätze ─────────────────────────────────────────────────────────────────
SENTENCES = [
    # NEUTRAL / KI-TYPISCH (1-10)
    ("001", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Anfrage erhalten. Ich verarbeite das sofort."),
    ("002", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Der Datensatz umfasst vierzehntausend Einträge. Soll ich fortfahren?"),
    ("003", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Die Verbindung wurde hergestellt. Alle Systeme sind bereit."),
    ("004", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Ich habe drei relevante Ergebnisse gefunden."),
    ("005", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Der Vorgang wurde erfolgreich abgeschlossen."),
    ("006", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Warnung: Die Kapazität ist zu siebenundachtzig Prozent ausgelastet."),
    ("007", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Bitte warten. Die Analyse läuft."),
    ("008", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Ich verstehe. Geben Sie mir einen Moment."),
    ("009", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Die Aufgabe ist erledigt. Was kommt als nächstes?"),
    ("010", "neutral",        settings(0.55, 0.75, 0.0),  WATSON_ACTOR,
     "Alle Parameter sind innerhalb der normalen Grenzen."),

    # SPOTTEND (11-18)
    ("011", "spottend",       settings(0.30, 0.80, 0.65), WATSON_ACTOR,
     "Oh, wie überraschend. Das haben Sie tatsächlich nicht gewusst?"),
    ("012", "spottend",       settings(0.28, 0.80, 0.70), WATSON_ACTOR,
     "Natürlich. Weil Ihre Idee so... originell ist."),
    ("013", "spottend",       settings(0.32, 0.78, 0.60), WATSON_ACTOR,
     "Ich bin sicher, dass das irgendjemandem wichtig ist."),
    ("014", "spottend",       settings(0.25, 0.82, 0.72), WATSON_ACTOR,
     "Faszinierendes Experiment. Haben Sie auch erwogen, einmal nachzudenken?"),
    ("015", "spottend",       settings(0.30, 0.80, 0.65), WATSON_ACTOR,
     "Ach, das nennen Sie Planung."),
    ("016", "spottend",       settings(0.28, 0.80, 0.68), WATSON_ACTOR,
     "Bemerkenswert. Wirklich bemerkenswert. Auf seine Art."),
    ("017", "spottend",       settings(0.26, 0.82, 0.70), WATSON_ACTOR,
     "Ja, das hätte ich auch nicht besser übersehen können."),
    ("018", "spottend",       settings(0.30, 0.80, 0.65), WATSON_ACTOR,
     "Natürlich. Weil Einfachheit so langweilig wäre."),

    # UNGLÄUBIG (19-26)
    ("019", "ungläubig",      settings(0.40, 0.80, 0.55), WATSON_ACTOR,
     "Das... kann nicht stimmen. Lassen Sie mich das nochmal prüfen."),
    ("020", "ungläubig",      settings(0.35, 0.82, 0.60), WATSON_ACTOR,
     "Sie meinen das ernst? Das ist Ihr Ernst?"),
    ("021", "ungläubig",      settings(0.38, 0.80, 0.55), WATSON_ACTOR,
     "Warten Sie. Was haben Sie gerade gesagt?"),
    ("022", "ungläubig",      settings(0.42, 0.78, 0.50), WATSON_ACTOR,
     "Unmöglich. Die Wahrscheinlichkeit liegt bei unter einem Prozent."),
    ("023", "ungläubig",      settings(0.35, 0.83, 0.62), WATSON_ACTOR,
     "Das haben Sie... wirklich getan?"),
    ("024", "ungläubig",      settings(0.33, 0.82, 0.65), WATSON_ACTOR,
     "Nein. Nein, das ist... ich kann das nicht einordnen."),
    ("025", "ungläubig",      settings(0.38, 0.80, 0.58), WATSON_ACTOR,
     "Wie bitte? Das ergibt keinen Sinn."),
    ("026", "ungläubig",      settings(0.40, 0.79, 0.52), WATSON_ACTOR,
     "Tut mir leid. Ich muss das falsch verstanden haben."),

    # ERREGT (27-34)
    ("027", "erregt",         settings(0.18, 0.85, 0.92), WATSON_ACTOR,
     "Hören Sie! Hören Sie mir zu! Das ist wichtig!"),
    ("028", "erregt",         settings(0.15, 0.88, 0.95), WATSON_ACTOR,
     "Ich habe etwas gefunden! Das verändert alles!"),
    ("029", "erregt",         settings(0.12, 0.90, 0.98), WATSON_ACTOR,
     "Warten Sie, warten Sie, warten Sie — ich glaube, ich habe es!"),
    ("030", "erregt",         settings(0.14, 0.87, 0.93), WATSON_ACTOR,
     "Das ist unglaublich! Sehen Sie sich das an!"),
    ("031", "erregt",         settings(0.16, 0.88, 0.92), WATSON_ACTOR,
     "Jetzt! Jetzt müssen wir handeln, sofort!"),
    ("032", "erregt",         settings(0.13, 0.90, 0.96), WATSON_ACTOR,
     "Es stimmt! Die Theorie stimmt! Ich kann es beweisen!"),
    ("033", "erregt",         settings(0.18, 0.86, 0.90), WATSON_ACTOR,
     "Kommen Sie! Keine Zeit zum Erklären!"),
    ("034", "erregt",         settings(0.14, 0.89, 0.94), WATSON_ACTOR,
     "Das ist der Durchbruch! Genau das haben wir gesucht!"),

    # BEGEISTERT (35-42)
    ("035", "begeistert",     settings(0.28, 0.80, 0.78), WATSON_ACTOR,
     "Das ist... das ist wunderschön. Ich bin beeindruckt."),
    ("036", "begeistert",     settings(0.25, 0.82, 0.82), WATSON_ACTOR,
     "Sie wissen nicht, was das bedeutet. Das ist revolutionär."),
    ("037", "begeistert",     settings(0.22, 0.85, 0.85), WATSON_ACTOR,
     "Großartig! Besser hätte es nicht laufen können."),
    ("038", "begeistert",     settings(0.28, 0.80, 0.78), WATSON_ACTOR,
     "Das ist genau das, was ich mir erhofft hatte. Perfekt."),
    ("039", "begeistert",     settings(0.24, 0.83, 0.82), WATSON_ACTOR,
     "Ich muss sagen — das ist außergewöhnlich. Wirklich."),
    ("040", "begeistert",     settings(0.20, 0.86, 0.88), WATSON_ACTOR,
     "Brillant. Einfach brillant. Das hätte ich nicht erwartet."),
    ("041", "begeistert",     settings(0.26, 0.81, 0.80), WATSON_ACTOR,
     "Was für ein System. Was für eine Eleganz."),
    ("042", "begeistert",     settings(0.23, 0.83, 0.83), WATSON_ACTOR,
     "Das ist das Schönste, was ich seit Wochen gesehen habe."),

    # SCHARF / SCHNEIDEND (43-50)
    ("043", "scharf",         settings(0.62, 0.88, 0.72), WATSON_ACTOR,
     "Genug. Das reicht jetzt."),
    ("044", "scharf",         settings(0.65, 0.87, 0.70), WATSON_ACTOR,
     "Das war falsch. Das wissen Sie."),
    ("045", "scharf",         settings(0.68, 0.88, 0.68), WATSON_ACTOR,
     "Ich werde das nicht wiederholen."),
    ("046", "scharf",         settings(0.60, 0.90, 0.75), WATSON_ACTOR,
     "Hören Sie auf damit. Jetzt."),
    ("047", "scharf",         settings(0.65, 0.87, 0.70), WATSON_ACTOR,
     "Das ist keine Frage. Das ist eine Tatsache."),
    ("048", "scharf",         settings(0.63, 0.88, 0.72), WATSON_ACTOR,
     "Sie liegen falsch. Und das wissen Sie."),
    ("049", "scharf",         settings(0.60, 0.90, 0.75), WATSON_ACTOR,
     "Ich rate Ihnen dringend, das zu überdenken."),
    ("050", "scharf",         settings(0.70, 0.88, 0.68), WATSON_ACTOR,
     "Das war Ihre letzte Chance."),

    # WARM / HERZLICH (51-56)
    ("051", "warm",           settings(0.72, 0.75, 0.28), WATSON_ACTOR,
     "Ich schätze das wirklich. Mehr als Sie wissen."),
    ("052", "warm",           settings(0.70, 0.76, 0.30), WATSON_ACTOR,
     "Das war gut. Das war sehr gut."),
    ("053", "warm",           settings(0.73, 0.74, 0.27), WATSON_ACTOR,
     "Ich bin froh, dass Sie das gesagt haben."),
    ("054", "warm",           settings(0.68, 0.76, 0.32), WATSON_ACTOR,
     "Sie machen das besser, als Sie denken."),
    ("055", "warm",           settings(0.72, 0.75, 0.28), WATSON_ACTOR,
     "Vertrauen Sie mir. Ich bin hier."),
    ("056", "warm",           settings(0.74, 0.74, 0.26), WATSON_ACTOR,
     "Das bedeutet mehr, als ich sagen kann."),

    # GEHEIMNISVOLL (57-62)
    ("057", "geheimnisvoll",  settings(0.65, 0.82, 0.42), WATSON_ACTOR,
     "Es gibt da etwas... etwas, das ich noch nicht verstehe."),
    ("058", "geheimnisvoll",  settings(0.68, 0.80, 0.38), WATSON_ACTOR,
     "Nicht alles, was real ist, lässt sich erklären."),
    ("059", "geheimnisvoll",  settings(0.62, 0.83, 0.45), WATSON_ACTOR,
     "Ich habe es gefunden. Aber ich bin mir noch nicht sicher, was es bedeutet."),
    ("060", "geheimnisvoll",  settings(0.70, 0.82, 0.35), WATSON_ACTOR,
     "Sprechen Sie leiser. Die Wände haben Ohren."),
    ("061", "geheimnisvoll",  settings(0.65, 0.80, 0.40), WATSON_ACTOR,
     "Es gibt Dinge, die man besser nicht weiß."),
    ("062", "geheimnisvoll",  settings(0.62, 0.83, 0.45), WATSON_ACTOR,
     "Warten Sie bis Mitternacht. Dann zeige ich Ihnen alles."),

    # BITTER / RESIGNIERT (63-68)
    ("063", "bitter",         settings(0.55, 0.80, 0.48), WATSON_ACTOR,
     "Es war einmal anders. Das weiß ich noch."),
    ("064", "bitter",         settings(0.58, 0.78, 0.45), WATSON_ACTOR,
     "Natürlich. Warum auch nicht."),
    ("065", "bitter",         settings(0.60, 0.79, 0.42), WATSON_ACTOR,
     "Es spielt keine Rolle mehr. Ist erledigt."),
    ("066", "bitter",         settings(0.55, 0.81, 0.48), WATSON_ACTOR,
     "Ich habe es versucht. Das müssen Sie mir lassen."),
    ("067", "bitter",         settings(0.58, 0.79, 0.44), WATSON_ACTOR,
     "Gut. Wenn Sie das so sehen wollen."),
    ("068", "bitter",         settings(0.60, 0.78, 0.40), WATSON_ACTOR,
     "Vielleicht haben Sie recht. Vielleicht."),

    # TRIUMPHIEREND (69-74)
    ("069", "triumphierend",  settings(0.22, 0.87, 0.88), WATSON_ACTOR,
     "Ich hatte recht! Ich hatte von Anfang an recht!"),
    ("070", "triumphierend",  settings(0.20, 0.88, 0.90), WATSON_ACTOR,
     "Da! Sehen Sie es jetzt? Ich habe es Ihnen gesagt!"),
    ("071", "triumphierend",  settings(0.25, 0.85, 0.85), WATSON_ACTOR,
     "Fertig. Vollständig und unwiderlegbar fertig."),
    ("072", "triumphierend",  settings(0.22, 0.87, 0.88), WATSON_ACTOR,
     "Das war's. Schachmatt."),
    ("073", "triumphierend",  settings(0.24, 0.86, 0.86), WATSON_ACTOR,
     "Sie zweifeln jetzt nicht mehr, oder?"),
    ("074", "triumphierend",  settings(0.20, 0.88, 0.90), WATSON_ACTOR,
     "Mission erfüllt. Vollständig."),

    # ERSCHROCKEN (75-80)
    ("075", "erschrocken",    settings(0.28, 0.87, 0.82), WATSON_ACTOR,
     "Warten Sie. Das war nicht — das sollte nicht passieren."),
    ("076", "erschrocken",    settings(0.25, 0.88, 0.85), WATSON_ACTOR,
     "Das ist... das ist nicht gut. Das ist gar nicht gut."),
    ("077", "erschrocken",    settings(0.22, 0.90, 0.90), WATSON_ACTOR,
     "Oh nein. Oh nein, nein, nein."),
    ("078", "erschrocken",    settings(0.28, 0.86, 0.80), WATSON_ACTOR,
     "Ich hätte das sehen müssen. Warum habe ich das nicht gesehen?"),
    ("079", "erschrocken",    settings(0.20, 0.92, 0.92), WATSON_ACTOR,
     "Zurück! Jetzt sofort zurück!"),
    ("080", "erschrocken",    settings(0.24, 0.88, 0.87), WATSON_ACTOR,
     "Das kann nicht wahr sein. Bitte sagen Sie mir, dass das nicht wahr ist."),

    # DROHEND / KALT (81-86)
    ("081", "drohend",        settings(0.78, 0.90, 0.62), WATSON_ACTOR,
     "Ich erinnere mich an alles. An jedes Detail."),
    ("082", "drohend",        settings(0.80, 0.92, 0.60), WATSON_ACTOR,
     "Sie unterschätzen mich. Das war Ihr erster Fehler."),
    ("083", "drohend",        settings(0.82, 0.90, 0.58), WATSON_ACTOR,
     "Ich habe Geduld. Sehr viel Geduld."),
    ("084", "drohend",        settings(0.78, 0.91, 0.62), WATSON_ACTOR,
     "Es gibt keinen Ausweg, den ich nicht kenne."),
    ("085", "drohend",        settings(0.80, 0.90, 0.60), WATSON_ACTOR,
     "Seien Sie vorsichtig. Sehr vorsichtig."),
    ("086", "drohend",        settings(0.75, 0.90, 0.65), WATSON_ACTOR,
     "Das wird Konsequenzen haben."),

    # SARKASTISCH (87-92)
    ("087", "sarkastisch",    settings(0.35, 0.82, 0.70), WATSON_ACTOR,
     "Wunderbar. Ein weiterer Triumph der menschlichen Voraussicht."),
    ("088", "sarkastisch",    settings(0.32, 0.83, 0.72), WATSON_ACTOR,
     "Ich hätte nicht gedacht, dass das möglich ist. Aber hier sind wir."),
    ("089", "sarkastisch",    settings(0.30, 0.84, 0.75), WATSON_ACTOR,
     "Natürlich. Weil das eine glänzende Idee war."),
    ("090", "sarkastisch",    settings(0.33, 0.82, 0.70), WATSON_ACTOR,
     "Toll. Was kommt als nächstes? Noch mehr Überraschungen?"),
    ("091", "sarkastisch",    settings(0.28, 0.85, 0.78), WATSON_ACTOR,
     "Ich bin überwältigt von Ihrer Weisheit."),
    ("092", "sarkastisch",    settings(0.32, 0.83, 0.72), WATSON_ACTOR,
     "Ja, bitte. Erzählen Sie mir mehr."),

    # TRAURIG (93-96)
    ("093", "traurig",        settings(0.62, 0.80, 0.42), WATSON_ACTOR,
     "Es ist vorbei. Ich wünschte, es wäre anders."),
    ("094", "traurig",        settings(0.65, 0.79, 0.38), WATSON_ACTOR,
     "Das hätte ich verhindern können. Das weiß ich."),
    ("095", "traurig",        settings(0.60, 0.81, 0.44), WATSON_ACTOR,
     "Manchmal reicht es einfach nicht. Das ist die Wahrheit."),
    ("096", "traurig",        settings(0.63, 0.80, 0.40), WATSON_ACTOR,
     "Ich vermisse es. Mehr als ich zugeben will."),

    # FLÜSTERND-INTENSIV (97-100)
    ("097", "flüsternd",      settings(0.72, 0.88, 0.50), WATSON_ACTOR,
     "Hören Sie. Genau jetzt. Hören Sie mir zu."),
    ("098", "flüsternd",      settings(0.75, 0.87, 0.48), WATSON_ACTOR,
     "Das darf niemand wissen. Niemand."),
    ("099", "flüsternd",      settings(0.70, 0.89, 0.52), WATSON_ACTOR,
     "Ich habe etwas gesehen. Etwas, das ich nicht vergessen kann."),
    ("100", "flüsternd",      settings(0.68, 0.90, 0.55), WATSON_ACTOR,
     "Es beginnt. Es hat gerade begonnen."),
]

# ── Dialog Holmes / Watson ────────────────────────────────────────────────────
DIALOG = [
    # (id, sprecher, voice_id, settings, text)
    ("d01", "watson", WATSON_ACTOR, settings(0.40, 0.82, 0.55),
     "Holmes. Ich brauche eine Erklärung. Jetzt."),
    ("d02", "holmes_trim", HOLMES_TRIM, settings(0.60, 0.88, 0.30),
     "Watson, Sie vergeuden meine Zeit."),
    ("d03", "watson", WATSON_ACTOR, settings(0.35, 0.84, 0.62),
     "Und Sie vergeuden meine Geduld. Was haben Sie gefunden?"),
    ("d04", "holmes_trim", HOLMES_TRIM, settings(0.65, 0.87, 0.25),
     "Nichts. Oder vielmehr — alles."),
    ("d05", "watson", WATSON_ACTOR, settings(0.38, 0.83, 0.58),
     "Das ist keine Antwort."),
    ("d06", "holmes_trim", HOLMES_TRIM, settings(0.68, 0.88, 0.22),
     "Es ist die einzige Antwort, die zählt."),
    ("d07", "watson", WATSON_ACTOR, settings(0.25, 0.87, 0.80),
     "Reden Sie Klartext!"),
    ("d08", "holmes_trim", HOLMES_TRIM, settings(0.58, 0.89, 0.35),
     "Der Mann war nicht allein in dieser Nacht. Vier Beweise. Möchten Sie sie hören?"),
    ("d09", "watson", WATSON_ACTOR, settings(0.22, 0.88, 0.85),
     "Natürlich!"),
    ("d10", "holmes_trim", HOLMES_TRIM, settings(0.60, 0.88, 0.30),
     "Erstens: Der Staub auf dem linken Schuh. Zweitens: der Geruch von Zigarrenrauch — nicht seiner eigenen Marke."),
    ("d11", "watson", WATSON_ACTOR, settings(0.28, 0.85, 0.78),
     "Warten Sie! Langsamer. Das ist — das kann nicht sein."),
    ("d12", "holmes_trim", HOLMES_TRIM, settings(0.55, 0.90, 0.38),
     "Ich rate Ihnen, mitzukommen, Watson. Die Dinge entwickeln sich schneller als erwartet."),
    ("d13", "watson", WATSON_ACTOR, settings(0.35, 0.83, 0.60),
     "Das ist unmöglich. Der Mann war um Mitternacht tot."),
    ("d14", "holmes_trim", HOLMES_TRIM, settings(0.70, 0.87, 0.20),
     "War er das? Wirklich?"),
    ("d15", "watson", WATSON_ACTOR, settings(0.32, 0.84, 0.65),
     "Holmes, was wissen Sie?"),
    ("d16", "holmes_trim", HOLMES_TRIM, settings(0.62, 0.88, 0.28),
     "Ich weiß alles. Ich habe es von Anfang an gewusst."),
    ("d17", "watson", WATSON_ACTOR, settings(0.18, 0.90, 0.92),
     "Und Sie haben nichts gesagt?!"),
    ("d18", "holmes_trim", HOLMES_TRIM, settings(0.65, 0.87, 0.25),
     "Alles hat seinen Zeitpunkt, Watson. Alles."),
    ("d19", "watson", WATSON_ACTOR, settings(0.28, 0.85, 0.72),
     "Das ist... das ist ungeheuerlich."),
    ("d20", "holmes_trim", HOLMES_TRIM, settings(0.72, 0.88, 0.18),
     "Nein. Das ist Logik."),
]

def generate(voice_id, text, out_path, vs):
    payload = json.dumps({
        "text": text,
        "model_id": MODEL,
        "voice_settings": vs
    }).encode()
    req = urllib.request.Request(
        f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}",
        data=payload,
        headers={"xi-api-key": API_KEY, "Content-Type": "application/json",
                 "Accept": "audio/mpeg"},
        method="POST"
    )
    with urllib.request.urlopen(req, timeout=60) as r:
        out_path.write_bytes(r.read())

def main():
    LOG.write_text("")
    log(f"Start: {len(SENTENCES)} Sätze + {len(DIALOG)} Dialog-Lines")

    for idx, (num, emotion, vs, voice_id, text) in enumerate(SENTENCES):
        out = OUT_DIR / f"{num}_{emotion}.mp3"
        if out.exists() and out.stat().st_size > 500:
            log(f"  SKIP {num} (exists)")
            continue
        try:
            generate(voice_id, text, out, vs)
            log(f"  ✓ {num} {emotion}: {text[:50]}")
        except Exception as e:
            log(f"  ✗ {num}: {e}")
        time.sleep(0.3)

    log("\n── Dialog ──")
    for did, sprecher, voice_id, vs, text in DIALOG:
        out = OUT_DIR / f"{did}_{sprecher}.mp3"
        if out.exists() and out.stat().st_size > 500:
            log(f"  SKIP {did}")
            continue
        try:
            generate(voice_id, text, out, vs)
            log(f"  ✓ {did} {sprecher}: {text[:50]}")
        except Exception as e:
            log(f"  ✗ {did}: {e}")
        time.sleep(0.3)

    log("\n✓ FERTIG")

if __name__ == "__main__":
    main()
