import speech_recognition as sr import platform class VoiceHandler: def __init__(self): self.recognizer = sr.Recognizer() self.recognizer.energy_threshold = 4000 self.recognizer.dynamic_energy_threshold = True self.recognizer.pause_threshold = 0.8 self.permission_granted = False def request_permissions(self): """Request microphone permissions from the browser""" try: with sr.Microphone() as source: self.permission_granted = True return True except (OSError, AttributeError): return False def listen_for_voice(self, language="mixed"): """ Listen for voice input in specified language. language can be: - "ar-SA" for Arabic - "en-US" for English - "mixed" for both Arabic and English """ if not self.permission_granted: if not self.request_permissions(): return "Error: Please grant microphone permissions to use voice input." try: with sr.Microphone() as source: print("Adjusting for ambient noise...") self.recognizer.adjust_for_ambient_noise(source, duration=1) print("Listening...") audio = self.recognizer.listen(source, timeout=5, phrase_time_limit=10) print("Processing speech...") # Try Arabic first if mixed or Arabic is specified if language in ["ar-SA", "mixed"]: try: text = self.recognizer.recognize_google(audio, language="ar-SA") return text except sr.UnknownValueError: if language == "mixed": # If Arabic fails and mixed is specified, try English text = self.recognizer.recognize_google(audio, language="en-US") return text raise else: # English only text = self.recognizer.recognize_google(audio, language="en-US") return text except sr.RequestError as e: return f"Could not request results from speech service: {str(e)}" except sr.UnknownValueError: return "Could not understand audio. Please speak clearly and try again." except sr.WaitTimeoutError: return "Listening timed out. Please try again." except Exception as e: return f"Error: {str(e)}"