Zenn
🐥

[AWS] [Amazon Polly] [ffmpeg] Amazon Pollyとffmpegで長い文章を音声化したファイルを作成する

2025/03/24に公開

概要

Amazon Pollyで本一冊など長い文章を音声化したかったのですが、文字列長に制限があり、一発ではうまく行かなかったので、その方法について記載します。

Amazon Polly

Amazon PollyはText to Speechを行ってくれるサービスで、短い文字列ならAPI一発(StartSpeechSynthesisTask)で音声データをリアルタイム生成してくれます。下記が公式の紹介文章になります。

Amazon Polly は、オンデマンドで音声を生成し、あらゆるテキストを音声ストリームに変換する、
フルマネージドサービスです。深層学習テクノロジーを使用して、記事、ウェブページ、
PDF ドキュメント、他のテキスト読み上げ (TTS) の変換を行います。
Polly は、エンゲージメントとコンバージョンを実現する音声起動アプリケーションを
構築できるように、幅広い言語で数十種類のリアルな音声を提供します。
さまざまな地域や市場のユーザーの多様な言語、アクセシビリティ、学習ニーズに対応します。
強力なニューラルネットワークと生成音声エンジンがバックグラウンドで機能し、音声を合成します。
Amazon Polly API を既存のアプリケーションに統合して、すぐに音声対応にします。

長い文章用には非同期API(API_StartSpeechSynthesisTask)が用意されており、こちらはS3にファイルを出力してくれます。

Amazon Polly APIの文字列長の制約

ただ、いずれにも文字数に制限があります。API仕様としては例外TextLengthExceededExceptionの説明にその内容が明示されています。

TextLengthExceededException
The value of the "Text" parameter is longer than the accepted limits.
For the SynthesizeSpeech API, the limit for input text is a maximum of
6000 characters total, of which no more than 3000 can be billed characters.
For the StartSpeechSynthesisTask API, the maximum is 200,000 characters,
of which no more than 100,000 can be billed characters.
SSML tags are not counted as billed characters.

なお、ここでBilled CharactersCharactersの違いは、SSML tag部分です。SSML tagはSpeech Synthesis Markup Language (SSML)用のタグで、要は音声化の際に細かい指示を出すための言語です。こちらはinputの文字列上限としてカウントはされますが、Billed charactersとしてはカウントされません。

この文字数制限があるため、1 API呼び出しでAmazon Pollyで変換できる音声ファイルは100,000文字までとなります。通常はこの文字数で問題ないと思うのですが、本を丸々一本音声化したい、などといった場合は不足します。

解決策

このような場合には、文字数を制限に収まるように分割した上で複数の音声ファイルを出力し、その後、ffmpegなどを利用して、出力したファイルを結合することが考えられます。ffmpegはとても便利なツールなのですが、バイナリ形式での提供しかありません。(ffmpeg-pythonなどもバイナリが存在する前提のラッパーです。)そのため、今回はこちらをAWS CodeBuildを実行環境にインストールして利用しました。ffmpegをdownloadページから取得し、下記のようにconcatフィルタを利用して結合できます。

ffmpeg -i "concat:file1.mp2|file2.mp3)" -acodec copy output.mp3

最終的にはこのような構成になりました。

まとめ

本当はAWS Lambdaの実行時間が上限に当たらないかなど、もう少し気にするべきかと思うのですが、今回やりたかった範囲ではこの形で十分でしたのでヨシとしています。

Discussion

ログインするとコメントできます