PR

「国際宇宙ステーションは今どこ?」話しかけると、場所を音声で答えてくれる。AIY Voice Kit 2.0を使った製作方法を説明します

電子工作など

「国際宇宙ステーションはどこ?」と声をかけると、位置を声で教えてくれる仕組みを作ってみました。日本語で答えます。
スピーカーはGoogle AIY Voice Kit 2.0を使いました。

Google AIY Voice Kit 2.0にはラズベリーパイが搭載されていますので、プログラムはPythonで組むことができます。

スポンサーリンク

作ったモノ

「国際宇宙ステーションはどこ?」と声をかけると、どこの上空を飛んでいるかを声で教えてくれます。

「”太平洋”の上空を飛んでいます」・・・といった具合です。

陸上なら国名、海上なら海の名前を答えるように作っています。
動画では陸上の場合は国名までを答えていますが、市街地名を答えるようにもできます。 .

テスト動画

▼ ちなみにリアルタイム位置の地図画像は、下記NASAのWEBページで見られます。

処理の流れ

処理の流れを図にしてみました。

複数のAPIを利用して、データを取得していきます。
後述しますが、陸上と海上では、別のAPIを使います。

「国際宇宙ステーションはどこ?」スピーカーに聞くと、場所を答えてくれる仕組み

この記事では以下のスピーカーを使う前提です。

まず、スピーカーはGoogle AIY Voice Kit 2.0を使う

スピーカーはGoogle AIY Voice Kit 2.0を使いました。
これは、スマートスピーカーの製作キットで、ラズベリーパイ(PC)、スピーカー、マイク、段ボール製のケースがセットになったものです。

バラで色々とパーツを集めるよりは、とても手軽に環境が構築できます。

サンプルコードがAIY 公式githubに複数あり、AIスピーカーで何かを作るハードルがとても低くて楽しいです。

▼アマゾンで購入できます

では、各処理の詳細を以下に書いていきます。

処理の詳細

APIを利用する際は、思わぬ課金とAPIキーの管理にご注意ください。
後述していますが、ほとんどは一定無料で使用量に応じて、課金されます。
APIキーはパスワードのようなもの。公開してしまうと勝手に使われてとんでもない課金が・・・という恐れがあります。

日本語音声を聞き取る&発音する

Google AIY Voice Kit 2.0では、英語が標準です。
AIスピーカーに日本語を聞き取らせて、日本語で答えてもらうには一手間が必要です。

▼長くなるので、別の記事にまとめました。

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

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

Open APIs From Spaceを使います。

使い方は、ラズベリーパイの公式サイトで詳しく解説されています。

コード

後でシンプルに呼び出せるよう、関数にしておきました。
そして、戻り値は(緯度,経度)という形にします。

座標から、地名を割り出す(逆ジオコーディング)

座標から地名を求めるのを、逆ジオコーディング(Reverse geocoding)と言うんですね。
今回の目的を実現すべく検索していて、初めて知りました。

それも、WEB上のサービスで何とかなりました。

Google Maps ServicesのGeocoding APIを使います。

python用クライアントが用意されています。

利用規約を確認

利用規約に注意して下さい。
数年前は、「ジオコーディングした結果はGoogle Mapとセットでしか使ってはいけません」という決まりがあったようです。

しかし2018年11月現在は、大丈夫です。

規約ページの文章を引用します。

You can display Geocoding API results on a Google Map, or without a map. If you want to display Geocoding API results on a map, then these results must be displayed on a Google Map. It is prohibited to use Geocoding API data on a map that is not a Google map.

Geocoding API Policies (2018/11/10アクセス)

Geocoding API Policies (2018/11/10アクセス)

日本語にすると以下のような意味なので、今回の使用には問題ないと判断しました。

「ジオコーディングAPIの結果は、Googleマップ上か、地図なしで表示できる」
「結果を地図に表示する場合は、Googleマップ上で表示しなさい。他の地図上にデータを使用するのはダメ」

コード

