【コラボ企画】Raspberry Pi 愛に溢れるラズパイダのご訪問者に向けて新型Raspberry Pi 4Bのセット品をプレゼント!——クリックして特集記事へ

ラズパイとAmazonアレクサを連携してAlexa Gadgetを使う

Amazon
この記事は約17分で読めます。

ここではssh経由でMacのターミナルを使いRaspberry Pi 3B+にインストールされたRaspbianへ必要なソフトウェアやライブラリをインストールします。(※Busterでもイケました!)

GUI環境のデスクトップからインストールする場合はZIPファイルをダウンロードすることになります。詳しくはAlexa-Gadgets-Raspberry-Pi-SamplesページのUsing GitHub Web UIの項目をご覧ください。

推奨されている環境はRaspberry Pi 3B+と最新のRaspian Stretchと記載されていました。

今回は、手持ちの関係で、GUIがあるデスクトップ環境があるRaspbian(Raspbian Buster with desktop)にインストールし実行してみました。

スポンサーリンク

Alexaサービスに登録する

Alexa Voice Serviceというものがあります。

これを利用してAlexa gadgetと呼ばれるプログラムを用意することで、アレクサからRaspberry Pi 3B+を制御することが可能になります。

Alexaにはスキルというのがありますが、それよりも単純に機能を割り当てることが可能(のよう)です。

Alexa音声サービス(AVS)を使用して、Alexaを直接お客様の商品に統合します。 お客様のチームはハードウェアを選択して体験を設計し、AVSは自動音声認識、自然言語の理解、Text-to-Speech(テキスト読み上げシステム)エンジン、API、ハードウェアキット、ソフトウェアツールおよび資料を提供します。

Alexa音声サービス開発者コンソールへようこそ

アカウントは無料で取得できます。先ずはアカウントを登録してから次へ進んでください。

製品を登録する

実際にRaspberry Pi 3B+へ機能を持たせるため、Alexa音声サービスに製品として登録します。

日本語で製品というと堅っ苦しいですが、要はプロジェクトみたいなものです。

右上の青いボタン「製品を作成する」から登録していきます。

赤い米印のボックスを埋めていきます。

その中で製品タイプの選択があり「Alexaガジェット」を選んでください。

続いて、後半部分も埋めていきます。

金魚の自動餌やり機なんて子供向けなんだけど、子供向け商品として登録すると怒られました・・・。

なんかよく分からないけど、ムリっぽいので、子供向けではない!ということにしました。

そしてすべて完了すると、

にされています??

順次日本語化を進めているそうなんで・・・蝋だから・・・Waxなのか? いや、ワックスでも意味が通らないか・・・。

はい。理解します! 成功したことには間違いない。

これでAlexa音声サービス(AVS)の設定は終わりです。
次からはRaspberry Pi 3B+側のインストールと設定です。

Alexa-Gadgets-Raspberry-Pi-Samplesのダウンロード

ここからはSSH接続でMacのターミナルから作業しています。Windowsの人はPuttyが良いでしょう。

GitHubからクローン(ダウンロード)する

git clone https://github.com/alexa/Alexa-Gadgets-Raspberry-Pi-Samples.git

ホームフォルダにダウンロードしたので、移動してみてみます。

cd /home/pi/Alexa-Gadgets-Raspberry-Pi-Samples/

サンプルは/src内にあります。

Samples直下にあるセットアップスクリプトを実行します。

sudo bash ./setup.sh

インストール成功ではSUCCESSと表示されます。

AmazonIDとシークレットパスワード

実行するとAmazonIDとシークレットパスワードを聞かれます。

先に登録していた製品情報にあるIDとパスワードを入力します。

ちなみにIDなどはalexa voice serviceにある製品情報に記載されています。

設定が済んでいない人は前回の記事「Alexaのスキル作成支援にRaspberry Pi でPythonベースのソフトウェアとサンプルプロジェクトを利用する」を参考にしてください。

実行方法

このPythonソフトウェアは、EchoデバイスへのガジェットのBluetooth接続を処理し、指定したAlexa Gadget Toolkit機能に基づいてメッセージに応答することにより、Alexaガジェットを作成します。

実行にあたり設定が必要です。

サンプルを含む作成する各ガジェットには、Alexa Voice Service Developer Consoleで作成したAmazon IDとAlexa Gadget Secretを指定する設定ファイルと、ガジェットの機能の仕様が必要です。

kitchensinkガジェットの場所は以下です。

~/Alexa-Gadgets-Raspberry-Pi-Samples/src/examples/kitchensink

各例には、この情報を含む.iniファイルがあります。 たとえば、kitchensinkガジェットの構成は次のようになります。

kitchensinkフォルダには以下の3つのサンプルファイルがあり、同じ階層(フォルダ)に設定用のiniファイル、Pythonスクリプトの定義ファイルの2つを作成し配置します。

そういうルールですが、画像のようにインストール時点でiniファイルとPythonスクリプトは既に存在しています。Pythonスクリプトにiniファイルへのパスを定義する必要もありません。

