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()