ใช้ Google AIY Kit กับ Raspberry Pi

ต่อจากการแกะกล่อง Google AIY Kit ก็มาทำการติดตั้งเพื่อใช้งาน (ดองบล็อกมานานเลยเรา) ขั้นแรกก็ต้องประกอบมันเข้ากับ Raspberry Pi ซึ่งในคู่มือที่มาพร้อมกับ AIY มีภาพประกอบค่อนข้างละเอียด ดูในนั้นได้เลยครับ โดยเมื่อประกอบเสร็จแล้วจะได้

จากนั้นก็มาเตรียมระบบปฏิบัติการ ดาวน์โหลดที่ https://dl.google.com/dl/aiyprojects/aiyprojects-latest.img.xz จะได้ image ล่าสุด (ของผมในตอนที่ดาวน์โหลดนั้นได้ไฟล์เป็น aiyprojects-2018-04-13.img.xz) ซึ่งมีโปรแกรมที่ต้องใช้ในการรับคำสั่งเสียงมาให้ในตัวอยู่แล้ว ก็แตกไฟล์ออกด้วยคำสั่ง unxz (ติดตั้งโดย sudo apt-get install xz-utils) จะได้ไฟล์ img แล้วก็เขียนลง SD card ซึ่งอาจใช้โปรแกรม Etcher มาช่วยเขียนได้ เมื่อได้ SD card ที่มีระบบปฏิบัติการแล้ว ขอให้ใช้ adaptor ที่จ่ายกำลังไฟสูงๆ สัก 2A (กับ 5v) ขึ้นไปนะครับ เพราะเรามีบอร์ด AIY มาขอพ่วงใช้ไฟฟ้าด้วย งานนี้ผมใช้ขนาด 3A ครับ

แล้วก็เข้าใช้งาน RPi ผ่านทาง SSH ไปก่อนครับ username:password ยังคงเป็น pi:raspberry โดยผมสแกนหา IP address ของตัว RPi ด้วยคำสั่ง nmap จากนั้นก็สั่ง raspi-config เพื่อไปสั่งยืดขนาดให้ใช้พื้นที่ของ SD card ได้เต็มใบที่ Expand Filesystem นอกจากนี้ยังมีให้ใส่รหัสเข้า Wi-Fi ของที่บ้านก็ทำได้ตามสะดวก จากนั้นแนะนำให้ติดตั้ง remote desktop ด้วยคำสั่ง sudo apt-get install xrdp ที่ RPi ไปด้วย จะได้ใช้งานผ่านโปรแกรมพวก remote desktop ได้ง่ายๆ ซึ่งผมใช้วิธีนี้

เมื่อเข้าไปที่ desktop ของ RPi จะมีไอค่อนที่ desktop เพื่อทดสอบระบบเบื้องต้นว่า ลำโพง ไมโครโฟนของเราทำงานได้ไหม ต่อ Wi-Fi ได้ไหม มีไฟล์ client ID จาก Google ไหม ซึ่งน่าจะยังไม่มีครับ

ดังนั้นเราต้องดาวน์โหลดไฟล์ client ID ซึ่งเป็น JSON เพื่อมาใช้งาน เข้าไปที่หน้าเว็บ Google Cloud ซึ่งก็คือ https://cloud.google.com/ ครับ login ด้วยบัญชี Google ที่เรามี (ถ้ายังไม่มีก็สร้างบัญชี Google ขึ้นมาใหม่) เมื่อเข้าไปได้แล้วก็ให้เลือก New Project แล้วตั้งชื่อ project ของเราครับ

จากนั้นกดที่ปุ่มสามขีดด้านซ้ายบน (บางทีมันถูกเรียกว่าปุ่มแฮมเบอร์เกอร์) ไปที่ APIs & Services -> Dashboard อ้อ ตรง drop-down list ต้องเป็นชื่อโปรเจคที่เราจะทำด้วยนะครับ เผื่อใครมีหลายโปรเจค
จากนั้นที่ช่องค้นหา กรอกคำว่า embedded assistant เพื่อให้เจอ Google Assistant API
ต่อมาก็กดเลือกและ enable เปิดการใช้งานครับ

ขั้นต่อไปมันจะพาไปที่หน้า credentials กดสร้าง credentials เลือก Google Assistant API, Other UI และ User data ตามรูปครับ แล้วกดปุ่มน้ำเงินครับ

จากนั้นก็สร้าง Client ID ง่ายๆ ก็ ชื่อเหมือนโปรเจคครับ จากนั้นจะมีให้กรอกรายละเอียดต่างๆ เช่น e-mail, Product ID เมื่อกรอกครบ ขั้นตอนสุดท้าย จะมีไฟล์ .json ให้ download ครับ

