日本語でGoogle AIYボイスキットとカメラで画像認識のプログラムを作ってみた【Google API多用】

ラズベリーパイ
この記事は約16分で読めます。

さて先日より、以前購入したGoogle AIY Voice Kitにカメラモジュールをくっつけて、カメラで撮影された画像を認識させるプログラムを動かしていましたが、今まで使っていたものだと日本語に対応するには限界があったので、思い切ってプログラムを自作してみました。

自作といっても、頭脳のほとんどは各種Google APIに頼っているんですけれどね。本日は、日本語化した画像認識プログラムのお話です。

何ができるの?

インスパイアされたプロジェクト

今回のプログラムは基本的に前回の記事でも紹介したリズ・マイヤーさんのプロジェクトにインスピレーションを得ています。できることは、リズさんのものとほとんど変わりないです。

Add Vision to the AIY Voice Kit
This project uses the Google Vision API to describe things, identify logos, and read text aloud. By Liz Myers.

ただし、リズさんのだと日本語での対応には限界がありました。具体的には、

  • 日本語で音声が発声されない
  • 画像認識した結果が英語で出力されてしまって日本語にできない

等の問題がありました。

プログラムの構造

そこで、今回のプログラムでは、各種Google のAIのAPIを駆使して、日本語での結果出力および発声を可能にしました。具体的には以下の手順を踏んでいます。

  1. ボタンを押すことで対象画像の撮影を行なう
  2. Google Cloud Speech APIで音声認識(日本語等)を行ない、テキスト変換をする
  3. 認識した音声の内容で画像処理の方法(物体認識、ロゴ認識、テキスト認識)を判断する
  4. Google Cloud Vision APIで、撮影した画像の認識を行なう
  5. Google Translate APIで、画像認識の結果を返してきた英語を日本語(や他の言語)に翻訳する
  6. Google Texttospeech APIで翻訳されたテキストを音声で読みあげる。

プログラムの実行画面をビデオで見る

細かいことを言っても何ですので、使っている様子をビデオにアップしてみました。使用中のパソコン画面をキャプチャ―した動画ですが、実際にはスピーカーに向かって本やおもちゃをかざしながらお話しています。カメラの画像はVNC接続で見て、コマンドはSSH接続で操作しています。

上のビデオではテキスト認識を中心にしていますが、暗い部屋で撮影していて、ビデオ画像が鮮明でないこともあり、小さい文字のテキスト認識の精度はそんなに高くないです。ですが、明るい部屋できちんと焦点が合う位置に物体を置いて、テストをすれば精度はかなり上がると思います。

プログラムが動くための前提条件

今回作成したプログラムが動くには、Google Voice Kit V1を購入し、かつラズパイのカメラモジュールを増設している必要があります(Voice Kit V2での動作は確認できていません)。

Google Voice Kitがある

まず大前提として、Google Voice Kitがラズパイに取り付けられている必要があります。

Google Voice Kitの組み立て方についてはこちらの記事を、OSのインストール等についてはこちらの記事を、Google Assistant APIの設定についてはこちらの記事もご参照ください。

というわけで、Google Voice Kitを組み立てて設定し、付属のデモプログラムつまり

cd /home/pi/AIY-projects-python/src/examples
./voice/assistant_grpc_demo.py

こちらを動かして、ボタンを押して、「こんにちは」等と話しかけると反応がある、いわゆるグーグルホームが動いていればOKです。

カメラモジュールの増設

さらに、グーグルボイスキットにカメラモジュールが増設されている必要があります。

ラズパイのカメラモジュールの増設については、こちらの記事もご参照ください。

グーグルボイスキットにPiカメラが増設できたら、念のため、カメラの映像がきちんと撮影、保存されるか確認しておきましょう。このコマンドを打って…

raspistill -rot 180 -o /home/pi/Pictures/testimg.jpg -w 640 -h 480

Picturesのフォルダ内にtestimg.jpgという画像ファイルがきちんと保存されていればOKです。

下ごしらえ

画像が常時表示される状態にする

このプログラムではボタンが押された際の画像が使用されるのですが、ラズパイ上では常に画像がプレビューされた(ビデオみたいな)状態を継続させていきます。そのためには、本プログラムを走らせる前に

raspistill -o /home/pi/aiyimage.jpg -s -t 0 -rot 180 -w 640 -h 480 --preview 500,90,640,480

と入力すると、画面の一角に常にビデオ映像のような感じで表示が始まります。

ただ、毎回プログラムを実行する前に、このコマンドを打つのは面倒~という場合には、ラズパイ起動時に自動的に撮影が始まるよう設定しておくことができます。具体的にはCrontabを開いて…

crontab -e

テキストの末尾に以下を加えます。

