Amazon Pollyを使ってAlexaからブログの新着情報を教えてもらおう
sparkgene
こんにちは、sparkgeneです。
この記事はRecruit Engineers Advent Calendar 2016の17日目にエントリーしています。
先日re:Inventに参加した際にEcho DotとAmazon Pollyのブログを書きましたが、今回はその裏側について書きたいと思います。
Echo DotとAmazon Pollyを使ってブログを読み上げる 〜 re:Invent 2016 参加レポートDay3
AlexaのSkillとは
Amazon AlexaにはSkillと呼ばれるアプリケーションが有ります。このSkillを作るツール郡がAlexa Skill Kit(ASK)と呼ばれております。ASKは以下のような種類のSkillがあります。
Custom Interaction Model | 制約がなく、自由に作成できるもの |
---|---|
Smart Home Skill API | スマートホームデバイス向けのもの |
Flash Briefing Skill API | Alexa Flash Briefing向けのもの |
今回利用したFlash Briefing APIはどんな用途で利用するかを説明すると、Alexaには Alexa Flash Briefing
という機能が備わっており、Alexa Appに事前に登録されている配信元(BBC Newsとか)を有効にして『Alexa, What's new?』と話しかけるとニュースを喋ってくれます。
つまり、デベロッパーがFlash Briefing Skill APIタイプのSkillを作ることでAlexa Flash Briefingに自分のRSSフィードなどを簡単に追加することができます。
通常のSkillと同様に審査をクリアして公開されると、Alexa Appにカードが表示され有効にすることで自分のフィードが『Alexa, What's new?』で聞けるようになります。公開可能なコンテンツは自分が所有している必要があります。
Flash Briefing API
RSS形式か、JSON形式のフィードに対応しています。RSSはRSS2.0のフォーマットに対応しており、JSONであれば以下のような形式に対応しています。
[
{
"uid": "urn:uuid:aaaa-bbbb-cccc-dddd",
"updateDate": "Sun, 04 Dec 2016 00:00:28 +0000",
"titleText": "Echo DotとAmazon Pollyを使ってブログを読み上げる 〜 re:Invent 2016 参加レポートDay3",
"mainText": "こんにちは、sparkgeneです。 re:Inventのセッションが全て終わり、期間中に〜〜",
"redirectionUrl": "https://developer.amazon.com/public/community/blog"
}
]
この例を見ると、当然ですが会社のブログだと日本語が書かれています。残念ながらAlexaはまだ日本語が理解できません。しかし、決まったフォーマットのオーディオデータであれば再生してくれます。そこで、re:Inventで発表されたAmazon Pollyを利用して、日本語を音声データに変換してAlexaに喋ってもらうことにしました。
Lambdaファンクション
サンプルソース
このサンプルを動かすLambdaのRoleには、AWSLambdaBasicExecutionRoleと以下のPolicyを持つRoleを指定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1479621791000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl",
"polly:SynthesizeSpeech",
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:s3:::<s3 bucket>/*"
]
}
]
}
フィードの作成
https://github.com/sparkgene/alexa_flash_briefing_with_polly/tree/master/feed_generator
Flash BriefingはRSSリーダーのように既読の管理をしてくれないようで、Skillの登録画面で登録したURLが返す內容をすべて喋ります。対策としては、Alexaに渡すフィードは通常のRSSのエンドポイントをそのまま渡すのではなく、新しく追加された情報だけにするか最新のN個を常に渡すようにフィードを調整する必要がありそうです。
また、HTMLのタグや文字参照など残っているとPollyがそのまま喋っってしまうので、テキストだけになるようなフィルタリングもしています。
このソースでは特定のRSSエンドポイントから過去24時間分のフィードのみ抽出してS3にファイルを置くようにしています。
Environment variablesは以下の設定をします。
S3_DATA_BUCKET | 生成したRSS jsonを置くバケット |
---|---|
RSS_FEED_URL | 取得するRSSのURL |
TEXT_TO_SPEECH_LAMBDA | 音声変換を行うLambdaファンクション名 |
実行時間は最大の5分にしておきます。
ブログの更新頻度によりますが、CloudWatch Eventsを使ってデイリーでこのLambdaファンクションを実行しておくと、毎日最新情報を配布することが出来ます。
音声データの作成
https://github.com/sparkgene/alexa_flash_briefing_with_polly/tree/master/audio_generator
フィード生成Lambdaファンクションから実行されるLambdaファンクションです。
2016/12/10現在、Lambdaファンクションの実行環境のboto3のバージョンではpollyにまだ対応していないため、lambdaファンクションのソースに最新版のboto3を含めてデプロイする必要があります。
Environment variablesは以下の設定をします。
AUDIO_BUCKET | 生成したaudioデータを置くバケット |
---|
実行時間は最大の5分にしておきます。
Skillの作成
Amazon DeveloperコンソールからAlexa Skills Kitを選択します。
Add a New Skillより新規追加します。
Skill TypeでFlash Briefing Skill APIを選び、言語で英語(US)を選択して名前を入力します。
現状、Flash Briefing APIはUSしか対応していません。
Configurationでエラー時に出すメッセージやタイトル(Preamble)、更新頻度、コンテンツの種類(テキスト、音声)、ジャンル、URL、アイコンを入力します。
エラー時に出すメッセージやタイトル(Preamble)は、入力したテキストをAlexaの声で再生することができます。
Test ではYesにすることで自分のAlexa Appにこのスキルが表示されるようになります。
以上でSkillの登録ができます。前回のブログエントリを参考にSkillを有効にしてAmazon Echoなどで動かすことが出来ます。
Amazon EchoやEcho Dotは技適マークを取得していないため国内で利用すると電波法違反になります。
まとめ
まだ日本語対応していないAmazon Alexaですが、Amazon Pollyを使うことで日本語を喋らせることが出来ました。
Pollyを使えば簡単にテキストを音声データに変換できるため、AlexaだけではなくWebサイトの読み上げとか、色々なサービスへの展開が期待できます。
注意
現状、AVSを利用した自作のEchoの場合、再生できるオーディオのフォーマットは、以下のとおりである必要があります。
https://forums.developer.amazon.com/questions/10546/audio-sampling-rate.html
- bitrate 48kbps
- sample rate 16000 Hz
しかし、Amazon Pollyが出力するmp3のフォーマットは、sample rate 22050 Hzであるために再生することができません。自作のEchoで再生させる場合は、生成されたmp3をffmpeg等を使って、mp3のフォーマットを合わせる必要があります。