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>
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# -*- 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")
|
||||
Reference in New Issue
Block a user