自己紹介
お名前:寺原 歩
お所属:技術戦略推進部
得意言語:ECMAScript
GitHub:a-terarara
今回の資料:https://a-terarara.github.io/lightning-talks_alexa
今日話すこと
1. 今更Alexa?
2. Alexaの始め方
3. Alexa Structure
先日のモブプロ会の一幕
「Alexaはskillとbackendからなるよ」
「skillには呼び出しとIntentがあってさ~」
「へ~知らんかったわぁ」
先日のモブプロ会の顛末
「もっとAlexaで開発してみたい!」
Alexaを始めとしたVoice User Interface(会話型AI)は2018年8月に成長期、今年は・・・?
出典:ガートナー・ジャパン
https://www.gartner.com/jp/newsroom/press-releases/pr-20180822
2019/7/22週の日本におけるAlexaSkillリリース数

多い?少ない?
スキル内課金始めました

Alexa「スキル内課金の概要」より
https://developer.amazon.com/ja/docs/in-skill-purchase/isp-overview.html
AlexaSkillにはまだチャンスが転がっている?
突然クイズ
Alexaってどーれだ?
実はこの子たちAlexaじゃなくてAmazon Echoなんです。
開発に必要なもの
・メールアドレス(またはAmazonアカウント)
以上
AWSアカウントも不要です
30日間無料枠を勝手に用意してくれます
全体
Backendが会話を受け取って処理を行う
Skill
Alexa Skill1つにつき1つの呼び出し名を持っています。
例1:「Alexa、天気を教えて」
例2:「Alexa、ピカチュウを呼んで」
ウェイクワード「Alexa」、呼び出し名「天気」
呼び出し名によって呼び出すSkillを切り替えています
Skill
Skill内の会話にはセッションを持ちます
「Alexa、コーヒーショップを開いて」
「何をご注文なさいますか」
「アイスコーヒーください」
「ご注文ありがとうございます」
呼び出し~会話の終わりまでAlexaSkillは待ち受けています
Skill
Skillは複数のインテント=会話パターンを持ちます
例1:「アイスコーヒーください」
例2:「ストローもつけてください」
例3:「3杯お願いします」
あらかじめ会話パターンは定義しておきます
つまりユーザの会話を予測しておかなければなりません
インテント
インテントにはフレーズスロット=可変長の引数を定義できます
例1:「アイスコーヒーください」
例2:「紅茶ください」
フレーズスロット「アイスコーヒー」、「紅茶」
ユーザが自由に発話出来る引数を定義しておき、Backendの処理内容を変えられます
SearchQuery
フレーズスロットは飲み物の種類等Amazon側で予め用意された単語を拾います
自由な単語を拾うためにはSearchQueryを使います
ただし、Alexa側で良い感じな変換処理をかけてくれないので、予想したフレーズと実際の発話フレーズが異なることがあります
例:「コーヒー」⇒「こおひい」
ここまで整理
アカウントリンク
認可フローで別のリソースにアクセスする機能
ユーザ情報取得API
Amazonアカウント情報にアクセスする機能
Skill Connections
別のSkillに連携出来るPreview機能

例:「Alexa、Amazonで〇〇を購入して」
「注文書をプリンタで印刷して」
⇒(別のSkillに情報連携して印刷予約)
声帯の変更
Backendのreturn時にSSML(音声合成マークアップ言語)を定義することで声帯を変更する
エフェクトの変更やmp3を読み上げさせるオプションもある
Backend
BackendはAWS Lambda・・・と思いきや下記の要件を満たせればなんでも良いです。
・Rest API
・I/FはJSON
・エンドポイントは1つ
・SSL通信
つまり言語もサーバも自由に選べます
Moneyless Architecture
I/F
I/Fは全てJSONで処理されます
サンプルリクエスト
{
"request": {
"type": "IntentRequest",
"intent": {
"name": "HelloWorldWithNameIntent",
"slots": {
"firstName": {
"name": "firstName",
"value": "terarara",
"confirmationStatus": "NONE"
},
・・・
HelloWorldWithNameIntentにfirstNameを渡しています
単体テスト
I/F情報を保持しておけば単体テストコードも書けます
const request = {・・・} //JSONをコピペ
describe("お試し", () => {
it("requestを処理すると注文を受け付ける", () => {
const response = target(request, res);
assert.deepEqual(
res.body.response.outputSpeech.ssml,
"<speak>ご注文ありがとうございます</speak>"
);
});
}
コード管理
AlexaSkillはJSONエクスポートすることでコード管理が可能です
backendは言わずもがな、管理しておきましょう