tai / voice_handler.py
shamimjony1000's picture
Update voice_handler.py
830a5b7 verified
raw
history blame
4 kB
import speech_recognition as sr
import streamlit as st
from typing import Optional, Tuple
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) -> Tuple[bool, str]:
"""Check if microphone is accessible and return status with message"""
try:
with sr.Microphone() as source:
self.recognizer.adjust_for_ambient_noise(source, duration=0.1)
return True, "Microphone access granted"
except (OSError, AttributeError) as e:
return False, "Could not access microphone. Please check your browser settings and microphone connection."
except sr.RequestError as e:
return False, f"Error accessing speech service: {str(e)}"
except Exception as e:
return False, f"Unexpected error: {str(e)}"
def request_permissions(self) -> Tuple[bool, str]:
"""Request microphone permissions from the browser"""
success, message = self.check_microphone_access()
if success:
self.permission_granted = True
return success, message
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
"""
# Check permissions first
if not self.permission_granted:
success, message = self.request_permissions()
if not success:
st.error(message)
st.markdown("""
### Troubleshooting Steps:
1. Click the lock/info icon in your browser's address bar
2. Ensure microphone access is allowed for this site
3. Check if your microphone is properly connected
4. Try refreshing the page
5. If using Chrome, go to Settings > Privacy and Security > Site Settings > Microphone
""")
return message
try:
with sr.Microphone() as source:
st.info("Adjusting for ambient noise... Please wait.")
self.recognizer.adjust_for_ambient_noise(source, duration=1)
st.info("🎀 Listening... Speak now!")
audio = self.recognizer.listen(source, timeout=5, phrase_time_limit=10)
st.info("Processing speech...")
return self._process_audio(audio, language)
except sr.RequestError as e:
error_msg = f"Could not request results from speech service: {str(e)}"
st.error(error_msg)
return error_msg
except sr.UnknownValueError:
error_msg = "Could not understand audio. Please speak clearly and try again."
st.warning(error_msg)
return error_msg
except sr.WaitTimeoutError:
error_msg = "Listening timed out. Please try again."
st.warning(error_msg)
return error_msg
except Exception as e:
error_msg = f"Error: {str(e)}"
st.error(error_msg)
return error_msg
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")