# -*- coding: utf-8 -*- """Sweep 2 (Feinschliff): lsd 10 (glättet Rauschen) × noise_clamp 2/2.5/3, temp 0.9. Ziel: sauberes 'Commander' (nicht erzwungen, = niedrigeres nc) + wenig Rauschen (= höheres lsd).""" import os, time, numpy as np, soundfile as sf, librosa from pocket_tts import TTSModel BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" OUT = r"C:\Users\TobisPC\Desktop\lucy_sweep2"; os.makedirs(OUT, exist_ok=True) src, _ = librosa.load(os.path.join(BASE, "ref.mp3"), sr=24000, mono=True) srt, _ = librosa.effects.trim(src, top_db=30); ref = os.path.join(BASE, "ref.wav") sf.write(ref, srt[:int(18*24000)], 24000) LEAD, TARGET_RMS = "Tja. ", 0.09 SENT = {"kurz":"Hallo Commander, ich höre dich.", "mittel":"Guten Morgen, Commander. Das Backup ist sauber durchgelaufen und es gab keine Fehler.", "lang":"Natürlich kümmere ich mich darum, Commander. Ich starte den Dienst neu, prüfe die Protokolle und melde mich, sobald alles wieder läuft."} def crop_lead(a, sr): iv = librosa.effects.split(a, top_db=35) if len(iv) >= 2: a = a[max(iv[0][1], iv[1][0]-int(0.06*sr)):] return a def cleanup(a, sr): a = np.asarray(a, dtype=np.float32).reshape(-1) if a.size == 0: return a a = crop_lead(a, sr) rev,_ = librosa.effects.trim(a[::-1], top_db=45); a = rev[::-1] if rev.size else a rms = float(np.sqrt(np.mean(a**2))) or 1e-9; a = a*(TARGET_RMS/rms) peak = float(np.max(np.abs(a))) if peak > 0.9: a = a*(0.9/peak) fi = min(int(0.008*sr), a.size//2) if fi>0: a[:fi]*=np.linspace(0.,1.,fi,dtype=np.float32); a[-fi:]*=np.linspace(1.,0.,fi,dtype=np.float32) return np.concatenate([np.zeros(int(0.08*sr),dtype=np.float32), a, np.zeros(int(0.08*sr),dtype=np.float32)]) for nc in [2.0, 2.5, 3.0]: tag = f"lsd10_nc{str(nc).replace('.','p')}" t0 = time.time() m = TTSModel.load_model(language="german_24l", lsd_decode_steps=10, temp=0.9, noise_clamp=nc) vs = m.get_state_for_audio_prompt(ref); sr = m.sample_rate print(f"== {tag} (load {time.time()-t0:.1f}s) ==", flush=True) for name, text in SENT.items(): t0 = time.time(); a = m.generate_audio(vs, LEAD+text, frames_after_eos=4); dt = time.time()-t0 a = a.numpy() if hasattr(a,"numpy") else np.asarray(a) a = cleanup(a, sr); secs = a.size/sr sf.write(os.path.join(OUT, f"{tag}_{name}.wav"), a, sr) print(f" [{name:6}] gen={dt:4.1f}s audio={secs:4.1f}s RTF={dt/max(secs,0.01):.2f}", flush=True) print("SWEEP2_DONE", flush=True)