Amazon Pollyを使ってAlexaからブログの新着情報を教えてもらおう

こんにちは、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を選択します。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-20-21-06-40

Add a New Skillより新規追加します。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-20-21-06-57

Skill TypeでFlash Briefing Skill APIを選び、言語で英語(US)を選択して名前を入力します。

現状、Flash Briefing APIはUSしか対応していません。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-20-21-11-18

Configurationでエラー時に出すメッセージやタイトル(Preamble)、更新頻度、コンテンツの種類(テキスト、音声)、ジャンル、URL、アイコンを入力します。

エラー時に出すメッセージやタイトル(Preamble)は、入力したテキストをAlexaの声で再生することができます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88_2016-12-05_15_44_21

Test ではYesにすることで自分のAlexa Appにこのスキルが表示されるようになります。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-11-20-16-28-47

以上で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のフォーマットを合わせる必要があります。