Files
mission-control-v2/client/lucy-tts/umlaut_test.py
T
Hitonabi 09a1c98514 Lucy-TTS/F5: Skripte + Batches versionieren, schwere Assets ignoriert
- pocket_server.py (Produktions-TTS mit Stimmen-Waechter), text_norm, Bench-/Diag-Skripte
- lucy-f5: f5_server/f5_test/bench_dml (DirectML-Experiment, Phase C/D offen)
- .gitignore: venvs/Modelle/Audio/Logs der beiden Ordner + box_recon/gemma_swap-Scratch

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 10:29:33 +02:00

50 lines
2.2 KiB
Python

# -*- coding: utf-8 -*-
"""umlaut_test.py — prüft den Umlaut-Normalizer.
A) Logik: bekannte ASCII-Umlaut-Wörter -> Umlaut, normale Wörter (neue/aktuell/Steuer) UNVERÄNDERT.
B) Audio: erzeugt vorher (roh ASCII) vs nachher (mit Fix) auf den Desktop zum Reinhören.
"""
import os, time
import numpy as np, soundfile as sf, librosa
import pocket_server as ps
DESK = os.path.join(os.path.expanduser("~"), "Desktop", "lucy_samples")
os.makedirs(DESK, exist_ok=True)
# --- A) Logik ---
POS = {"ueber": "über", "Schoen": "Schön", "fuer": "für", "maerz": "März",
"natuerlich": "natürlich", "Groesse": "Größe", "moeglich": "möglich", "muessen": "müssen"}
NEG = ["neue", "aktuell", "Steuer", "Quelle", "Feuer", "treue", "Museum", "Dauer", "heute",
"Frauen", "genau", "blaue"]
ok = True
for a, exp in POS.items():
got = ps._fix_umlauts(a); good = got == exp; ok &= good
print(f"[pos] {a!r:14}-> {got!r:14} erwartet {exp!r:12} {'OK' if good else 'FAIL'}")
for w in NEG:
got = ps._fix_umlauts(w); good = got == w; ok &= good
print(f"[neg] {w!r:14}-> {got!r:14} {'OK (unverändert)' if good else 'FAIL: GEÄNDERT!'}")
S = "Ueber fuenf moegliche Gespraeche, natuerlich auch die Groesse."
print("SENT roh :", S)
print("SENT fix :", ps._fix_umlauts(S))
print("LOGIC_OK" if ok else "LOGIC_FAIL")
# --- B) Audio vorher/nachher ---
from pocket_tts import TTSModel
m = TTSModel.load_model(language=ps.LANG, lsd_decode_steps=ps.LSD, temp=ps.TEMP,
noise_clamp=ps.NOISE_CLAMP, quantize=ps.QUANTIZE)
ref = ps._prep_ref()
try:
vs = m.get_state_for_audio_prompt(ps.VOICE_ST)
except Exception:
vs = m.get_state_for_audio_prompt(ref)
ra, _ = librosa.load(ref, sr=m.sample_rate, mono=True)
ps.STATE.clear()
ps.STATE.update(m=m, vs=vs, sr=m.sample_rate, ref_fp=ps._fingerprint(ra, m.sample_rate))
def gen(text):
return ps.cleanup(ps._gen_gated(text), m.sample_rate)
sf.write(os.path.join(DESK, "umlaut_vorher.wav"), gen(S), m.sample_rate) # roh ASCII (falsch)
sf.write(os.path.join(DESK, "umlaut_nachher.wav"), gen(ps._fix_umlauts(S)), m.sample_rate) # mit Fix
print("Samples: umlaut_vorher.wav (roh) + umlaut_nachher.wav (fix) ->", DESK)
print("UMLAUT_DONE")