これはサンプルプログラムを元に異なるフォルダへ自ら作成する場合に限り、この2点のルールは抑えないと動きません。

実行に必要なこと

  1. Pythonスクリプトと同じ場所(フォルダ)にiniファイルを配置する
  2. Pythonスクリプト内にiniファイルへのパスを記述する

それぞれ中身を見てみましょう。

iniファイル(kitchen_sink_gadget.ini)

amazonIDとalexaGadgetSecretにはインストール時点で入力した情報が入っています。

Pythonスクリプト(kitchen_sink_gadget.py)

class KitchenSinkGadget(AlexaGadget):
"""
Class that logs each directive received from the Echo device.
"""

冒頭9行目のこの部分に以下のように記述します。(※サンプルプログラムの場合は追記なくOK)

class KitchenSinkGadget(AlexaGadget):
def init__(self): super().__init(gadget_config_path='path/to/config.ini'))

この定義はPythonスクリプトとは別の場所にiniファイルがあれば指定する形になります。

コールバック

各サンプルプロジェクト(ガジェット)では、Echoデバイスが応答するために提供されているコールバックを活用しています。

例えばペアリングされたEchoデバイスに接続するにはon_connected()を使います。

on_connected()

簡単に言えば、実行させた結果を返す関数ということです。デバイスとやり取りするイメージです。コールバック・・・そのままですけど「呼んで返答」だから「折り返し(連絡し)てください」ですね。

詳しくはalexa-voice-serviceのドキュメントで確認してください。

ラズパイダはプログラマーではない非エンジニア向けなので、フォーラムなどでバリバリのプログラマーさんが参加してくれていますから、質問してみましょう!(皆さん、お願いします!)

つまり、こういった組み合わせで出来ているのがPythonスクリプトというわけです。AmazonのIDとシークレットパスワードでEchoデバイスと紐付けられて実行させる仕組みです。

カスタムコールバック

コールバックは独自の物もOKです。

名前決めにルールはあります。接頭語にcustomを付けて以下のルールになります。

on_custom_namespace_name

例文が載っています。

def on_custom_colorcyclergadget_blinkled(self, directive):

このようにカスタムを付け、名前空間がcolorcyclergadget、blinkledが名前になっています。

これで思うように制御できるでしょう(プログラマーではないので詳しい説明は省きます・・・)

既に定義されている組み合わせでも、それなりに動作させられます。

Raspberry Pi 3B+とアレクサをペアリング

アレクサとAlexaGadgetsをインストールしたRaspberry Pi 3B+同志を繋げます。

Bluetoothでペアリングをさせます。

この説明で、EchoShow5を使っている場合、スマホのキャプチャ画面のようにWi-FiやBluetoothの設定項目はありませんでした。

左の画像はスマホのアレクサアプリです。

webの例ではここにBluetoothとかWi-Fiの設定が載っていますが、どうやらEchoShow5の場合は無いみたいです。

恐らくEchoShow5はディスプレイが付いているデバイスですから、EchoShow5側のタッチパネルで設定するようになっていますね。ある意味で簡単です。

これでRaspberry Pi 3B+とEchoShow5が繋がりました。

この「Gadget640」は先程インストールした時点でターミナルに表示されていたものです。Raspberry Pi 3B+というデバイス用の名前になっています。

ペアリングを解除する場合

解除するにはEchoShow5の画面で説明すると、Bluetoothでペアリングしている名前の右側のiマークで次の画面を出し接続解除または削除をタップします。

アレクサgadgetの実行方法

これはPythonを実行する場合と全く同じです。kitchen_sink_gadget.pyなら以下です。

python3 kitchen_sink_gadget.py

ペアリング接続できていて、プログラムにエラーが無ければ実行している状態になり、切っ掛けとなるウェイクワード待ち、指定条件待ちの状態になっています。

ちなみにサンプルプログラムでは何も制御が書いていませんから何も起こりません。実行を辞めたい場合は、コマンドでCtrlCで実行を止めます。

実行させる内容=プログラミング

このようにBluetoothでRaspberry Pi 3B+とEchoデバイスが接続できていれば、先程のPythonスクリプトは実行されています。

kitchen_sink_gadget.pyを見てみると、定義された(def)コールバック関数の箇所に記述していく形になります。

何カ所かに詳しくはとURLアドレスが書かれています。それぞれalexa-gadgets-toolkitのページになっています。

    For more info, visit:
        https://developer.amazon.com/docs/alexa-gadgets-toolkit/alexa-gadge$
