ボタンを押すと、国際宇宙ステーションの場所を音声で答える仕組みの作り方

小物

この記事は、Qiita「Raspberry Pi Advent Calendar 2019」の13日目に参加しています。

GoogleのAIY Voice Kit V2を使って、ボタンを押すと国際宇宙ステーション(以下ISS)を音声で答える仕組みを作ってみました。

Voice KitにはRaspberry Pi Zero WHが搭載されており、プログラムはpythonで書けます。

本記事では、その作り方を紹介します。

ちなみに……

この記事は、以前作ったものの改造版です。
前作は「『ISSはどこ?』と人が呼びかけたら音声で答える」というものです。

今回はトリガーを呼びかけではなくボタンの押下にしたり、利用するAPIを少し変えました。

動作デモ

AIY Voice Kitの上部ボタンを押すと、声でISSがどこの国の上空にいるかを答えます。
地球の約70%は海なので、海上名を聞くことが多いです。

大き目の音が出ます。ご注意下さい。

  • 地図と見比べたい際は、下記ESA(欧州宇宙機関)のWEBサイトで確認できます。
    (現在地の地図を見られます)
Where is the International Space Station?

処理の流れ

おおまかな処理の流れを図にしました。

無料の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 )をご覧ください。

参考 GET THE LATEST SYSTEM IMAGE

利用するwebサービス、ソフトの詳細

次に、各工程で使うwebサービス、ソフトの詳細を書きます。
最終的なコードは、記事の最後に置きました。

国際宇宙ステーション(ISS)の座標を取得する

Open APIs From Spaceを使います。ISSの場所を返すAPIで、緯度と経度がJSONで取得できます。

Open Notify

データの処理方法は、ラズベリーパイのチュートリアルページ(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なら北太平洋という結果がほしいわけです。

そこで、今度はこちらを使います。

googletrans
Free Google Translate API for Python. Translates totally free of charge.

apt-getではエラーが出たので、結局以下のコマンドで入手しました。

sudo python3 -m pip install googletrans

上記サイトによると非公式なライブラリらしいので、正式に使いたい場合はgoogleの有料APIを使ってください。
私は前作ではMicrosoft azureを無料枠で使いましたが、今回の用途では使うのが面倒なのでサクっと使えるこちらをつかってみた次第です。

結果を音声で出力

地名まで取得出来たら、それを変数に渡して発音してもらいます。

Google AIY Voice Kit 2.0には備え付けの発話機能がありますが、英語のみです。
日本語で答えてもらうために、Open JTalkというソフトを使います。

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:座標取得から地名翻訳までの一連の処理をまとめたファイル
Voice kit内のファイル構成

talk_location.py 最終実行ファイル

  • 座標取得から地名出力までは、別ファイル( iss_geo.py )にしてあります。
  • このファイルを実行してボタンを押すと、「国際宇宙ステーションは、XXの上空に居ます」と声が出ます。
  • LEDはボタン待機中は点灯し、ボタン押下後は声が出るまで点滅します。
  • サンプルファイルのcloudspeech_demo.py をベースにコードを書きました。
#実行時は、ファイルを置いたvoiceフォルダに移動して
cd ~/AIY-projects-python/src/examples/voice
#下記コマンドで実行しています。
python3 talk_location.py
ファイル実行中のSSH画面
↑ファイル実行中のSSH画面( Tera Term を使っています)

iss_geo.py ISSの座標取得から地名出力まで

さいごに

今回はcloudspeechもassistantも使っておらず、せっかくのAIスピーカーキットなのに勿体なかったかもしれません。
でもハードが一式揃ったキットのおかげで、思い付きの遊びを手早く実現できるのが爽快でした。
準備が長くなると、もういいかと熱が冷めてしまいがちなので……。

タイトルとURLをコピーしました