24 lines
1.6 KiB
Python
24 lines
1.6 KiB
Python
"""Offline one-request VoxCPM2 worker. Never persists prompt text or logs media."""
|
|
import contextlib,json,sys
|
|
from pathlib import Path
|
|
|
|
def main():
|
|
root=Path(sys.argv[1]);request=json.loads(sys.stdin.read());phase='Modell laden'
|
|
try:
|
|
# Libraries print progress and occasionally text; discard rather than record it.
|
|
with open('/dev/null','w') as sink,contextlib.redirect_stdout(sink),contextlib.redirect_stderr(sink):
|
|
import torch,soundfile as sf
|
|
from voxcpm import VoxCPM
|
|
model=VoxCPM.from_pretrained(str(root/'model'),load_denoiser=False,local_files_only=True,optimize=False,device='cuda:0')
|
|
(root/'phase').write_text('Stimme wird erzeugt');phase='Stimme erzeugen'
|
|
wave=model.generate(text=request['text'],reference_wav_path=str(root/'reference.wav') if (root/'reference.wav').exists() else None,cfg_value=request['cfg'],inference_timesteps=request['steps'],max_len=2048,normalize=False,denoise=False,seed=request['seed'],retry_badcase_max_times=1)
|
|
rate=model.tts_model.sample_rate
|
|
sf.write(root/'result.wav',wave,rate,subtype='PCM_16')
|
|
result=dict(ok=True,sample_rate=rate,duration=len(wave)/rate)
|
|
except Exception as exc:
|
|
oom='outofmemory' in type(exc).__name__.lower() or 'out of memory' in str(exc).lower()
|
|
result=dict(ok=False,error='GPU-Speicher reicht nicht aus. Andere Deck-Modelle entladen oder andere GPU wählen.' if oom else 'VoxCPM2: '+phase+' fehlgeschlagen ('+type(exc).__name__+'). Laufzeit und Komponenten prüfen.')
|
|
(root/'result.json').write_text(json.dumps(result))
|
|
return 0 if result['ok'] else 1
|
|
if __name__=='__main__':sys.exit(main())
|