File size: 2,034 Bytes
aaab9e5
c10eba5
aaab9e5
c10eba5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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()