Alexa + pollyのサンプル
Alexaはまだ日本語の聴く話すはできない。pollyを挟んで、日本語を話させてみた。
作ったCustom Skill
"what's the date today?"と質問すると、"2017年3月21日です。"と答える。引き続いて、"what day?"と尋ねると、"火曜日です。"と答える。
Alexa
概要
Lambdaを利用して、Alexa Skillを実装。
ユーザがAlexaに話しかけると、Alexaが音声認識+自然言語処理をして、IntentとSlotsをlambdaに渡してくれる。
Intentが各イベントに相当。IntentごとのサンプルのUtterance(発話)を事前登録し(複数の言い回しを登録可能)、ユーザ入力をIntentに紐づける。発話の揺れはAlexaが吸収してくれる。
SlotsはIntent中の変数に相当。
下記では、AskIntent、DaysOfWeekIntentの2つのIntentを用意している。{Date}の部分が、Slots。
AskIntent what's the date {Date}
AskIntent what is {Date} date
DaysOfWeekIntent what day
AMAZON.StopIntent good bye
AMAZON.StopIntent see you
AMAZON.StopIntent stop
IntentSchemaは下記のように登録する。
{
"intents": [
{
"intent": "AskIntent",
"slots": [
{
"name": "Date",
"type": "AMAZON.DATE"
}
]
},
{
"intent": "DaysOfWeekIntent",
"slots": []
},
{
"intent": "AMAZON.ResumeIntent"
},
{
"intent": "AMAZON.PauseIntent"
},
{
"intent": "AMAZON.StopIntent"
}
]
}
backendとなるlambda側で、Intentごとに分岐して、処理を実装する。英語であれば、lambdaの返却xmlにテキストを入れておけば、Alexaが発話してくれる。
なお、lambda側から返却するjsonにSessionAttributeとして定義することで、同一session内で文脈を引き回すことができる。今回は、"what's the date today?"と聞くと、日付をsessionAttributeに格納し、次に"what day?"と質問すると、最初に答えた日付の曜日を回答する。
手順
- lambda functionを用意
- バージニアに作る
- トリガーは「Alexa Skills Kit」
- lambda_function.pyの内容をコピー
- Alexa Skillを登録
- https://developer.amazon.com/edw/home.html#/ より登録
- Invocation Nameが、Skillを起動するときの名前となる。(例: Date Respondent)
- IntentSchemaを登録(slotsもこの中で定義)
- intentSchema.jsonの内容をコピー
- SampleUtteranceを登録
- SampleUtterances.txtの内容をコピー
- エンドポイントに用意してlambdaのARNを登録
- テスト
- Developer Consoleからテスト可能
- 入力jsonをコピーして、lambdaを直接テストすることも可能
- Alexa Appに登録。
- http://alexa.amazon.com/spa/index.html#skills
- your skillで作成したskillを登録
- シミューレタによるテスト
- echosim(echoのシミュュレータ)を利用して、skillを使ってみることができる。
- https://echosim.io
- Tell Date Respondent what's the date today
- Alexa App側に、カードとして発話内容が記録される。 http://alexa.amazon.com/spa/index.html#cards
polly
概要
テキストを音声に変換可能。日本語にも対応済。(日本語のvoiceは現状"Mizuki"のみ)
lambdaの戻りの中のSSML(Speech Synthesis Markup Language)の中でmp3を利用可能。返却する日本語テキストをpollyを利用して音声のmp3ファイルに変換し、S3にアップしておくことで、Alexaは日本語を話すことが可能となる。
手順
- s3 bucketを用意
- regionは、US standardに作成
- アクセス許可 -> バケットポリシーの変更で、すべてのユーザがget可能にしておく
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPerm",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::{bucket_name}/*"
}
]
}
- lambda functionを用意
- lambda_function_2.py
- lambda/s3/pollyに権限をもったrollを付与する
- 環境変数として、key:"AUDIO_BUCKET"に、作成したs3 bucketの名前を設定する
- 本来は、polly変換結果の音声ファイルのキャッシュや、内容によっては音声ファイルのアクセス制御などが必要と考えられるが、考慮していない
- Alexa SkillのlambdaのARNを、新たに作成したlambdaのARNに変更して、同様にテストを実施
- 日本語で返答が返ってくる