こちらはMastodon Advent Calendar 2018 19日目 と Alexa skill Advent Calendar 2018の記事です。
国見 小道さんにご紹介いただいておきながら、タイトルは変えるわ、リリースは変えるわ、酷いもんです。すいません…
とはいえ、相変わらず、mastodon インスタンスに入り浸る生活です。
居心地良くて、辞める理由なし。
そして、ついにスマートスピーカーにまでハマりました!ガジェオタ万歳!
そんなわけでこの記事は、先月から新たな領域にチャレンジしてみた報告です。
Alexa for mastodon
まずは、こちらが実際に動作する姿です。
まだ正式に審査を通したりはできる状態にないので、もし使いたい場合には各自で実装しないといけません。。
作るに至った経緯
仕事の都合で、AWS + IoT 的な何かを勉強しなくちゃいけなくなりまして。
それなら、趣味と実益を兼ねて Amazon Echo だ!となりました。
そうして買ったのがこちらです。

ついでに貰い物でEcho Spotもゲット。(既に販売されていません)

そうして弄って、Qiita 見て、SlideShare見て、AWS のトレーニング記事や動画を見てたら、なんだか作れそうな気がしてきたので、作ろうとしたのが発端です。
つまり、 Alexa 初心者なのに、開発経験 極薄なのに、年末年始のクソ忙しいくせに、いきなり mastodonクライアントの Alexa スキル開発に手を出した暴挙!
今はちょっと反省してます。楽しいけど。
Alexa for mastodon の仕様
システム構成図
今回組んだシステムの構成は、こんな感じです。
登場するサービスの数は少なく、シンプルです。
対象とするインスタンスを、AWS Lambda で指定(固定)しなければなりません。ここをユーザーで指定してもらいたいんですが、現時点では難しいところです。
裏技的に何か方法もあるかもしれませんが、現状の正攻法としては、1スキル1インスタンスとして設定せざるを得ない点が無念です。
どなたか妙案募集中。
スマートスピーカー開発に馴染みのない方に、ここでご紹介したい言葉はこちら。
ボイス・ユーザーインターフェース
略して
VUI
GUI、CUI に続くユーザーインターフェース、つまりは利用者と接する部分の名称です。
匠は過去に聞いたことがなかった用語ですが、今後はたくさん出てくるようになるはず。覚えておきたい用語ですね。
搭載した機能
今回のバージョンで搭載できた機能はこちらです。
- ホームタイムラインを読み上げる
- ローカルタイムラインを読み上げる
- 通知のうち、直近のメンションを読み上げる
- 挨拶をつぶやく
残念ながら、今のAlexaの仕様上、自由な文章をつぶやくのは難しいようです。
そこで、あくまで定型的な挨拶をつぶやけるようにしてみました。
朝起きて、とりあえずつぶやくのには使えるのかな、と。
あと、タイムラインや通知をどれだけ読み上げさせるかについての仕様も悩ましいところです。
遡ると時間軸が変だし、時間の流れに合わせるならどこから読み上げべきか、直近っていつだ?といったことを考慮する必要があります。
これは VUI 特有の設計となります。
今回はいずれも下記の仕様にしました。
- スキルを実行した時点から、最大20件までのつぶやきに遡る
- 古いつぶやきから読み上げる
ホントは当日のつぶやきのみにしたいとか色々ありますが、まずはベータ版ということで。
状態遷移図
先日参加できなかった Alexa Dev Summit Tokyo 2018 の参加者から漏れ出てくる情報では、状態遷移図を作ると良いとのことでした。
そこで今回は作ってみました。
機能も多くないため、比較的シンプルではないかなと思います。
ただ、1つの機能を実行した後をどうするか、という点の遷移に少し悩みました。
その結果、次のようにしました。
- 「機能選択」状態は1つに集約する
- 2回目以降の「機能選択」状態のみ、「もう一回」といった繰り返し処理を実行する
Alexa for mastodon のソースコード
VUI/Alexa Skill の実装
alexa developer console から下記のJSONを流し込めば、スキルが出来上がります。ちなみに、スキル名はコチラの予定。
声でマストドン
バックエンド処理の実装
AVS から発話のJSONデータを受けて処理をする必要がありますので、今回は AWS Lambda を用いて作ってみました。
AWS Lambda の環境設定

