# -*- coding: utf-8 -*- import os, time, numpy as np, soundfile as sf, librosa, torch, torchaudio def _ta_load(p,*a,**k): x,sr=sf.read(p,dtype="float32"); return torch.from_numpy((x.T if x.ndim>1 else x[None,:]).copy()),sr def _ta_save(p,t,sample_rate=24000,*a,**k): sr=k.get("sample_rate",sample_rate); x=t.detach().cpu().numpy() sf.write(p,(x.T if x.ndim>1 else x.reshape(-1)),int(sr)) torchaudio.load=_ta_load; torchaudio.save=_ta_save def _wl(f,sr=16000): y,_=librosa.load(f,sr=sr,mono=True); return y.astype(np.float32) try: import whisper.audio as _wa; _wa.load_audio=_wl import whisper.transcribe as _wt; _wt.load_audio=_wl except Exception as e: print("whisper-patch:", e, flush=True) import outetts BASE = r"F:\Coding Stuff\mission-control-2\client\lucy-tts" ref = os.path.join(BASE, "ref.wav") y,_ = librosa.load(os.path.join(BASE,"ref.mp3"), sr=24000, mono=True) yt,_ = librosa.effects.trim(y, top_db=30) sf.write(ref, yt[:int(14*24000)], 24000) cfg = outetts.ModelConfig( model_path=os.path.join(BASE,"models","OuteTTS-1.0-1B-Q8_0.gguf"), tokenizer_path="OuteAI/Llama-OuteTTS-1.0-1B", interface_version=outetts.InterfaceVersion.V3, backend=outetts.Backend.LLAMACPP, ) cfg.n_gpu_layers = 999 t0=time.time(); iface=outetts.Interface(config=cfg); print(f"[iface] {time.time()-t0:.1f}s", flush=True) spk=iface.create_speaker(ref); print("[clone ok]", flush=True) OUT=os.path.join(BASE,"out"); os.makedirs(OUT,exist_ok=True) 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.", } for name,text in SENT.items(): for run in ("cold","warm"): t0=time.time(); out=iface.generate(config=outetts.GenerationConfig(text=text, speaker=spk)); dt=time.time()-t0 p=os.path.join(OUT,f"{name}.wav"); out.save(p) x,sr=sf.read(p); secs=len(x)/sr print(f"[{name:6} {run:4}] gen={dt:5.2f}s audio={secs:5.2f}s RTF={dt/max(secs,0.01):.2f}", flush=True) print("PC_DONE", flush=True)