天井に設置したEcho Flexから、子供の足音を流すスキルを作りました。上の階に子供部屋がある気分になれます。名付けて「夢の二世帯住宅」です。
— 君塚史高 (@ki_230) 2020年8月7日
ゆくゆくは自宅で遊んでいる子供の足音を、実家の天井から流したいです。 pic.twitter.com/kQDcNxHQi1
先日、こんなスキルをつくりました。
Alexaスキルを作る際、以前であれば、Lambdaファンクション(もしくは自前のサーバ)を用意して、スキルに関連付けるという開発方法だったのですが、いまは「Alexa-Hostedスキル」という仕組みを使えば、developer.amazon.com
のアカウントを用意するだけでスキルの開発ができてしまうようです。
Lambdaファンクションを使おうとするとAWSのアカウントも必要だったので、シンプルになりましたね。簡単なスキルならAlexa-Hostedスキルで充分につくれそうです。
参考: 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にアクセスできます。
左下のメディアストレージという箇所から、S3にアップできます。
ここにアップしたファイルは、コードエディタ上から、
const audioUrl = Util.getS3PreSignedUrl('Media/filename.mp3').replace(/&/g,'&');
という形でURLを取得することができます。(filenameの部分を適宜変更してください)
ホスティングするmp3の用意
今回は音声ファイルをホスティングしましたが、Alexaスキルで再生できるmp3の形式は割と細かく指定されています。
制限をいくつか挙げると、
- 240秒以内
- 48 kbps
- サンプルレートは22050Hz、24000Hz、16000Hzのいずれか
なので、ffmpegで
ffmpeg -i input.mp3 -ac 2 -codec:a libmp3lame -b:a 48k -ar 16000 -write_xing 0 output.mp3
という形で変換してからホスティングするのがおすすめです。