俺がわかるように書いたAlexaスキル入門１（仕組み）

## Alexaの基本的なスキル作成１（仕組み）
###### 2021/6

### ■ Consoleの準備
https://developer.amazon.com/alexa/console/ask
DeveloperConsole使えるようにするところまでは省略。
注意点としては米国と日本がサーバーごとにごっちゃになってたり、分離してたりするので、うまいこと日本のほうを選んでねってところです。

### ■ スキルの種類

|スキル種|内容  |
|--|--|
|カスタム  |   通常のスキル「スキル名」を開いて～してという感じで開く行為が必要なスキル|
|フラッシュブリーフィング|呼び出しの仕方が固定で、有効化している適合したスキルすべてが順次呼び出されるタイプのスキルで、ニュースのまとめを発話させたりするものなど|
|スマート ホーム|デバイスを利用して何かするタイプのスキル|

### ■ カスタムスキルで入門
いろいろデバイスとか使ってみたいだろうけど、対話するだけのスキルで基礎的なところを。

ここでまずは、Alexaとの対話がどういう流れで行われるのかという点を確認すると、こんな感じ。

### ■ Alexaの処理の流れ

 1. 発言する
 2. 発言をアレクサがサーバーに投げて解析する
 3. **解析結果がスキルに届く**
 4. **スキルはその結果に対応した返答を作る**
 5. 返答をアレクサに投げてアレクサがしゃべる

これはなんとなくはわかってると思うけど、それぞれに何が対応しているのかがすごくわかりにくいと思うので、順にまとめます。

### ■ なんかカスタムスキルを作る
カスタムスキルをとりあえず呼び出し名を共に作ってみる。
で、早くもよくわからないのが**「スキルのバックエンドリソースをホスティングする方法」**ですわな。

これはシンプルに言うと**スキルの処理はどこで実行する？**です。

専用のサーバーとか持ってるとか難しいことできるならこんなところ見てないと思うので、Alexa-Hosted～みたいなのがあると思うんで、そっちを選びましょう。
これらはamazonさんがスキル実行する場所用意してやんよってやつです。

あとは、スキルの内容を記述する言語を好みで選んでくださいってだけです。
ここではPythonでやらしてもらいます。

その後、なんかテンプレート使うか？みたいなのが出てくるようになってますが、まあとりあえずは何もなしのやつを選んでください。

そうするとスキルが作られて、よくわからない画面に飛ばされ、対話モデルだ、インテントだアセットだなんだと**わけのわからないこと**が並んでる画面になります。

その最初に飛ばされる画面はビルドのタブだと思われます。


### ■ インテントって？
さて、対話的なスキルを作るのに何がまずわかってればいいかというと**インテント**ってやつ。

対話モデルとかいうのを開くとHelloWorldIntentってやつが勝手に作られていて、ビルトインインテントとかいうAMAZON.*Intentみたいなのが並んでるはず。

HelloWorldIntentを見ると「こんにちは」とか「ハロー」とか書いてあると思います。
各インテントはこんな風に認識する言葉を持っていて、それらを発言したら解析で認識されて「このインテントをしゃべったポイよ」とスキルに届きます。

つまり、多種多様な言い方を解析して一つの事柄として認識するための辞書みたいなものです。

HelloWorldIntentは登録されている挨拶らしい言葉が解析で見つかったらスキルにHelloWorldIntentが認識されたと伝えてくれるわけです。

なので、朝の挨拶、昼の挨拶、夜の挨拶を別に処理したい場合はMorningGreetIntent,DayGreetIntent,NightGreetIntentみたいにIntentをそれぞれに作ってあげればよいということです。

##### ビルトインインテント
次にビルトインインテントってのです。
すべてのスキルには反応が義務付けられてる言葉があります。
「ヘルプ」だとか「終われ」だとかですね。
それらのamazonが規定している言葉に対応するインテントがビルトインインテントです。

これらには決まった言葉が内包されているので、中を見ても空っぽですが、言葉を追加することができるので表示されています。


### ■ スキルの実装
次に、コードエディタのタブで編集するのが解析結果から何をアレクサに送るかというところです。

インテントの編集がなぜ**ビルド**なのか、スキルの実装がなぜ**コードエディタ**なのかはわからん。
このタブの名前を変えるだけでもぐっとわかりやすくなるだろうとは思うんだが・・・。

lambdaというフォルダっぽいところに、lambda_function.pyってのがはいってて、それがスキル本体な感じです。

大きな仕組みとしては、AbstractRequestHandlerってクラスを派生して、そのクラスで処理できるIntentかをチェックする関数と、Intentを処理する関数を記述します。

SkillBuilderってのにそれらのHandlerを登録しておき、認識されたIntentを処理できるHandlerがあればそれに渡されて処理される。

適応するHandlerがなければIntentReflectorHandlerという「処理するHandlerなかったよ」っていうHandlerで処理される。

あとは、各IntentHandlerを見ていけばなんとなくつかめると思います。

初期状態ではそれぞれのIntentHandlerでspeak_outputの文字列がresponse_builderというやつでAlexaへ送るデータに登録されて送られている感じですね。
speak_outputの文字列を変更すると、しゃべる文章が変わるので適当にしゃべらせましょう。

### テスト
ということで、言葉を認識させてIntentとしてスキルで処理するという流れがわかってきたと思うので、適当にspeak_outputの文面等をいじってテストしましょう。

保存、ビルド（ビルドタブのIntent等のデータのビルド）、デプロイ（コードエディタタブのプログラムファイルの転送）など適当に押してからテストのタブでAlexaシミュレータでテストです。
上のプルタブを開発中にするとスキルが実行状態になります。

「(呼び出し名)を開いて」ってやればLaunchRequestHandlerにくるので、その対応するspeak_outの文章をしゃべり、「ハロー」とかやればHelloWorldIntentって認識されて、HelloWorldIntentHandlerにきて、その対応するspeak_outの文章をしゃべります。

### ■ はて？
とりあえず、スキルを試してみたって感じでこの記事は終わりますが、

・インテントってそんなにいっぱい作るの？まじで？
・ほんとにブラウザでやり続けないといけないの？クソめんどいんですけど。

あたりを詰めていきましょうかね。

### ■愚痴
ビジュアルプログラミングに最適な単純さだと思うんだけど、なんでこんな複雑にしてるんだろうねぇ。

あと、どこのドキュメントもそうだけど、るしでふぁるしでぱーじなの何とかしてほしい。
構造の説明、単語の説明を平易な言葉で書いてくれ。
あと、少ない手順(全然少なくない)とか、多機能だとか、これまでにないとか自己賛辞が50％ぐらいのドキュメントやめて。