- 実行時間は数分くらいに伸ばしておくこと
- 環境変数「FQDN」にマストドンのインスタンスのFQDNを設定すること。
- 環境変数「ACCESS_TOKEN」にマストドンで使用するアカウントのアクセストークンを設定すること。
- 実行権限は、AWS Lambdaさえ実行できれば問題無し。
- AWS Lambda Layer で Python の emoji モジュールだけ設定した。
VUI/AVS側のイベント処理
Mastodon側の制御
工夫したところ
- いくつかの返答にランダム性を持たせてみました。これは Alexa Dev Summit Tokyo 2018 参加者の実況を見てやってみた。以外と作るのは簡単です。自然かどうかは別として。
- 絵文字とかHTMLタグとか、つぶやきには色んな雑味がはいるので、そこを如何に排除するかに拘りました。
- Masoton.py を AWS Layer にして使いたかったのですが、なぜかモジュール不足のエラーが出まくって解決できませんでした。仕方なく、urllibを駆使した作りに。めんどくさかった。。。
課題
やりたかったけど、時間と知識の都合で追いついてないことが沢山あります。
まずはこちら。
- スキル公開したい!※mstdn.jpやpawoo?
- 希望されたインスタンス向けのスキルを公開したい!
- 各鯖缶向けにスキトラしたい!
スキル公開がAWSのキャンペーンに間に合わなくて無念…Tシャツもらいたかったなぁ…
ちなみに、やりたかった機能や仕組みだとこちら。
- AWS Lamda Layer を使って Mastodon.py の活用(=コードのシンプル化)
- アカウントリンク機能の活用
- 連合タイムラインの読み上げ
- 読み上げ数の変更
- ダラダラずーっと読み上げさせる
- 挨拶以外の定型つぶやき
- 挨拶以外の自由なつぶやき
- 本日のファボ数やブースト数の読み上げ
- アカウントのフォロー/アンフォロー
- つぶやきの検索と読み上げ
- 読み上げたつぶやきへのファボやブースト
- リストの読み上げ
現状の Alexa の仕様だと厳しいものもありますが、徐々に実装できると良いな、と。
来年のアドベントカレンダーでリベンジ…かな?
感想と今後
とりあえず、作ろうと手を出してみて思ったことはこちら。
そんなに簡単じゃない!
Alexaの仕様、Alexa Skill Kitに加え、バックエンドに使う AWS Lambda、必要に応じて他のAWSサービスや他社APIを知っておく必要があります。
この辺をよく使うエンジニアは苦もないでしょうが、全部はじめてだと少し厳しいかな、とは思います。特にバックエンド部分。
でも、楽しい!
ボイスユーザーインターフェース、つまりは声でのやり取りを設計するのはとても面白いです。
過去にない体験、かつ、まだまだ未成熟な分野へ参入できる楽しさは今!という感じです。
また、バックエンド部分も仕組みがそんなに複雑というわけではないので、対応するプログラミング言語を覚えたての初学者なんかには良い題材になるのではないでしょうか。
今回は時間の都合もあって、完全にベータ版以前の状態ではあるんですが、今後はもっと機能追加して、楽しみたいなと感じます。
惜しむらくは、 Alexa の仕様上、1つのスキルに1つのインスタンスを固定せざるを得ないところ。こればかりは当面なんともならなそうですが、 Alexa の改善を期待していきたいなと考えております。
あと、AWS Lambda界隈やAlexa界隈は、Python より Node.js の方が主流です。フレームワークやCLI環境で開発ガンガンやろうと思いましたが、Pythonだと色々上手くいかなくて断念。
今回は、主に AWS Lambda コンソールにある Cloud9 を主体に開発しました。Vimのキーバインドと微妙に違うとかイライラしたので、今後はCLIベースで開発していきたいですね。
個人開発バンザイ!
Mastodon Advent Calendar 2018 の明日は、Masotodon 開発芸人と呼びたくなるぐらい凄い開発を重ねていらっしゃるS.H.です。期待しましょう!
それでは、よいAlexaライフ&Mastodonライフをお過ごしください!
ご意見・ご感想、助言や苦言はこちらまで。
参考にしたサイト
Alexa / AWS Lambda 関連は無数にあるので、それ以外。主にpython。関数を流用させて貰ったりした記事はこちら。
* Mastodon documentation
* PythonにおいてのJSONファイルの取扱いあれこれ - Qiita
* PythonデバッグTips
* pythonで絵文字を駆逐する - Qiita
* pythonのlogger奮闘記 ~簡単な使い方から複数ファイルを跨る使い方まで~ - Qiita
* 【解答編】Mastodonで始めるPythonプログラミング!腕試しテスト50本ノック(初級編) - Qiita