経緯
- 仕事で MP3 を使ったスキルの作成をすることになったが、ネット上に古い書き方(alexa-sdk)と新しい書き方(ask-sdk)が混在してややこしかったので、2019年1月現在の新しい書き方を軽くまとめようと思った。
MP3を使う目的
- 音声を録音したMP3ファイルをスキル内で利用するため
開発環境
- Node.js 8.10.0
- ask-sdk 2.3.0
やり方
- 大きく分けて2パターンのやり方が用意されている
- ボイスや効果音、短い音楽を流す場合
- 音楽を聞かせる場合
ボイスや効果音、短い音楽を流す場合
- SSML の audio タグを使う
audio タグ
- MP3の要件が決まっていて、場合によっては変換ソフトを使う必要あり
- 要件により音質は低め
MP3 の要件
- MP3には、ユーザーに固有な情報や、その他の機密情報が含まれていてはなりません。
- MP3は、有効なMP3ファイル(MPEGバージョン2)である必要があります。
- 240秒以内
- ビットレート:48 kbps
- サンプルレート:22050Hz、24000Hz、16000Hzのいずれか
- 用意したMP3のビットレートとサンプルレートが違っていたみたいなので、 Amazon が勧めてた FFmpeg という変換ソフトを使いました。
- Windowsの場合:ダウンロードしたら zip を解凍して bin フォルダ内で(あるいは環境変数設定後)コマンドプロンプトを開き、以下のコマンドを実施
> ffmpeg -i <input-file> -ac 2 -codec:a libmp3lame -b:a 48k -ar 16000 <output-file.mp3>
実装
- handle の中身だけ記載
- MP3が要件を満たしてないと、Alexaコンソールからテストした時にエラーになります。
return handlerInput.responseBuilder
.speak('<audio src="url" />')
.getResponse();
音楽を聞かせる場合
- AudioPlayer ディレクティブを使う
AudioPlayer ディレクティブ
- audio タグよりも長いMP3を再生できる
- 通常のオーティオプレイヤーのように、途中で再生を止めて、また再開させるというような操作が可能
- サポートされているオーディオファイルのフォーマットは、AAC/MP4、MP3、HLSなどです。ビットレート: 16kbps~384kbps
- これらは公式の
AudioPlayerインターフェースのリファレンス
からの情報ですが、 audio タグと違い、最大秒数やサンプルレートに関する記載は今の所ありませんでした。とりあえず audio タグの制限である240秒以上の再生が可能であることは確認済みです。
実装
- handle の中身だけ記載
- お試しで一曲流したいだけなら上記にURLを入れれば動きます。
return handlerInput.responseBuilder
.addAudioPlayerPlayDirective('REPLACE_ALL', 'url', 'token', 0, null)
.getResponse();
-
addAudioPlayerPlayDirective
のパラメータの詳細 (リファレンスより)
addAudioPlayerPlayDirective(
playBehavior: interfaces.audioplayer.PlayBehavior,
url: string,
token: string,
offsetInMilliseconds: number,
expectedPreviousToken?: string,
audioItemMetadata? : AudioItemMetadata);
- 現時点でドキュメントがあまりに乏しすぎるので、
addAudioPlayerPlayDirective
のパラメータ等に関しては詳しく知るにはクラスメソッドさんの記事がベストだと思います。 -
addAudioPlayerPlayDirective
の他にも AudioPlayer 関連メソッドがありますが、ここでは割愛します。
おわり
- 今回はちょっとした音声ファイルが対象だったので、1つ目の方法である
audio タグ
を使って実装しました。