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

特集記事

ここでは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:
            

        :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:
            

        :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:
            

        :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:
            

        :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:
            

        :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:
            

        :param directive: Protocol Buffer Message that was send by Echo device.
        """
        pass

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

https://developer.amazon.com/ja/docs/alexa-gadgets-toolkit/understand-alexa-gadgets-toolkit.html

最後にまとめ

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

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

  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との連携でした。

https://developer.amazon.com/ja/alexa-voice-service

ラズパイダ

ラズパイダ

学べる楽しむ便利になる。小さいくせにヤケにパワフル。そんなRaspberry Pi をまだ知らない人に伝えたい。様々な場所で利用されているRaspberry Pi を知って「あっ、これもラズパイだっ!」だからラズパイダ!

関連記事

特集記事

コメント

この記事へのコメントはありません。

最近の記事 はじめて向け
  1. あのMX LinuxがRaspberry Pi 向けイメージMXFBPをリリース

  2. OMV5のアップデートエラー回避

  3. Raspberry Pi Pico マイコンボード、僅か4ドルで登場

  4. お掃除ルンバのアイロボットから教育用ロボット「Root」発表

  5. 【海外】プライステーション2の中にラズパイ4を組み込んで多目的マシン

  1. お掃除ルンバのアイロボットから教育用ロボット「Root」発表

  2. 【初心者向け】Raspberry Pi 4との接続方法(電源、HDMI)

  3. 【初心者向け】はじめてRaspberry Pi OS をダウンロードする人へ

おすすめの記事

  1. NextcloudとRaspberry Pi 3B+で作る自分専用クラウド

  2. ラズパイ4にも対応している軽量でクールなOS「Manjaro」はアリ

  3. Raspberry Pi 4のOSをデスクトップPCとして使うためにUbuntuMATEをインストールしてみた

  4. 期待が高まるWindowsに似ている新しいLinuxのフレーバー「Endless OS」がRaspberry Pi 4用に登場予定

  5. ラズパイ4をデスクトップPCライクに使えるOSとして個人的に急浮上中のEndlessOS

  6. TwisterOSで懐かしのWindows、最新macOSの見た目でラズパイを使う

今月の人気記事

  1. 1

    Raspberry Pi で動く様々なOS一覧まとめ13種類!

  2. 2

    ラズパイ4をUSB接続のSSDから起動する方法(USBブート)

  3. 3

    初心者でもラズパイでNASサーバーを作ってみよう!

  4. 4

    Raspbian のWi-Fi設定(Raspberry Pi 初期設定)

  5. 5

    Raspberry Pi 4の初期設定2020年版

  6. 6

    Raspberry Pi 4を起動したのにモニターに画面が映らない対処法

  7. 7

    ラズパイ4はPCライクな性能になったけどPCではないよという話

  8. 8

    ラズパイ4とOMV5(openmediavault5)で作る自宅NASサーバーの設定方法

  9. 9

    Raspberry Pi 4のOSをデスクトップPCとして使うためにUbuntuMATEをインストールしてみた

  10. 10

    ラズパイで使うmicroSDカードの選び方

記事ランキングページ

TOP