はじめに
この記事は社内のLT大会で発表した資料とその発表内容です。
さくっと見たい方は以下の資料を参照ください。
何故今更Alexa?
モブプロ勉強会でAlexaをテーマに実施した ところ、老若男女問わず好評でした。
にも関わらず特に気になったのは、Alexaのシステム構成が浸透していない部分でした。
AlexaSkill開発は下火になっている印象を持つものの、まだまだその領域に手を出していないエンジニアが多いというのは勿体ない気がしていて、改めてAlexa教に入門していただき、Alexaの発展に貢献していただこう というのがきっかけです。
注意) 筆者はAlexaとは全く関係ありません。趣味です。
Alexaの始め方
- メールアドレスを用意する
- スキル開発 基礎トレーニングシリーズ を読む
以上です。
AWSアカウントもAmazonEchoも不要です。
Lets Alexa Life!!
Alexa Structure
全体構成
登場人物 | 役割(start) | 役割(end) |
---|---|---|
人間 | 声を出す | 耳で聞く |
Echo | 声からAlexaSkillを切り分けて該当するSkillを呼び出し | 人に会話を返す |
Alexa | 声データからIntentを切り分けてBackendを呼び出し | Backendから言われた通りにEchoに返す |
Backend | Alexaが構造化したデータを基にビジネスロジック | それっぽい会話テキストを返す |
大体Backendがメインです。
Skill
Alexa Skill1つにつき1つの呼び出し名を持ちます。
- 例1:「Alexa、天気を教えて」
- 例2:「Alexa、ピカチュウを呼んで」
ウェイクワード「Alexa」、呼び出し名「天気」
呼び出し名によって呼び出すSkillを切り替えています
Skill内会話
Skill内の会話にはセッションを持ちます
「Alexa、コーヒーショップを開いて」
「何をご注文なさいますか」
「アイスコーヒーください」
「ご注文ありがとうございます」
呼び出し~会話の終わりまでAlexaSkillはあなたを待ち受けています
Intent
Skillは複数のインテント=会話パターンを持ちます
- 例1:「アイスコーヒーください」
- 例2:「ストローもつけてください」
- 例3:「3杯お願いします」
あらかじめ会話パターンは定義しておきます
つまりユーザの会話を予測しておかなければなりません
フレーズスロット
インテントにはフレーズスロット=可変長の引数を定義できます
- 例1:「アイスコーヒーください」
- 例2:「紅茶ください」
フレーズスロット「アイスコーヒー」、「紅茶」
ユーザが自由に発話出来る引数を定義 しておき、Backendの処理内容を変えられます
SearchQuery
フレーズスロットは飲み物の種類等Amazon側で予め用意された単語を拾います
自由な単語を拾うためには SearchQuery を使います
ただし、Alexa側で良い感じな変換処理をかけてくれないので、 予想したフレーズと実際の発話フレーズが異なることがあります
例:「コーヒー」⇒「こおひい」
ここまでの整理
Alexa機能集
アカウントリンク
認可フローで別のリソースにアクセスする機能です。
イメージ
#access tokenってAlexaさんが管理してくれる?
ユーザ情報取得API
Amazonアカウント情報にアクセスする機能(OIDC)
イメージ
Skill Connections(現在Preview)
別のSkillにデータ連携出来る
例)
「Alexa、Amazonで〇〇を購入して」
「注文書をプリンタで印刷して」
⇒(別のSkillに情報連携して印刷予約)
声帯変更
Backendのreturn時にSSML(音声合成マークアップ言語)を定義することで声帯を変更する
エフェクトの変更やmp3を読み上げさせるオプションもある
# あなた好みの声に変更できるチャンス
Backend
サーバ選定
BackendはAWS Lambdaのイメージが強いですが、下記の要件を満たせればなんでも良いです。
- Rest API
- I/FはJSON
- エンドポイントは1つ
- SSL通信
つまり言語もサーバも自由に選べます
# なんだったらFaaSのColdStart問題とAlexaの8秒制約あるので自前サーバの方が都合良いやも
I/F
I/Fはapplication/jsonです
sample(Request)
{
"request": {
"type": "IntentRequest",
"intent": {
"name": "HelloWorldWithNameIntent",
"slots": {
"firstName": {
"name": "firstName",
"value": "terarara",
"confirmationStatus": "NONE"
},
・・・
# HelloWorldWithNameIntentにfirstNameを渡しています
Unit Testing
I/F情報を保持しておけば単体テストコードも書けます
const request = {
//JSONをコピペ
・・・
}
describe("お試し", () => {
it("requestを処理すると注文を受け付ける", () => {
target(request, res);
assert.deepEqual(
res.body.response.outputSpeech.ssml,
"<speak>ご注文ありがとうございます</speak>"
);
});
}
コード管理
AlexaSkillはJSON Editor機能があります のでJSONを保持しておくことでコード管理が可能です
backendは言わずもがな、管理しておきましょう
おわりに
一口にAlexaと言っても様々な機能の上に成り立っていることがわかります。
これらの他にも Alexa echo showを使った視覚サポートやIoTデバイスとの連携などまだまだ進化を続けています。
皆さんも是非AlexaSkillを開発してVUI業界を盛り上げていきましょう!
注意) 筆者はAlexaとは全く関係ありません。趣味です。