09a1c98514
- 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>
50 lines
2.2 KiB
Python
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")
|