市街地の詳しい住所まで出せます。
今回の製作物には必要ありませんので、サンプルコードをベースに、「国名まで」を取得するコードをかきました。

地名は日本語で返してもらうことが可能です。(15行目のlanguage=”ja”で指定)

後述しますが、海上では地名が取れません(NONEとでる)。
その場合は元の座標値を戻り値として返すようにしています。

今回の製作物がこれでほとんど解決してしまいました。

問題発生?

しかし。ここで、少し問題が発生しました。
このAPIでは、陸上の地名しか割り出せません。
座標が海上だと、「None」という結果が返ってきます。

地球の約70%は海ですから、ほとんどデータを取れない・・・という事になってしまいます。

そこで、別のAPIを使います。

海の名前を割り出す

海の名前を割り出すのに、ちょうどよいWebサービスがありました。
・・・ちょうどよいの一言では済ませられないくらい、ドンピシャなサービスでびっくりしました。

ページ中ほどの「Ocean / reverse geocoding」に詳しい説明があります。

使い方

以下のURLで、データを取得することができます。
日本語部分は、適宜情報を入力して下さい。

  • 緯度
  • 経度
  • ユーザ名:ユーザ登録が必要です

http://api.geonames.org/ocean?lat=緯度&lng=経度&username=ユーザ名

▼ユーザー登録はここからできます。
なお、登録後にメールアドレス変更や削除ができないようです。心配でしたら差し支えないアドレスで登録して下さい。

ここで、試しに緯度と経度に「0(ゼロ)」を入れてブラウザ(Chrome)でアクセスしてみました。

すると、こんな情報が出力されました。


{"ocean": {
"distance": "0",
"name": "North Atlantic Ocean"
}}

あとはpythonのプログラムで”name”のデータを取りに行けばいいだけです。

コード

こんな感じのコードでデータが取得できました。
流れとしては、下記ステップでデータを取ります。

  1. サンプルのデータ取得URLを示す。それを分解して、クエリとして扱えるようにする
  2. 緯度と経度クエリに、ISSの座標データを格納する
  3. 新しいURLを出力する
  4. ”name”項目のデータを取得する

海の名前を日本語に翻訳する

海の名前は、英語で返ってきます。
それを日本語に翻訳します。

翻訳サービスは色々ありますが、今回はMicrosoft Azureのサービスを使ってみました。

基本的には有料なのでご注意下さい。
使用量によって課金されます。2018/11/4現在、毎月 200 万文字までは無料です。

Python上で使う際のサンプルコードが用意されています。

コード

最終プログラム(python)

ファイル構成

今回のファイル構成を、下図にまとめました。

細かい処理が多く、一つのファイルに書くと個人的に混乱します。ですので、機能ごとにモジュールとして呼び出すようにしました。

各コード

実際のコードを貼っておきます。

cloudspeech_iss.py(実行するファイル)

これを実行すると、Voicekitのボタン押下待機状態になります。
「国際宇宙ステーションは今どこ」と問いかけると、場所を返答します。

iss_geo.py

ISSの場所(国名or海名)を求めます。
同ディレクトリに置いたgeo_module.pyの関数を実行しています。

geo_module.py

ISSの座標取得、ジオコーディング、翻訳までの細かい関数を集めたファイル。
iss_geo.pyから呼び出して使います。

jtalkは過去記事参照

さいごに

思いつきでふと始めましたが、ハードはキットを使ったのでストレスがありませんでした。
ラズベリーパイ(PC)を買って、次はスピーカーを・・・と一つ一つ揃えていたら多分めんどくさくなっていそうです。

Voicekitはスマートスピーカーの製作キット。
ラズベリーパイ(PC)、スピーカー、マイク、段ボール製のケースがセットになっていて、
バラで色々とパーツを集めるよりは、とても手軽に環境が構築できます。

▼ セットアップ方法も、公式サイトが豊富な写真と簡易な英語でわかりやすいです。

▼ Voicekitは、amazonで購入できます。

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