File size: 2,923 Bytes
df9db76
 
 
 
 
07730d1
 
 
cf292fb
d93bc11
c8b7640
201991a
d93bc11
c8b7640
795e681
c8b7640
129d88f
f896422
201991a
129d88f
 
201991a
c8b7640
795e681
c8b7640
201991a
c8b7640
 
 
 
 
129d88f
201991a
c8b7640
df9db76
795e681
c8b7640
f896422
 
df9db76
c8b7640
 
df9db76
c8b7640
df9db76
c8b7640
795e681
df9db76
 
201991a
df9db76
f896422
df9db76
c8b7640
201991a
f896422
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
import speech_recognition as sr

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("OSError: Microphone not accessible. Please check your microphone connection and ALSA configuration.")
            print(f"Details: {str(e)}")
            return False
        except Exception as e:
            print(f"Unexpected error while accessing microphone: {str(e)}")
            return False
    
    def request_permissions(self) -> bool:
        """Request microphone permissions."""
        try:
            if self.check_microphone_access():
                self.permission_granted = True
                return True
            return False
        except Exception as e:
            print(f"Error requesting permissions: {str(e)}")
            return False
    
    def listen_for_voice(self, language: str = "mixed") -> str:
        if not self.permission_granted and not self.request_permissions():
            return "Error: Microphone permissions required."

        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 speech service: {str(e)}"
        except sr.UnknownValueError:
            return "Could not understand audio. Please try again."
        except sr.WaitTimeoutError:
            return "Listening timed out. Please try again."
        except OSError as e:
            return "OSError: Microphone not accessible. Check your connection and ALSA configuration."
        except Exception as e:
            return f"Error: {str(e)}"
    
    def _process_audio(self, audio, language: str) -> str:
        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")