#
# Copyright 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
# These materials are licensed under the Amazon Software License in connection $
# The Agreement is available at https://aws.amazon.com/asl/.
# See the Agreement for the specific terms and conditions of the Agreement.
# Capitalized terms not defined in this file have the meanings given to them in$
#
import logging
import sys
from agt import AlexaGadget
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
class KitchenSinkGadget(AlexaGadget):
"""
Class that logs each directive received from the Echo device.
"""
def on_connected(self, device_addr):
"""
Gadget connected to the paired Echo device.
:param device_addr: the address of the device we connected to
"""
pass
def on_disconnected(self, device_addr):
"""
Gadget disconnected from the paired Echo device.
:param device_addr: the address of the device we disconnected from
"""
pass
def on_alexa_gadget_statelistener_stateupdate(self, directive):
"""
Alexa.Gadget.StateListener StateUpdate directive received.
For more info, visit:
https://developer.amazon.com/docs/alexa-gadgets-toolkit/alexa-gadge$
:param directive: Protocol Buffer Message that was send by Echo device.
To get the specific state update name, the following code snippet can b$
# Extract first available state (name & value) from directive payload
if len(directive.payload.states) > 0:
state = directive.payload.states[0]
name = state.name
value = state.value
print('state name:{}, state value:{}'.format(name, value))
"""
pass
def on_notifications_setindicator(self, directive):
"""
Notifications SetIndicator directive received.
For more info, visit:
https://developer.amazon.com/docs/alexa-gadgets-toolkit/notificatio$
:param directive: Protocol Buffer Message that was send by Echo device.
"""
pass
def on_notifications_clearindicator(self, directive):
"""
Notifications ClearIndicator directive received.
For more info, visit:
https://developer.amazon.com/docs/alexa-gadgets-toolkit/notificatio$
:param directive: Protocol Buffer Message that was send by Echo device.
"""
pass
def on_alexa_gadget_speechdata_speechmarks(self, directive):
"""
Alexa.Gadget.SpeechData Speechmarks directive received.
For more info, visit:
https://developer.amazon.com/docs/alexa-gadgets-toolkit/alexa-gadge$
:param directive: Protocol Buffer Message that was send by Echo device.
"""
pass
def on_alexa_gadget_musicdata_tempo(self, directive):
"""
Alexa.Gadget.MusicData Tempo directive received.
For more info, visit:
https://developer.amazon.com/docs/alexa-gadgets-toolkit/alexa-gadge$
:param directive: Protocol Buffer Message that was send by Echo device.
"""
pass
def on_alerts_setalert(self, directive):
"""
Alerts SetAlert directive received.
For more info, visit:
https://developer.amazon.com/docs/alexa-gadgets-toolkit/alerts-inte$
:param directive: Protocol Buffer Message that was send by Echo device.
"""
pass
def on_alerts_deletealert(self, directive):
"""
Alerts DeleteAlert directive received.
For more info, visit:
https://developer.amazon.com/docs/alexa-gadgets-toolkit/alerts-inte$
:param directive: Protocol Buffer Message that was send by Echo device.
"""
pass

詳しくはAlexa Gadgets Toolkit Featuresページでそれぞれのガジェットの定義について調べてください。

Understand the Alexa Gadgets Toolkit | Alexa Skills Kit
The Alexa Gadgets Toolkit enables you to build your own Alexa Gadget. An Alexa Gadget is an Alexa-connected accessory that interacts with compatible Amazon Echo...

最後にまとめ

私自身が非エンジニアなので、プログラミング部分には一切触れていません!(威張るな)

手順を非常に簡潔にまとめます。

  1. Amazonのalexa voice serviceというwebコンソールに登録する
  2. 制御したいRaspberry Pi 3B+にAlexa-Gadgetsをインストールする
  3. iniファイルでAmazonIDとシークレットパスワードでデバイスと紐付けする
  4. EchoデバイスとRaspberry Pi 3B+をBluetoothでペアリング接続する
  5. Pythonスクリプトに実行内容をプログラムしていく

実際には1番〜4番はほぼ1回で済みますから、その後は適当な場所にPythonスクリプトとiniファイルを用意し、それを実行することで実現できますね。

Pythonスクリプトを実行する場合も、これまでのRaspbian同様に起動時に実行させてあげていれば、いちいちコマンドで実行せずとも、アレクサへの切っ掛け待ちということになります。

サンプルプログラムのTimersがサーボモーターを動かす例になっているので、次はこれを使って金魚の餌やりモーターを動かしてみたいと思います。

非常に端折っているかも知れませんが、概ね簡単にアレクサgadgetと呼ばれる機能を実装させることができました。

あとはアイディア次第で、Raspberry Pi 3B+の電子工作などと連携させれば、モニターやマウスはもちろん、離れていても、アレクサへの声かけだけで実行させれらると思います。

以上、Raspberry PiとAmazon Alexaとの連携でした。

Alexa Voice Service
Amazonのクラウドベースのインテリジェント音声サービスで、あらゆるコネクテッドデバイスにAlexaを導入しましょう。
Twitter、フォーラム、メールで購読
それぞれ更新情報をお伝えしています。
皆様のフォローをお待ちしています!
\ FOLLOW ME /
/ 最新記事をお知らせしています! \
Amazon
スポンサーリンク
特集ラズパイ4
フォローをお願いします——ラズパイダ
スポンサーリンク
こちらの記事もよく読まれています♪
\\ 特集 //
購入するならAmazonセールで
ラズパイダ

コメント