この記事は、Qiita「Raspberry Pi Advent Calendar 2019」の13日目に参加しています。
GoogleのAIY Voice Kit V2を使って、ボタンを押すと国際宇宙ステーション(以下ISS)を音声で答える仕組みを作ってみました。
Voice KitにはRaspberry Pi Zero WHが搭載されており、プログラムはpythonで書けます。
本記事では、その作り方を紹介します。
動作デモ
AIY Voice Kitの上部ボタンを押すと、声でISSがどこの国の上空にいるかを答えます。
地球の約70%は海なので、海上名を聞くことが多いです。
- 地図と見比べたい際は、下記ESA(欧州宇宙機関)のWEBサイトで確認できます。
(現在地の地図を見られます)
処理の流れ
おおまかな処理の流れを図にしました。
無料のWEBサービスをハシゴしています。
- スピーカーやLEDなどハードのコントロールはVoice kit備え付けのPython ライブラリー
- ISSの座標受け取りや地名変換、翻訳は無料のAPI
- 日本語発声はOpen JTalk
詳細は、後程紹介します。
ハードは、GoogleのAIY Voice Kit V2を使います
ハードは、GoogleのAIY Voice Kit V2を使います。
これはスマートスピーカーの製作キットで、以下のようなハードがセットになったものです。
- ラズベリーパイ(Raspberry Pi Zero WH)
- 音声処理基板(スピーカーやマイク付き)
- 段ボール製のケース
その他LED付きスイッチ、それらを動かす為のPythonライブラリもプリインストールされているので、ハードの制御が手軽です。
サンプルコードもAIY 公式githubに複数あり、AIスピーカーを作るハードルが下がる楽しいキットです。 日本でも購入できます。
ちなみに、私が購入したのは2018年です。OSイメージファイルを更新せず古いまま作業したので、もしかしたらこのページのコードでは動かない可能性があります。
また、イメージファイルが古いと不具合(公式マニュアルの通りに動かない等)がありますので、新しいものに更新した方が良いと思います。
最新のイメージファイル更新方法については以下( 見出し:GET THE LATEST SYSTEM IMAGE )をご覧ください。
利用するwebサービス、ソフトの詳細
次に、各工程で使うwebサービス、ソフトの詳細を書きます。
最終的なコードは、記事の最後に置きました。
国際宇宙ステーション(ISS)の座標を取得する
Open APIs From Spaceを使います。ISSの場所を返すAPIで、緯度と経度がJSONで取得できます。
データの処理方法は、ラズベリーパイのチュートリアルページ(Where is the ISS?)でかなり詳しく説明されています。
座標から地名へ変換(Reverse geocoding)
座標は分かりましたが、それが地球上のどこなのかはわかりません。
今度は座標から地名を検索(Reverse geocoding)するAPIを使います。
今回は、GeoNames「Extended Find nearby toponym / reverse geocoding」という無料のAPIを使ってみました。
特徴として、海上でも海名を返してくれます。
データ形式はXMLです。
以下のURLで、データを取得できます。日本語部分には適宜データの数字を入れます。
http://api.geonames.org/extendedFindNearby?lat=緯度&lng=経度&username=ユーザーネーム
陸上と海上で返ってくるデータの構造が違う?ので、分けてデータを取っています。
場当たり的な気がしますが、一度に取る方法がわかりませんでした。
XMLデータの処理は、lxmlというライブラリを使いました。
以下のコマンドで lxml がダウンロードしました。
sudo apt-get install python3-lxml
ちなみに、ラズベリーパイ上でライブラリをダウンロードする際は、「python3-lxml」という名前になるんですね。 「lxml」だとばかり思っていて、延々とエラーを眺めていました。
地名を日本語に翻訳
上記のAPIは英語で結果が返ってくるので、今度は、地名を日本語に翻訳します。
例えば、North Pacific Oceanなら北太平洋という結果がほしいわけです。
そこで、今度はこちらを使います。
apt-getではエラーが出たので、結局以下のコマンドで入手しました。
sudo python3 -m pip install googletrans
上記サイトによると非公式なライブラリらしいので、正式に使いたい場合はgoogleの有料APIを使ってください。
私は前作ではMicrosoft azureを無料枠で使いましたが、今回の用途では使うのが面倒なのでサクっと使えるこちらをつかってみた次第です。
結果を音声で出力
地名まで取得出来たら、それを変数に渡して発音してもらいます。
Google AIY Voice Kit 2.0には備え付けの発話機能がありますが、英語のみです。
日本語で答えてもらうために、Open JTalkというソフトを使います。
▼長くなるので、導入方法は別の記事にまとめています。
書いたコード
ファイル構成
主要ファイルの構成(置き場所)は、以下の通りです。
- ~/AIY-projects-python/src/aiyには、ハードの制御のためのファイルを入れる
- voicehay.py:プリインストールされているはず。
- leds.py:私の環境では入っておらず。その場合はgithubから入手できるので、後から入れればOKです。
- jtalk.py:言葉を日本語発話ソフトOpen JTalkに渡すためのファイルです。
- ~/AIY-projects-python/src/examples/voiceには、今回の機能を実行するために書いたファイルを入れる
- talk_location.py:最終的に実行するファイル。iss_geo.pyなど細かい処理はモジュールとして呼び出して使ってます
- iss_geo.py:座標取得から地名翻訳までの一連の処理をまとめたファイル
talk_location.py 最終実行ファイル
- 座標取得から地名出力までは、別ファイル( iss_geo.py )にしてあります。
- このファイルを実行してボタンを押すと、「国際宇宙ステーションは、XXの上空に居ます」と声が出ます。
- LEDはボタン待機中は点灯し、ボタン押下後は声が出るまで点滅します。
- サンプルファイルのcloudspeech_demo.py をベースにコードを書きました。
#実行時は、ファイルを置いたvoiceフォルダに移動して
cd ~/AIY-projects-python/src/examples/voice
#下記コマンドで実行しています。
python3 talk_location.py
iss_geo.py ISSの座標取得から地名出力まで
さいごに
今回はcloudspeechもassistantも使っておらず、せっかくのAIスピーカーキットなのに勿体なかったかもしれません。
でもハードが一式揃ったキットのおかげで、思い付きの遊びを手早く実現できるのが爽快でした。
準備が長くなると、もういいかと熱が冷めてしまいがちなので……。