Google Homeの入力結果をPythonで取得する方法を書いています。今回の例では、「OK Googgle、フォルダーからXを見つけて」というと、フォルダ内の"X.png"を表示する方法を説明します。処理の流れは以下のようになります。
- Google Homeで取得した文字列をIFTTT(アプリ)でGoogleスプレッドシート(Googleアカウントに紐づいたエクセルみないなもの)に書き込む。
- PythonでGoogleスプレットにアクセスし、更新されていた場合、追加された文字列を取得する。
開発環境
OS:Windows8(64bit)
Python:3.5
Google Home:セットアップ済
Google Homeで取得した文字列をIFTTTでGoogleスプレッドシートに書き込む
スプレッドシートに書き込むのにIFTTTを使います。IFTTTについて知りたい方はこちらを参考にしてください。今回は、アカウント登録を終了し、Googleアカウントと紐づいていることを前提に進めていきます。
参考:Qiitaへの投稿をIFTTT経由でFacebookとTwiiterに通知する(初心者向け/詳細手順あり)
thisの設定
google assistant→Say a phrase with text ingredientと順番に選択し、以下のように設定する。
What do you want to say?:フォルダから $ を見つけて
What do you want the Assistant to say in response?:フォルダから $ を探します
Language:Japanese
create triggerを選択し、thisの設定終了
thatの設定
アプリ:Google Sheetsを選択し、以下のように設定する。
Spreadsheet name:GoogleHomeTest
Formatted row:{{TextField}}
Drive folder path:Google/
これでアプリを作成すると、登録したGoogleアカウントのスプレッドシート上にGoogleHomeTestというファイルが作成され、コマンドを実行する毎に単語が追加されていきます。
PythonでGoogleスプレットにアクセスし、更新されていた場合、追加された文字列を取得する
IFTTTを用いることで、Googleスプレッドシートに探したい画像の名前を登録しました。次に、登録した単語Xを取得し、X.pngを表示するプログラムの説明をします。Googleスプレッドシートへの基本的なアクセス方法は、[Python] Google SpreadSheetをAPI経由で読み書きするを参考にしました。
ソースコード全体は、一番下に置いたのでポイントに置いたので、残りのポイントだけ説明します。
- スプレッドシートの更新毎に一番下の単語を取得しています。注意点として、IFTTTでスプレッドシートを作成した場合、カラム数が確保されたシートができますので、ブラウザ上で空カラムを除去してください。プログラムではカラム数が変化したときのみ単語を取得する構造だからです。
- 画像を表示するのにopenCVを使っていますが、openCVで日本語のファイル名を扱えないので、画像をファイル名'tmp.png'としてコピーして処理しています。 以上により、準備完了表示後に、「OK Googgle、フォルダーからXを見つけて」というと、指定フォルダ内の"X.png"を表示してくれます。
感想
- 「OK Google~」と言い終わってから画像が表示されるまで5秒ぐらいかかりますので、適用アプリは限られているという印象です。(もっと早くする方法あったら教えてください。)
- 柔軟に日本語処理をしたいなという欲が高まりました。例えば、「いぬ」というと「犬」と変換されるので、「いぬ.png」を見つけることができません。
- 今回、画像表示にGoogle Homeを使いましたが、他のアプリも作っていきたいと思います。
import json
import gspread
import oauth2client.client
import cv2
import time
import os
import shutil
def display_japnese_name_img(img_name):
tmp_name = 'tmp.png'
shutil.copy(img_name,tmp_name)
img = cv2.imread(tmp_name)
cv2.imshow('', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
os.remove(tmp_name)
if __name__ == '__main__':
img_folder = 'img'
# authorize
json_key = json.load(open('GoogleHomeTest.json'))
scope = ['https://spreadsheets.google.com/feeds']
credentials = oauth2client.client.SignedJwtAssertionCredentials(json_key['client_email'],json_key['private_key'].encode(), scope)
gc = gspread.authorize(credentials)
print('準備完了:お探しの画像を言ってください')
previous_length = -1
current_length = -1
while 1:
wb = gc.open("GoogleHomeTest")
worksheet = wb.sheet1
val_list = worksheet.col_values(1)
current_length = len(val_list)
if (current_length != previous_length)&(previous_length>0):
action = val_list[-1]
print(action+'を探しています')
img_name = img_folder + '\\' + action+'.png'
if (os.path.exists(img_name)):
print('画像が見つかりました')
display_japnese_name_img(img_name)
else:
print('画像が見つかりませんでした')
previous_length = current_length
time.sleep(0.5)