@reboot raspistill -o /home/pi/aiyimage.jpg -s -t 0 -rot 180 -w 640 -h 480 --preview 500,90,640,480

今回は/home/piフォルダの直下にaiyimage.jpgという画像で常時表示される設定になっています。

上記のプロセスの切り方(常時カメラが写っている状態をやめる)等の方法につきましてはこちらのページもご参照ください。

常に画像が表示されていると他の作業がしにくいため、私はVNC接続でカメラ画像を確認しつつ、SSH接続でコマンド等の入力を行なっています。

Google各種APIの有効化

次に、今回使用するGoogleの各種APIの有効化を行ないます。具体的な手順につきましては、Cloud Speech API(Cloud Speech-to-Text API)を有効化した下記の過去記事もご参照ください。

【Google AIY Voice Kit】課金されちゃう?Cloud Speech APIで登録
次は、Google Cloud Platform上で、Google Cloud Speech APIを登録します。付属の冊子の第6章にあたります。

具体的には、Google Cloud Platformへ行き、プロジェクトを作成するか、既存のプロジェクトに認証情報を追加し、jsonファイルをダウンロードし、好きな名前にリネームして、ラズパイのpiフォルダ直下に置いておきます(たぶん場所は指定するのでどこでも良いと思いますが…)。私は既に以前にCloudSpeechAPIを使うために作ったVoice kitのプロジェクト上に追加する形にしました。

そして、Google Cloud Platformのライブラリにて以下のAPIを全て有効化させます。各APIの詳細についてはリンク先のGoogle ドキュメントをご参照ください。

課金に注意

なお、このプログラムを使用する際に、1点注意したい点があります。

それは、Google APIを多用しているので油断していると課金される可能性がある点です。

とりわけネックなのは、Cloud Speech-to-Text APIで、人間のコマンド(音声)をキャッチして認識するパーツです。ここが時間課金で、最低15秒からのカウントになり、無料分は月々60分間までとなっています。これ、気が付くと超過します。

一方で、初めてGoogle Cloudサービスを使用する場合は、1年間300米ドル分まで無料という特典が付いてくるので、その範囲内では全く問題ないでしょう。

ですが、私の場合、300米ドルの無料枠はとっくの昔に切れてしまっていて、それでもかまわずいろいろ使っていたら、先月は80円くらい課金されていて驚きました。

たかが80円、そうですよね。サービス使っているんですものね、ケチくさくてスミマセン。でも、知らずに課金されていたらちょっとショックですよね。

なので、新規アカウントで1年間300米ドル無料枠を使用するか、時間を気にしながら使うのが無難と思います。

Google各種APIのインストール

次にラズパイに、各種APIのインストールをします。具体的には以下のコマンドを打ちます。

AIY-projects-shell.sh
pip3 install --upgrade google-cloud-texttospeech google-cloud-speech google-cloud-vision 
pip3 install google-cloud-translate==2.0.0

なお、音声の再生には、wavファイル(起動音)の再生にaplay、mp3ファイル(発声)の再生にはmpg321を使用しています。既にOSに入っていると思いますが、ない場合はこちらもインストールしておきましょう。

aplay --version
mpg321 --version

としてそれぞれバージョンが表示されるならインストール済です。

認証を読み込む。起動時に自動的に読み込むことも

今回のプログラムを実行する前には、グーグルの認証情報(json)を読み込む必要があります。具体的には…

export GOOGLE_APPLICATION_CREDENTIALS="/home/pi/設定した認証情報の名前.json"

と入力する必要があります。

ですが、毎回やるのが面倒な場合は、

nano ~/.profile

を立ち上げてテキスト末尾に

export GOOGLE_APPLICATION_CREDENTIALS="/home/pi/設定した認証情報の名前.json"

と入力しておくと、起動時に自動的に読み込まれるので、プログラムを実行するだけでOKになります。

プログラムの実行

GitHubからクローンする

次にプログラムを以下のGitHubからクローンしてきます。

cd /home/pi/
git clone https://github.com/kureuetan/Image_Recognition_PiCamera_Google_AIY_Voice_Kit.git

今回、当方クレウエタンのアカウントで初めてGithubを使用してみました。今までクローンやテスト利用程度でしか使用したことがなかったので、ちょっとドキドキしながらファイルをアップ。Readmeとかまだ全然かけていませんが、時間ができたら追加したいと思います。

好きなフォルダにファイルをコピー

クローンしてきたファイルは、Examples直下に新規ディレクトリ(たとえばimageRecognition)を作成して入れておきます。場所は別にどこでも大丈夫なようですが。

cp /home/pi/Image_Recognition_PiCamera_Google_AIY_Voice_Kit /home/pi/AIY-projects-python/src/examples/imageRecognition -r

先に説明したように、.profileでグーグルの認証情報をエクスポートする設定をしていない場合は、今行ないます。

