Ttskhodam2 / app.py
Rezfars's picture
Update app.py
aaab9e5 verified
import gradio as gr from TTS.api import TTS from pydub import AudioSegment import tempfile import os
نام مدل‌ها را تایپ دستی کنید تا کاراکتر غیرمجاز نداشته باشند
voice_a = 'Kamtera/persian-tts-female-glow_tts' voice_b = 'Kamtera/persian-tts-male-vits'
Preload مدل‌ها قبل از رابط کاربری
tts_a = TTS(voice_a) tts_b = TTS(voice_b)
def tts_dialogue_offline(text, pause_ms=300): # پاکسازی متن از کاراکترهای غیرمجاز text = text.replace('\u200c','')
lines = [l.strip() for l in text.split("\n") if l.strip()]
combined_audio = AudioSegment.silent(duration=0)
for line in lines:
speaker_text = line.split(":", 1)[-1].strip()
tmp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
if line.startswith("A:"):
tts_a.tts_to_file(text=speaker_text, file_path=tmp_file.name)
elif line.startswith("B:"):
tts_b.tts_to_file(text=speaker_text, file_path=tmp_file.name)
else:
tts_a.tts_to_file(text=speaker_text, file_path=tmp_file.name)
segment = AudioSegment.from_wav(tmp_file.name)
combined_audio += segment + AudioSegment.silent(duration=pause_ms)
os.remove(tmp_file.name)
out_path = tempfile.NamedTemporaryFile(delete=False, suffix=".wav").name
combined_audio.export(out_path, format="wav")
return out_path
demo = gr.Interface( fn=tts_dialogue_offline, inputs=[ gr.Textbox(label="متن گفت‌وگو (A و B)", lines=8, placeholder="A: سلام، خوبی؟\nB: ممنون، تو چطوری؟"), gr.Slider(100, 1000, value=300, step=50, label="فاصله بین دیالوگ‌ها (میلی‌ثانیه)"), ], outputs=gr.Audio(label="فایل صوتی ترکیبی نهایی", type="filepath"), title="🗣️ گفت‌وگوی دو نفره فارسی آفلاین", description="هر خط گفت‌وگو را با A: یا B: شروع کنید. خروجی ترکیبی با دو صدای فارسی تولید می‌شود.", )
if name == "main": demo.launch()