projects
/
python_utils.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Since this thing is on the innerwebs I suppose it should have a
[python_utils.git]
/
google_assistant.py
diff --git
a/google_assistant.py
b/google_assistant.py
index b34197a3e60d0db9eff5c9cc6609ebe04e581bab..b767df75f4a56f4b4ec84be3abedd16b2e8a591b 100644
(file)
--- a/
google_assistant.py
+++ b/
google_assistant.py
@@
-1,7
+1,16
@@
#!/usr/bin/env python3
#!/usr/bin/env python3
+# © Copyright 2021-2022, Scott Gasch
+
+"""A module to serve as a local client library around HTTP calls to
+the Google Assistant via a local gateway.
+
+"""
+
import logging
import logging
-from typing import NamedTuple
+import warnings
+from dataclasses import dataclass
+from typing import Optional
import requests
import speech_recognition as sr # type: ignore
import requests
import speech_recognition as sr # type: ignore
@@
-19,22
+28,25
@@
parser.add_argument(
type=str,
default="http://kiosk.house:3000",
metavar="URL",
type=str,
default="http://kiosk.house:3000",
metavar="URL",
- help="How to contact the Google Assistant bridge"
+ help="How to contact the Google Assistant bridge"
,
)
parser.add_argument(
"--google_assistant_username",
type=str,
metavar="GOOGLE_ACCOUNT",
default="scott.gasch",
)
parser.add_argument(
"--google_assistant_username",
type=str,
metavar="GOOGLE_ACCOUNT",
default="scott.gasch",
- help="The user account for talking to Google Assistant"
+ help="The user account for talking to Google Assistant"
,
)
)
-class GoogleResponse(NamedTuple):
- success: bool
- response: str
- audio_url: str
- audio_transcription: str
+@dataclass
+class GoogleResponse:
+ """A response wrapper."""
+
+ success: bool = False
+ response: str = ''
+ audio_url: str = ''
+ audio_transcription: Optional[str] = None # None if not available.
def __repr__(self):
return f"""
def __repr__(self):
return f"""
@@
-55,7
+67,7
@@
def ask_google(cmd: str, *, recognize_speech=True) -> GoogleResponse:
is True, perform speech recognition on the audio response from Google so as
to translate it into text (best effort, YMMV).
"""
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}'"
)
+ logging.debug(
"Asking google: '%s'", cmd
)
payload = {
"command": cmd,
"user": config.config['google_assistant_username'],
payload = {
"command": cmd,
"user": config.config['google_assistant_username'],
@@
-65,15
+77,16
@@
def ask_google(cmd: str, *, recognize_speech=True) -> GoogleResponse:
success = False
response = ""
audio = ""
success = False
response = ""
audio = ""
- audio_transcription = ""
+ audio_transcription
: Optional[str]
= ""
if r.status_code == 200:
j = r.json()
if r.status_code == 200:
j = r.json()
+ logger.debug(j)
success = bool(j["success"])
response = j["response"] if success else j["error"]
if success:
logger.debug('Google request succeeded.')
if len(response) > 0:
success = bool(j["success"])
response = j["response"] if success else j["error"]
if success:
logger.debug('Google request succeeded.')
if len(response) > 0:
- logger.debug(
f"Google said: '{response}'"
)
+ logger.debug(
"Google said: '%s'", response
)
audio = f"{config.config['google_assistant_bridge']}{j['audio']}"
if recognize_speech:
recognizer = sr.Recognizer()
audio = f"{config.config['google_assistant_bridge']}{j['audio']}"
if recognize_speech:
recognizer = sr.Recognizer()
@@
-89,18
+102,25
@@
def ask_google(cmd: str, *, recognize_speech=True) -> GoogleResponse:
audio_transcription = recognizer.recognize_google(
speech,
)
audio_transcription = recognizer.recognize_google(
speech,
)
- logger.debug(
f"Transcription: '{audio_transcription}'"
)
+ logger.debug(
"Transcription: '%s'", audio_transcription
)
except sr.UnknownValueError as e:
logger.exception(e)
except sr.UnknownValueError as e:
logger.exception(e)
- logger.warning('Unable to parse Google assistant\'s response.')
+ msg = 'Unable to parse Google assistant\'s response.'
+ logger.warning(msg)
+ warnings.warn(msg, stacklevel=3)
audio_transcription = None
audio_transcription = None
+ return GoogleResponse(
+ success=success,
+ response=response,
+ audio_url=audio,
+ audio_transcription=audio_transcription,
+ )
else:
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,
- )