import gradio as gr from gtts import gTTS import tempfile import os import docx from pydub import AudioSegment # Function to extract text from docx def extract_text_from_docx(file): doc = docx.Document(file.name) return [para.text.strip() for para in doc.paragraphs if para.text.strip()] # Function to convert Urdu text to speech def urdu_tts(text, speed): tts = gTTS(text=text, lang='ur') with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp: tts.save(tmp.name) audio_path = tmp.name # Change speed using pydub sound = AudioSegment.from_file(audio_path) sound = sound.speedup(playback_speed=speed) final_path = audio_path.replace(".mp3", f"_x{speed}.mp3") sound.export(final_path, format="mp3") return final_path # Gradio stateful interface def start_reader(file, speed): lines = extract_text_from_docx(file) return lines, f"کل {len(lines)} لائنیں ملی ہیں۔", 0 def read_line(lines, line_idx, speed): if line_idx < len(lines): audio_file = urdu_tts(lines[line_idx], speed) return lines[line_idx], audio_file, line_idx + 1 else: return "📘 تمام لائنیں پڑھ لی گئیں!", None, line_idx # Gradio UI with gr.Blocks() as demo: gr.Markdown("## 📖 اردو لائن بائی لائن ریڈر") with gr.Row(): file_input = gr.File(label="📁 .docx فائل اپ لوڈ کریں", file_types=['.docx']) speed_slider = gr.Slider(0.5, 2.0, 1.0, step=0.1, label="🔊 رفتار") start_button = gr.Button("🚀 فائل پڑھنا شروع کریں") status = gr.Textbox(label="🔹 اسٹیٹس") lines_state = gr.State() index_state = gr.State() current_line = gr.Textbox(label="📌 موجودہ لائن", lines=2) audio_output = gr.Audio(label="🎧 آڈیو") next_button = gr.Button("▶️ اگلی لائن پڑھیں") start_button.click(fn=start_reader, inputs=[file_input, speed_slider], outputs=[lines_state, status, index_state]) next_button.click(fn=read_line, inputs=[lines_state, index_state, speed_slider], outputs=[current_line, audio_output, index_state]) demo.launch()