from pathlib import Path
import argparse,json
import torch
import soundfile as sf
from qwen_tts import Qwen3TTSModel
p=argparse.ArgumentParser();p.add_argument('--mode',choices=['design','reuse'],required=True);p.add_argument('--voice',choices=['a','b'],default='a');p.add_argument('--reference');p.add_argument('--seed',type=int,default=42);p.add_argument('--output',default='model-output');a=p.parse_args()
root=Path(__file__).resolve().parent;out=root/a.output;out.mkdir(parents=True,exist_ok=True)
text=(root/'audition.txt').read_text().strip()
if a.mode=='design':
 card=json.loads((root/'voice-card.json').read_text());model=Qwen3TTSModel.from_pretrained('Qwen/Qwen3-TTS-12Hz-1.7B-VoiceDesign',device_map='cuda:0',dtype=torch.bfloat16)
 torch.manual_seed(a.seed)
 wavs,sr=model.generate_voice_design(text=text,language='Chinese',instruct=card['voiceA' if a.voice=='a' else 'voiceB'])
 sf.write(out/('design-'+a.voice+'.wav'),wavs[0],sr)
else:
 if not a.reference:p.error('--reference must point to your actual design output')
 reference=Path(a.reference).resolve();assert reference.is_file(),reference
 model=Qwen3TTSModel.from_pretrained('Qwen/Qwen3-TTS-12Hz-1.7B-Base',device_map='cuda:0',dtype=torch.bfloat16)
 prompt=model.create_voice_clone_prompt(ref_audio=str(reference),ref_text=text)
 lines=[s for s in (root/'lines.txt').read_text().splitlines() if s.strip()]
 wavs,sr=model.generate_voice_clone(text=lines,language=['Chinese']*len(lines),voice_clone_prompt=prompt)
 for i,wav in enumerate(wavs,1):sf.write(out/f'line-{i:03}.wav',wav,sr)
print(out)