ไฟล์ json ที่ได้มาแล้วนั้น ให้เปลี่ยนชื่อเป็น assistant.json แล้วไปวางไว้ที่ /home/pi ของ Pi ผมใช้งานผ่าน Ubuntu PC เลยใช้คำสั่ง scp จาก PC ได้เลย จากนั้นที่ Pi ไปที่ /home/pi/AIY-voice-kit-python/src/examples/voice แล้วก็เรียกใช้โปรแกรม ./assistant_grpc_demo.py ครับ ซึ่งการเรียกใช้งานครั้งแรกจะมีให้ยืนยันการใช้ credential นั้น โดยต้องเปิด link ที่โปรแกรมแสดงออกมา

แต่เนื่องจากผมใช้ผ่าน desktop ของ Pi ผลคือมันจะเปิด web browser ตาม link นั้นให้เลย ไม่ต้อง copy link ดังกล่าวไปเปิดเอง ก็ให้ login บัญชี Google ของเราตามในหน้าเว็บนั้น แล้ว Allow คืออนุญาตให้ใช้งาน

ถึงตอนนี้เมื่อเรียกใช้งาน ./assistant_grpc_demo.py ครั้งต่อ ๆ ไป ก็ควรจะใช้งานได้ด้วยเสียงแล้วครับ
ถ้าต้องการเพิ่มการรับคำสั่งเสียงให้ shut down คัดลอกไฟล์ assistant_grpc_demo.py ไปยังชื่อใหม่ main.py (หลังจากนี้จะใช้ main.py แทนแล้วนะครับ) แล้วทำการแก้ไข สามารถทำได้โดยคำสั่ง

cd /home/pi/AIY-projects-python/src/examples/voicecp assistant_grpc_demo.py main.py
nano main.py

การแก้ไฟล์ main.py โดยเพิ่มข้อความตามที่ทำแทบสีเหลืองเพื่อให้มันรองรับคำสั่งเสียง power down ครับ

#!/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.

"""A demo of the Google Assistant GRPC recognizer."""

import logging

import aiy.assistant.grpcimport aiy.audioimport aiy.voicehat

import subprocess

logging.basicConfig(    level=logging.INFO,    format="[%(asctime)s] %(levelname)s:%(name)s:%(message)s")

#Google Assistant to "Power Down"def shutit():    subprocess.call('sudo shutdown now', shell=True)def main():    status_ui = aiy.voicehat.get_status_ui()    status_ui.status('starting')    assistant = aiy.assistant.grpc.get_assistant()    button = aiy.voicehat.get_button()    with aiy.audio.get_recorder():        while True:            status_ui.status('ready')            print('Press the button and speak')            button.wait_for_press()            status_ui.status('listening')            print('Listening...')            text, audio = assistant.recognize()            if text:                if text == 'goodbye':                    status_ui.status('stopping')                    print('Bye!')                    break

                if text == 'power down':                    aiy.audio.say('Shutting Down!')                    shutit()                print('You said "', text, '"')            if audio:                aiy.audio.play_audio(audio, assistant.get_volume())

if __name__ == '__main__':    main()

ซึ่งก็คือเมื่อรับเสียงที่เป็นคำว่า power down ก็เรียกคำสั่งเชลล์ให้ปิดเครื่องเลยนั้นเอง และมีการส่งเสียงตอบกลับมาด้วย

ถ้าจะเพิ่มความสามารถให้มันทำงานได้ตั้งแต่ตอนบูตขึ้นมาเลย โดยเราจะเรียกใช้จากไฟล์ main.py นั้น ก็ให้เพิ่มไฟล์ /etc/systemd/system/assist.service เช่นใช้คำสั่ง sudo nano /etc/systemd/system/assist.service ให้มีข้อความตามข้างล่างนี้ครับ

[Unit]Description=Assist @ rebootAfter=sound.target

[Service]ExecStart=/home/pi/AIY-projects-python/src/examples/voice/main.pyUser=piGroup=piStandardOutput=syslogStandardError=syslogSyslogIdentifier=assistEnvironment=DISPLAY=:0

[Install]WantedBy=multi-user.target

จากนั้นก็เปิดใช้งาน ด้วยคำสั่ง

sudo systemctl enable assist.service 
sudo systemctl start assist.service

คลิปเมื่อทดลองใช้งานครับ
https://www.youtube.com/watch?v=HxklMHURVxM

ได้แนวทางจาก
https://aiyprojects.withgoogle.com/voice
https://www.raspberrypi.org/forums/viewtopic.php?t=200460
https://metrocoder.com/google-assistant-shutdown
https://gist.github.com/t1m0thyj/91d525aae9fa885f67b453cedf963d42
https://unix.stackexchange.com/questions/250629/systemd-not-playing-a-sound
https://medium.com/@flame.zaxaou/%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%9B%E0%B8%B4%E0%B8%94%E0%B9%83%E0%B8%8A%E0%B9%89%E0%B8%87%E0%B8%B2%E0%B8%99-cloud-speech-api-6b7a05c72752