Ryanus/parlerTTSmini
0
1import torch2from parler_tts import ParlerTTSForConditionalGeneration3from transformers import AutoTokenizer4import soundfile as sf5import gradio as gr6import os7import time8import glob9 10MODEL_ID = "parler-tts/parler-tts-mini-v1" # v1 速度最快[2][5]11device = "cpu"12 13model = ParlerTTSForConditionalGeneration.from_pretrained(MODEL_ID).to(device)14tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)15 16SAVE_DIR = "saved_audios"17os.makedirs(SAVE_DIR, exist_ok=True)18 19def tts(text, description, progress=gr.Progress()):20 progress(0, desc="開始處理輸入")21 input_ids = tokenizer(description, return_tensors="pt").input_ids.to(device)22 progress(0.2, desc="描述編碼完成")23 prompt_input_ids = tokenizer(text, return_tensors="pt").input_ids.to(device)24 progress(0.4, desc="文本編碼完成")25 generation = model.generate(input_ids=input_ids, prompt_input_ids=prompt_input_ids)26 progress(0.8, desc="語音生成完成,正在寫入檔案")27 audio_arr = generation.cpu().numpy().squeeze()28 filename = f"tts_{int(time.time())}.wav"29 save_path = os.path.join(SAVE_DIR, filename)30 sf.write(save_path, audio_arr, model.config.sampling_rate)31 progress(1, desc="完成")32 return save_path33 34def list_saved_audios():35 audio_files = sorted(36 glob.glob(os.path.join(SAVE_DIR, "*.wav")),37 key=os.path.getmtime,38 reverse=True39 )40 return audio_files41 42with gr.Blocks() as demo:43 gr.Markdown("## Parler-TTS Mini v1 (CPU)|進度條+自動儲存+音檔檢視")44 45 with gr.Tab("語音生成"):46 text = gr.Textbox(label="輸入文字", value="Hello, this is Parler-TTS mini running on CPU.")47 description = gr.Textbox(label="語音描述", value="A young female speaker, neutral tone, high quality audio.")48 out_audio = gr.Audio(label="生成語音", type="filepath")49 btn = gr.Button("生成語音")50 btn.click(fn=tts, inputs=[text, description], outputs=out_audio)51 52 with gr.Tab("檢視已儲存音檔"):53 audio_list = gr.Files(label="已儲存音檔", file_count="multiple", type="filepath")54 refresh_btn = gr.Button("重新整理列表")55 refresh_btn.click(fn=list_saved_audios, inputs=[], outputs=audio_list)56 demo.load(fn=list_saved_audios, inputs=[], outputs=audio_list)57 58if __name__ == "__main__":59 demo.queue().launch()60 