export GOOGLE_APPLICATION_CREDENTIALS="/home/pi/登録した認証情報の名前.json"

こうして、コピーしたファイルのあるフォルダに移動して、vision_recog_with_button.pyを実行すれば、プログラムが始まります。

cd /home/pi/AIY-projects-python/src/examples/imageRecognition
./vision_recog_with_button.py

いざプログラムを実行すると…

実行すると、「ボタンを押して~」という音声とともにターミナル画面には、有効なコマンド一覧がテキストで表示されます。基本的にこのコマンド群が認識されます。

そこで、ボイスキットのボタンを押します。

一番下のテキスト「Start listening」というテキストが表示されると、音声認識が開始されますので、「これは何ですか」などのコマンドをスピーカーに向けて言ってみてください。

「結果は以下のとおりです…」と画像解析の結果がスピーカーから音声で流れるようになっています。

プログラムを終わりにするときには、ボタンを押して、「ありがとう」「さようなら」等のコマンドを言うと終了します。もちろん、Ctrl +Cで途中で終わらせることも可能です。

プログラムは以上です。

その他のメモ

タイムラグが気になる場合は電子音を消してみる

ボタンを押した際には電子音がポーン!と鳴りますが、その分、ボタンを押してからのコマンドの認識に多少のタイムラグが生まれるので、気になる人は電子音が鳴るのを消して(#マークを追加して)みてくださいませ。

具体的には、vision_recog_with_button.pyのファイル中の以下の箇所の冒頭に「#」マークをつけてあげると、ボタンを押した後の電子音が鳴らなくなり、タイムラグも感じられなくます。

# subprocess.run(['aplay', './button_sound.wav'])

画像の保存先を変える場合

なおデフォルトでは、 カメラの画像は”/home/pi/aiyimage.jpg”というファイルに常時保存されるようになっていますが、このファイルパスやファイル名を変更したい場合は、先のCrontab上での変更と同時にvisionRecog.pyのgetImage関数中の

file_name = "/home/pi/aiyimage.jpg"

ここのファイル名を変更します。

日本語、スペイン語、英語に対応(多言語の追加可)

なお、当初は日本語に特化したプログラムにしていたのですが、どうせなら汎用性があった方が良いかなと思い、英語、スペイン語にも簡単に切り替えられるようになっています。

これは、vision_recog_with_button.pyのファイル内の

# if you use the English version
# vision_recog = VisionRecog()
# if you use the Spanish version
# vision_recog = VisionRecog('es','es-ES')
# if you use the Japanese version
vision_recog = VisionRecog('ja','ja-JP')

この箇所の#マークを適宜つけたり外したりして変更します。今は日本語版になっていますが、vision_recog = VisionRecog(‘ja’,’ja-JP’)の冒頭に#を入れる代わりに、# vision_recog = VisionRecog()の#を外すと英語版に切り替わります。

また、この3か国語以外にも、上のコードの(‘ja’,’ja-JP’)部分を他の言語(’ja’部分はこちら、’ja-JP’部分はこちらのコード表参照)に変更したうえで、word.py上にある辞書に他の言語のコマンドを追加することで簡単に対応できるようになっています。

また、コマンドの日本語の表記もword.pyで編集できます。

今後の課題

以上、グーグルのボイスキットとラズパイのカメラモジュールを使用して、グーグルの人工知能さんの知恵をお借りした画像認識プログラムを作成してみました。

自分でうーんとかあーとか考えながら、プログラムを書いてみるのって本当に頭のトレーニングになるなぁと実感しました。

今後の課題としては以下の通りです。

音声での呼びかけ(ホットワード)に対応したい

今はボタンを押して、コマンドを言う形になっていますが、これをホットワードで、「ねぇグーグル」とか「どらえもん!」とか言葉で呼びかけてコマンドを言う形にも対応できればと思っています。

実際、手元にはSnowboyという仕組みを使って対応済みのプログラムがあるのですが…。どうも、Snowboyのインストールが煩雑というか、同じ現象を再現できたりできなかったりするので、皆さんに公開してもいろいろトラブルが発生しそうなので、今回はやめました。でも、今後挑戦していきたいです。

グーグルAPIに頼りすぎるのはちょっと…

今回はグーグルAPIに頼りまくったプログラムになりました。確かに便利なんですが、ネックなのは課金です。とりわけ、こちらの発声する音声を認識する時間…にお金がかかりがちなのです。なので、せめて音声をキャッチし、テキスト化する場面だけでも、ローカルでやった方が良い気がしました。上でも触れたSnowboyを使うというのは一つありかなと思うのですが、もう少し何かないか考え中(探し中)です。

まとめ

というわけで、まだまだ課題もたくさんありますが、これからも楽しいプロジェクトにトライしていきたいと考えています。

 

コメント