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:
Hitonabi
2026-07-02 10:29:33 +02:00
parent aff0105700
commit 09a1c98514
49 changed files with 8231 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
"""Fix-Verifikation: rendert die Problem-/Regressionssätze auf :8134, misst Pausen + IST (Whisper)."""
import os, io, json, urllib.request
import numpy as np, soundfile as sf
from faster_whisper import WhisperModel
SERVER = "http://127.0.0.1:8134/tts"
OUT = os.path.join(os.environ["TEMP"], "lucy_fix"); os.makedirs(OUT, exist_ok=True)
TESTS = [
("01_kurz", "Schön, dass du da bist, Commander."),
("07_lang", "Guten Morgen, Commander. Das nächtliche Backup ist um 3 Uhr durchgelaufen, es gab keine Fehler, und die Datenbank läuft mit 92 Prozent Auslastung völlig stabil."),
("08_sehr_lang","Also, Commander, wenn ich das kurz zusammenfassen darf: heute früh war die Verbindung weg, dann lief das Update durch, danach musste ich zweimal neu starten, und jetzt sind endlich alle Dienste oben, das Gedächtnis ist warm, und wir können ganz entspannt weitermachen."),
("09_akronyme", "Die CPU der RX 9070 XT und die GPU laufen mit ROCm, sagt der PC über das LAN. Es ist 21 Uhr UTC."),
]
def render(text):
req = urllib.request.Request(SERVER, data=json.dumps({"text": text}).encode("utf-8"),
headers={"Content-Type": "application/json"})
return urllib.request.urlopen(req, timeout=180).read()
w = WhisperModel("small", device="cpu", compute_type="int8")
for name, text in TESTS:
wav = render(text)
path = os.path.join(OUT, name + ".wav"); open(path, "wb").write(wav)
a, sr = sf.read(io.BytesIO(wav)); a = np.asarray(a, dtype=np.float32).reshape(-1); dur = len(a)/sr
segs, _ = w.transcribe(path, language="de", beam_size=5, word_timestamps=True)
words = [x for s in segs for x in (s.words or [])]
got = " ".join(x.word.strip() for x in words)
pauses = [(words[i].word.strip(), words[i+1].start - words[i].end)
for i in range(len(words)-1) if (words[i+1].start - words[i].end) >= 0.25]
print(f"\n### {name} {dur:.1f}s {len(words)} Wörter")
print(f"IST: {got}")
if pauses:
print("PAUSEN>=250ms: " + ", ".join(f'{ww}\"={gg*1000:.0f}ms' for ww, gg in sorted(pauses, key=lambda t:-t[1])[:6]))
else:
print("PAUSEN>=250ms: KEINE")
print("\n=== FERTIG ===")