[Alexa] SSMLのAudioタグで応答に効果音を挿入する

2017.07.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

この記事は、2018/02/18 日本語対応も含め、最新版にリメイクされました。是非、こちらをご参照下さい。

1 はじめに

Amazon Alexa(以下、Alexa)の応答で、休止を入れたり、数字文字列を電話番号として発声したい場合、Speech Synthesis Markup Language SSML(音声合成マークアップ言語 以下、SSML) が利用されますが、このSSMLのタグの一つにAudioタグがあります。

Audioタグを利用すると、応答の中にAudioファイルを挿入することが可能です。

以下は、Audioタグを利用している、簡単な例です。

<speak> 
    Welcome to Sample Skill. 
    <audio src=\"https://exsample.com/sample.mp3\" />
</speak>

2 Audioタグ

Audioタグでは、MP3ファイルのURLを指定します。

使用するMP3ファイルは、次の要件(制限)があります。

  • HTTPS(有効な証明書が必要)
  • 顧客固有情報や機密情報は含まない
  • MPEGバージョン2
  • 90秒以下
  • ビットレートは、48kbps
  • サンプルレートは、16000Hz

また、1つの応答には、複数のAudioタグを含める事が可能ですが、以下の制限があります。

  • 指定は5つまで
  • 合計時間は90秒以内

制限に従わない指定があった場合、タグ開始の所で応答がエラーとなり、結果的に、応答が途切れてしまうことになります。

3 Audioの確認

ffmpegを利用すると、MP3ファイルが要件に対応しているかどうかを確認することができます。
FFmpeg

下記のコマンドは、sample.mp3の情報を見ているようすです。

$ ffmpeg -i sample.mp3
ffmpeg version 3.3.2 Copyright (c) 2000-2017 the FFmpeg developers
  built with Apple LLVM version 8.1.0 (clang-802.0.42)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.2 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda
  libavutil      55. 58.100 / 55. 58.100
  libavcodec     57. 89.100 / 57. 89.100
  libavformat    57. 71.100 / 57. 71.100
  libavdevice    57.  6.100 / 57.  6.100
  libavfilter     6. 82.100 /  6. 82.100
  libavresample   3.  5.  0 /  3.  5.  0
  libswscale      4.  6.100 /  4.  6.100
  libswresample   2.  7.100 /  2.  7.100
  libpostproc    54.  5.100 / 54.  5.100
Input #0, mp3, from 'sample.mp3':
  Metadata:
    title           : BachFƒgƒbƒJ[ƒ^‚ƃt[ƒK BWV565
    artist          : WalchaF‚P‚X‚S‚V”N˜^‰¹
    album           : BachFƒgƒbƒJ[ƒ^‚ƃt[ƒK BWV565
    track           : 1
    encoder         : SuperTagEditor Ver 2.00ƒÀ7‰ü
    genre           : ŠíŠy‹Èi‚»‚Ì‘¼j
    date            : 1947
  Duration: 00:09:15.39, start: 0.025057, bitrate: 128 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, mono, s16p, 128 kb/s
    Metadata:
      encoder         : LAME3.93

出力から、ビットレート、128 kb/s、サンプリング周波数、44100Hz そして、再生時間が、約9分15秒39であることが分かります。

4 Audio変換

ffmpegでは、Audioタグの要件に合わせてファイルを変換することが可能です。

次のコマンドは、<input-file>に指定されたAudioファイル(mp3で無くても可能です)を、変換しています。

$ ffmpeg -i <input-file> -ac 2 -codec:a libmp3lame -b:a 48k -ar 16000 <output-file.mp3>
  • -b:a 48k ビットレート 48kbit/s
  • -ar 16000 サンプリングレート 16000Hz

また、Audioの再生時間を切り詰めたい場合は、次のように使用します。

下記は、開始時間(0秒)から終了時間(30秒)のファイルを生成する例です。

$ ffmpeg -i <input-file> -t 30 <output-file.mp3>

なお、再生時間を調整する場合、完全に正確な長さとなならないため、制限のギリギリである90(秒)を指定すると、問題が発生する場合があります。

下記は、-t 90と指定して、90秒のファイルを作成しているつもりですが、出力されたファル(output.mp3)は、Durationが1:30.04(90秒04)となっており、結果的にAudioタグの制限に抵触して応答は失敗します。

-t 89で変換すると、問題なく再生できていました。

$ ffmpeg -i sample.mp3 -t 90 output.mp3
$ ffmpeg -i output.mp3

・・・略・・・

  Duration: 00:01:30.04, start: 0.025057, bitrate: 64 kb/s
    Stream #0:0: Audio: mp3, 44100 Hz, mono, s16p, 64 kb/s

5 試してみた

下記のように、Audioタグを含んだ、SSMLを返すスキルを作成してみて、Amazon開発者コンソールのTestで再生してみました。

 "response": {
    "outputSpeech": {
      "type": "SSML",
      "ssml": "<speak> Good morning. It's time to wake up. <audio src=\"https://s3.amazonaws.com/XXXXXX/sample.mp3\" /> </speak>"
    },

6 最後に

今回は、SSMLに挿入可能なAudioタグについて確認してみました。 MP3の要件さえ合わせれば、簡単に利用することができます。効果音などとして使ってみると面白いかもしれません。

サンプルの音源は、下記のものを利用させて頂きました。
効果音ラボ

7 参考リンク


Speech Synthesis Markup Language (SSML) Reference
[Alexa] SSMLの組み立てが超便利なssml-builderについて