File size: 2,946 Bytes
df9db76
d93bc11
df9db76
 
 
 
d93bc11
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
df9db76
 
 
 
 
 
 
 
 
d93bc11
 
 
df9db76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import speech_recognition as sr
import platform

class VoiceHandler:
    def __init__(self):
        self.recognizer = sr.Recognizer()
        self.is_cloud = self._is_cloud_environment()
        
        if not self.is_cloud:
            # Only configure microphone settings if not in cloud
            self.recognizer.energy_threshold = 4000
            self.recognizer.dynamic_energy_threshold = True
            self.recognizer.pause_threshold = 0.8
    
    def _is_cloud_environment(self):
        """Check if running in a cloud environment"""
        # Check common cloud platform indicators
        return (
            platform.system() == "Linux" and
            not self._has_audio_device()
        )
    
    def _has_audio_device(self):
        """Check if system has an audio input device"""
        try:
            sr.Microphone()
            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 self.is_cloud:
            return "Error: Voice input is not available in cloud deployment. Please use the text input option instead."
            
        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)}"