import logging
from typing import NamedTuple
+import sys
+import warnings
import requests
import speech_recognition as sr # type: ignore
def tell_google(cmd: str, *, recognize_speech=True) -> GoogleResponse:
+ """Alias for ask_google."""
return ask_google(cmd, recognize_speech=recognize_speech)
def ask_google(cmd: str, *, recognize_speech=True) -> GoogleResponse:
+ """Send a command string to Google via the google_assistant_bridge as the
+ user google_assistant_username and return the response. If recognize_speech
+ is True, perform speech recognition on the audio response from Google so as
+ to translate it into text (best effort, YMMV).
+ """
logging.debug(f"Asking google: '{cmd}'")
payload = {
"command": cmd,
sample_rate=24000,
sample_width=2,
)
- audio_transcription = recognizer.recognize_google(
- speech,
- )
- logger.debug(f"Transcription: '{audio_transcription}'")
+ try:
+ audio_transcription = recognizer.recognize_google(
+ speech,
+ )
+ logger.debug(f"Transcription: '{audio_transcription}'")
+ except sr.UnknownValueError as e:
+ logger.exception(e)
+ msg = 'Unable to parse Google assistant\'s response.'
+ logger.warning(msg)
+ warnings.warn(msg, stacklevel=3)
+ audio_transcription = None
+ return GoogleResponse(
+ success=success,
+ response=response,
+ audio_url=audio,
+ audio_transcription=audio_transcription,
+ )
else:
- logger.error(
- f'HTTP request to {url} with {payload} failed; code {r.status_code}'
+ message = f'HTTP request to {url} with {payload} failed; code {r.status_code}'
+ logger.error(message)
+ return GoogleResponse(
+ success=False,
+ response=message,
+ audio_url=audio,
+ audio_transcription=audio_transcription,
)
- return GoogleResponse(
- success=success,
- response=response,
- audio_url=audio,
- audio_transcription=audio_transcription,
- )
+ sys.exit(-1)