CLIでAmazon Pollyで合成した音声をAlexaで再生する時にちょうどよいボリュームに調整する方法 #Alexa #AmazonPolly
English version is here.
はじめに
開発中のAlexaスキルで、通常のAlexaの声の合成音声で喋らせる代わりにAmazon Polly(以下Polly)の合成音声を再生した時に、Pollyが出力した音声ファイルをそのままAlexaで再生すると、以下のようにAlexaの音声のボリュームよりもだいぶ小さくて、非常に聞きづらく感じました。
本記事では、Amazon Pollyで合成した音声をAlexaで再生する時にちょうどよいボリュームに調整する方法をご紹介します。音声データのボリューム調整を行うツールはいろいろありますが、今回はSoXというOSSの音声処理ツールを使った、CLIのみでボリューム調整を行う手順をご紹介します。最終的に、上記の動画の音声が以下のように調整できました。
準備
SoXに加えて、Pollyからの音声の取得もCLIで行うので、aws-cliも必要です。
手順
まず、aws-cliを使ってPollyに音声を合成させます。
$ aws polly synthesize-speech --output-format pcm --voice-id Mizuki --text-type ssml --text 'これがAmazon Pollyで合成した音声です。' --sample-rate 16000 test.raw { "ContentType": "audio/pcm", "RequestCharacters": "31" }
サンプリング周波数はAlexaのSSMLのaudioタグの仕様に合わせて16kHzにします。出力形式はPCMにします。audioタグが受け付けるファイルフォーマットはMP3形式のみで、Pollyの出力形式でMP3を指定することもできるのですが、ビットレートが40kbps固定でaudioタグの仕様(48kbps)に合わず再変換が必要になるため、音声の加工は非圧縮の状態で行うことにしました。
以降はSoXだけで作業が完結します。 まず、PollyのPCM出力形式はそのままではSoXで処理できないため、WAV形式に変換します。
$ sox -r 16000 -b 16 -c 1 -L -e signed-integer -t raw test.raw -t wav test.wav
本題のボリュームの調整です。
$ sox test.wav test-norm.wav gain -n sox WARN dither: dither clipped 1 samples; decrease volume?
ボリューム(ゲイン)の係数を指定することもできましたが、ピークが最大音量(0dB)となるように、自動的にgainを調節するオプション-n
を指定するだけで体感上問題ない程度にまでボリュームを上げることができたので、今回はこのオプションを利用しました。
最後に、MP3形式に変換します。ビットレートは48kbpsに指定します。
$ sox test.wav -C 48 test.mp3
以上で、Alexaに再生させる時にちょうどよいボリュームになったPollyの音声MP3ファイルが出来上がりです。
おわりに
オーディオの編集を行うツールはいろいろありますが、今回はコマンドラインで処理を完結できるやり方でやってみました。 AlexaスキルのUXをより良いものにしようとする時に、Alexaの合成音声だけでなく、Pollyのような別サービスの合成音声を使うことが効果的な場合もあると思われますので、そういう時にSoXのようなツールは非常に重宝すると思います。
参考
- SoX - Sound eXchange
- AlexaのSSMLのaudioタグの仕様
- Amazon PollyをAWS CLIから使ってみる #reinvent | Developers.IO
- SynthesizeSpeech - Amazon Polly
- sox convert raw audio to wav gives error although all option are defined - Unix & Linux Stack Exchange
- 今更聞けない目的別soxの使い方
- soxコマンドで音声ファイルを編集する10の例 - アシアルブログ
- audio - sox - how to create mp3 file with bit rate 16kbps - Stack Overflow