import streamlit as st import speech_recognition as sr from gtts import gTTS import io import time def transcribe_audio(audio_file): recognizer = sr.Recognizer() try: with open("temp_audio.wav", "wb") as f: f.write(audio_file.read()) with sr.AudioFile("temp_audio.wav") as source: audio = recognizer.record(source) text = recognizer.recognize_google(audio) return text except Exception as e: st.error(f"Transcription failed: {str(e)}") return "" def text_to_speech(text, target_lang, max_retries=2): try: if not text: st.error("No text to convert to audio.") return None lang_map = { "English": "en", "French": "fr", "Spanish": "es", "German": "de", "Hindi": "hi", "Chinese": "zh-cn", "Arabic": "ar", "Russian": "ru", "Japanese": "ja" } lang_code = lang_map.get(target_lang, "en") st.write(f"Generating audio for {lang_code}") for attempt in range(max_retries): try: tts = gTTS(text=text[:200], lang=lang_code, slow=False) audio_buffer = io.BytesIO() tts.write_to_fp(audio_buffer) audio_buffer.seek(0) if audio_buffer.getbuffer().nbytes > 0: st.success(f"Audio generated for {target_lang} on attempt {attempt + 1}") return audio_buffer time.sleep(2 ** attempt) # Exponential backoff for rate limits except Exception as e: st.warning(f"Attempt {attempt + 1} failed: {str(e)}") if attempt == max_retries - 1: st.error(f"Audio failed after {max_retries} attempts. Try English/French.") return None return None except Exception as e: st.error(f"Audio processing error: {str(e)}. Try English/French.") return None