Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -3,13 +3,11 @@ from parler_tts import ParlerTTSForConditionalGeneration
|
|
| 3 |
from transformers import AutoTokenizer
|
| 4 |
import soundfile as sf
|
| 5 |
import gradio as gr
|
| 6 |
-
import numpy as np
|
| 7 |
-
import tempfile
|
| 8 |
import os
|
| 9 |
import time
|
| 10 |
import glob
|
| 11 |
|
| 12 |
-
MODEL_ID = "parler-tts/parler-tts-mini-
|
| 13 |
device = "cpu"
|
| 14 |
|
| 15 |
model = ParlerTTSForConditionalGeneration.from_pretrained(MODEL_ID).to(device)
|
|
@@ -19,19 +17,14 @@ SAVE_DIR = "saved_audios"
|
|
| 19 |
os.makedirs(SAVE_DIR, exist_ok=True)
|
| 20 |
|
| 21 |
def tts(text, description, progress=gr.Progress()):
|
| 22 |
-
progress(0, desc="
|
| 23 |
-
time.sleep(0.2)
|
| 24 |
input_ids = tokenizer(description, return_tensors="pt").input_ids.to(device)
|
| 25 |
-
progress(0.
|
| 26 |
-
time.sleep(0.2)
|
| 27 |
prompt_input_ids = tokenizer(text, return_tensors="pt").input_ids.to(device)
|
| 28 |
-
progress(0.
|
| 29 |
-
time.sleep(0.2)
|
| 30 |
-
progress(0.35, desc="開始生成語音")
|
| 31 |
generation = model.generate(input_ids=input_ids, prompt_input_ids=prompt_input_ids)
|
| 32 |
progress(0.8, desc="語音生成完成,正在寫入檔案")
|
| 33 |
audio_arr = generation.cpu().numpy().squeeze()
|
| 34 |
-
# 自動儲存
|
| 35 |
filename = f"tts_{int(time.time())}.wav"
|
| 36 |
save_path = os.path.join(SAVE_DIR, filename)
|
| 37 |
sf.write(save_path, audio_arr, model.config.sampling_rate)
|
|
@@ -39,7 +32,6 @@ def tts(text, description, progress=gr.Progress()):
|
|
| 39 |
return save_path
|
| 40 |
|
| 41 |
def list_saved_audios():
|
| 42 |
-
# 取得所有 wav 檔案路徑
|
| 43 |
audio_files = sorted(
|
| 44 |
glob.glob(os.path.join(SAVE_DIR, "*.wav")),
|
| 45 |
key=os.path.getmtime,
|
|
@@ -48,7 +40,7 @@ def list_saved_audios():
|
|
| 48 |
return audio_files
|
| 49 |
|
| 50 |
with gr.Blocks() as demo:
|
| 51 |
-
gr.Markdown("## Parler-TTS Mini (
|
| 52 |
|
| 53 |
with gr.Tab("語音生成"):
|
| 54 |
text = gr.Textbox(label="輸入文字", value="Hello, this is Parler-TTS mini running on CPU.")
|
|
@@ -61,7 +53,6 @@ with gr.Blocks() as demo:
|
|
| 61 |
audio_list = gr.Files(label="已儲存音檔", file_count="multiple", type="filepath")
|
| 62 |
refresh_btn = gr.Button("重新整理列表")
|
| 63 |
refresh_btn.click(fn=list_saved_audios, inputs=[], outputs=audio_list)
|
| 64 |
-
# 預設自動載入
|
| 65 |
demo.load(fn=list_saved_audios, inputs=[], outputs=audio_list)
|
| 66 |
|
| 67 |
if __name__ == "__main__":
|
|
|
|
| 3 |
from transformers import AutoTokenizer
|
| 4 |
import soundfile as sf
|
| 5 |
import gradio as gr
|
|
|
|
|
|
|
| 6 |
import os
|
| 7 |
import time
|
| 8 |
import glob
|
| 9 |
|
| 10 |
+
MODEL_ID = "parler-tts/parler-tts-mini-v1" # v1 速度最快[2][5]
|
| 11 |
device = "cpu"
|
| 12 |
|
| 13 |
model = ParlerTTSForConditionalGeneration.from_pretrained(MODEL_ID).to(device)
|
|
|
|
| 17 |
os.makedirs(SAVE_DIR, exist_ok=True)
|
| 18 |
|
| 19 |
def 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)
|
|
|
|
| 32 |
return save_path
|
| 33 |
|
| 34 |
def list_saved_audios():
|
|
|
|
| 35 |
audio_files = sorted(
|
| 36 |
glob.glob(os.path.join(SAVE_DIR, "*.wav")),
|
| 37 |
key=os.path.getmtime,
|
|
|
|
| 40 |
return audio_files
|
| 41 |
|
| 42 |
with 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.")
|
|
|
|
| 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 |
|
| 58 |
if __name__ == "__main__":
|