Spaces:
Sleeping
Sleeping
File size: 3,505 Bytes
df9db76 c8b7640 df9db76 07730d1 cf292fb d93bc11 c8b7640 d93bc11 c8b7640 795e681 c8b7640 129d88f c8b7640 795e681 c8b7640 129d88f c8b7640 129d88f c8b7640 129d88f c8b7640 df9db76 795e681 df9db76 129d88f df9db76 c8b7640 795e681 df9db76 c8b7640 df9db76 c8b7640 df9db76 c8b7640 df9db76 795e681 df9db76 129d88f df9db76 c8b7640 df9db76 c8b7640 df9db76 c8b7640 795e681 129d88f |
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
import speech_recognition as sr
from typing import Optional
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 check_microphone_access(self) -> bool:
"""Check if microphone is accessible"""
try:
with sr.Microphone() as source:
self.recognizer.adjust_for_ambient_noise(source, duration=0.1)
return True
except OSError as e:
print(f"OSError: {e}. This may occur if the microphone is not connected or accessible.")
return False
except AttributeError as e:
print(f"AttributeError: {e}. This may happen due to an issue with the 'sr.Microphone' configuration.")
return False
except sr.RequestError as e:
print(f"RequestError: {e}. This may happen if there's an issue with the SpeechRecognition service.")
return False
except Exception as e:
print(f"Unexpected error: {e}")
return False
def request_permissions(self) -> bool:
"""Request microphone permissions"""
try:
if self.check_microphone_access():
self.permission_granted = True
return True
print("Error: Could not access microphone. Please check your system or browser permissions.")
return False
except Exception as e:
print(f"Permission request error: {e}")
return False
def listen_for_voice(self, language: str = "mixed") -> str:
"""
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 and 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...")
return self._process_audio(audio, language)
except sr.RequestError as e:
return f"Could not request results from the 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)}"
def _process_audio(self, audio, language: str) -> str:
"""Process audio input and convert to text"""
if language in ["ar-SA", "mixed"]:
try:
return self.recognizer.recognize_google(audio, language="ar-SA")
except sr.UnknownValueError:
if language == "mixed":
return self.recognizer.recognize_google(audio, language="en-US")
raise
return self.recognizer.recognize_google(audio, language="en-US")
|