-
-
Save t1m0thyj/ddf6aaa6b3d37f602fedfd38c9af9d49 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3 | |
# Copyright 2017 Google Inc. | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
"""Run a recognizer using the Google Assistant Library. | |
The Google Assistant Library has direct access to the audio API, so this Python | |
code doesn't need to record audio. Hot word detection "OK, Google" is supported. | |
The Google Assistant Library can be installed with: | |
env/bin/pip install google-assistant-library==0.0.2 | |
It is available for Raspberry Pi 2/3 only; Pi Zero is not supported. | |
""" | |
import logging | |
import re | |
import subprocess | |
import sys | |
import aiy.assistant.auth_helpers | |
import aiy.assistant.device_helpers | |
import aiy.audio | |
import aiy.voicehat | |
from google.assistant.library import Assistant | |
from google.assistant.library.event import EventType | |
import vlc | |
import youtube_dl | |
logging.basicConfig( | |
level=logging.INFO, | |
format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s" | |
) | |
ydl_opts = { | |
'default_search': 'ytsearch1:', | |
'format': 'bestaudio/best', | |
'noplaylist': True, | |
'quiet': True | |
} | |
vlc_instance = vlc.get_default_instance() | |
vlc_player = vlc_instance.media_player_new() | |
def power_off_pi(): | |
aiy.audio.say('Good bye!') | |
subprocess.call('sudo shutdown now', shell=True) | |
def reboot_pi(): | |
aiy.audio.say('See you in a bit!') | |
subprocess.call('sudo reboot', shell=True) | |
def say_ip(): | |
ip_address = subprocess.check_output("hostname -I | cut -d' ' -f1", shell=True) | |
aiy.audio.say('My IP address is %s' % ip_address.decode('utf-8')) | |
def play_music(name): | |
try: | |
with youtube_dl.YoutubeDL(ydl_opts) as ydl: | |
meta = ydl.extract_info(name, download=False) | |
except Exception: | |
aiy.audio.say('Sorry, I can\'t find that song.') | |
return | |
if meta: | |
info = meta['entries'][0] | |
vlc_player.set_media(vlc_instance.media_new(info['url'])) | |
aiy.audio.say('Now playing ' + re.sub(r'[^\s\w]', '', info['title'])) | |
vlc_player.play() | |
def process_event(assistant, event): | |
status_ui = aiy.voicehat.get_status_ui() | |
if event.type == EventType.ON_START_FINISHED: | |
status_ui.status('ready') | |
if sys.stdout.isatty(): | |
print('Say "OK, Google" then speak, or press Ctrl+C to quit...') | |
elif event.type == EventType.ON_CONVERSATION_TURN_STARTED: | |
status_ui.status('listening') | |
elif event.type == EventType.ON_RECOGNIZING_SPEECH_FINISHED and event.args: | |
print('You said:', event.args['text']) | |
text = event.args['text'].lower() | |
if text == 'stop': | |
if vlc_player.get_state() == vlc.State.Playing: | |
vlc_player.stop() | |
elif text == 'power off': | |
assistant.stop_conversation() | |
power_off_pi() | |
elif text == 'reboot': | |
assistant.stop_conversation() | |
reboot_pi() | |
elif text == 'ip address': | |
assistant.stop_conversation() | |
say_ip() | |
elif text == 'pause': | |
assistant.stop_conversation() | |
vlc_player.set_pause(True) | |
elif text == 'resume': | |
assistant.stop_conversation() | |
vlc_player.set_pause(False) | |
elif text.startswith('play '): | |
assistant.stop_conversation() | |
play_music(text[5:]) | |
elif event.type == EventType.ON_END_OF_UTTERANCE: | |
status_ui.status('thinking') | |
elif event.type == EventType.ON_CONVERSATION_TURN_FINISHED: | |
status_ui.status('ready') | |
elif event.type == EventType.ON_ASSISTANT_ERROR and event.args and event.args['is_fatal']: | |
sys.exit(1) | |
def main(): | |
credentials = aiy.assistant.auth_helpers.get_assistant_credentials() | |
device_id, model_id = aiy.assistant.device_helpers.get_ids(credentials) | |
with Assistant(credentials, model_id) as assistant: | |
for event in assistant.start(): | |
process_event(assistant, event) | |
if __name__ == '__main__': | |
main() |
Awesome work but I'm wondering if i said anything else like " what's the weather " will it respond with the weather ?
@lordjoo Yes it should, the commands defined in the code above are not the only commands supported, they are overrides that replace Google Assistant's default behavior.
I really need help! I'm terrible at python, so please excuse me if this is just a dumb mistake, but first of all, I had to remove aiy.voicehat and replace aiy.audio with aiy.board (I think that's the right API?), but every time that I run it, it reads everything until line 130, and gives me the error:
Traceback (most recent call last): File "./assistant.py", line 137, in <module> main() File "./assistant.py", line 130, in main device_id, model_id = aiy.assistant.device_helpers.get_ids(credentials) AttributeError: module 'aiy.assistant.device_helpers' has no attribute 'get_ids'
. PLEASE HELP, because I spent $60 on a voice kit, thinking that YouTube Music was built in and the Assistant was just like the one on my Chromebook, but apparently not D:
Also, I renamed the file to assistant.py so that's what that is
@RubyGamerX600 This script used to work for me with google-assistant-library==0.0.2
as mentioned at the top of the file, but that version is now several years old and I don't know if it still works. Since then I no longer use my VoiceKit and it looks like google-assistant-library
has been deprecated (see here) so you may need to find an alternative.
Awesome work but I'm wondering if i said anything else like " what's the weather " will it respond with the weather ?