みかづきブログ・カスタム

基本的にはちょちょいのほいです。

Alexa-Hostedスキルでmp3を再生するためにファイルをホスティングする 🔈

先日、こんなスキルをつくりました。

Alexaスキルを作る際、以前であれば、Lambdaファンクション(もしくは自前のサーバ)を用意して、スキルに関連付けるという開発方法だったのですが、いまは「Alexa-Hostedスキル」という仕組みを使えば、developer.amazon.com
のアカウントを用意するだけでスキルの開発ができてしまうようです。
Lambdaファンクションを使おうとするとAWSのアカウントも必要だったので、シンプルになりましたね。簡単なスキルならAlexa-Hostedスキルで充分につくれそうです。

f:id:kimizuka:20200809115648p:plain

参考: Alexa-hostedスキルを使用してスキルをエンドツーエンドで作成する | Alexa Skills Kit
参考: Amazon開発者ポータル


さて、スキルをつくる際、音声合成でレスポンスを返すだけなら問題ないのですが、こちらで用意したmp3を再生したい時もあるかと思います。AWSのアカウントがあればS3にホスティングしてしまえば良かったのですが、Alexa-Hostedスキルの場合はどうすれば良いのでしょうか。

実は答えは公式ブログに書いてあるため、僕がまとめるまでもないのですが、ハマりどころがないわけではないので、画像付きでまとめておきます。

参考: Alexa-hostedスキルでメディアファイルを使用する | Alexa Skills Kit

メディアファイルのホスティング場所

Alexa-Hostedスキルを作成すると、メディアストレージ用のAmazon S3バケットにアクセスできるようになります。
一応制限があるのですが、月あたり5 GBのストレージ、20,000件のGETリクエスト、2,000件のPUTリクエスト、15 GBのデータ転送までが無料で使用できます。これを超えた場合どうなるのかは超えたことがないのでわかりません。

で、どうやってS3にファイルをアップロードするかですが、コードエディタの左下にリンクがあるのでそこからS3にアクセスできます。

f:id:kimizuka:20200809120241p:plain

左下のメディアストレージという箇所から、S3にアップできます。

f:id:kimizuka:20200809120736p:plain

ここにアップしたファイルは、コードエディタ上から、

const audioUrl = Util.getS3PreSignedUrl('Media/filename.mp3').replace(/&/g,'&');

という形でURLを取得することができます。(filenameの部分を適宜変更してください)

ホスティングするmp3の用意

今回は音声ファイルをホスティングしましたが、Alexaスキルで再生できるmp3の形式は割と細かく指定されています。

制限をいくつか挙げると、

  1. 240秒以内
  2. 48 kbps
  3. サンプルレートは22050Hz、24000Hz、16000Hzのいずれか

なので、ffmpegで

ffmpeg -i input.mp3 -ac 2 -codec:a libmp3lame -b:a 48k -ar 16000 -write_xing 0 output.mp3

という形で変換してからホスティングするのがおすすめです。

参考: 音声合成マークアップ言語(SSML)のリファレンス | Alexa Skills Kit