TTS音声の同一話者内での対話ごとの速度調整検証(開発日記 No.116)
関連リンク
はじめに
昨日はTTS(テキスト音声合成)の品質検証として、長文台本での自然な会話を試みましたが、話すペースの調整が課題として残りました。今日は、その課題を踏まえ、同一話者内での対話ごとの速度調整の検証を行います。
背景と目的
前回の開発で、話者ごとの速度調整は可能になったものの、同一話者内での対話ごとに速度を変えることができませんでした。そこで、今回は同一話者内での対話ごとの速度調整が可能かどうかを検証し、より自然な会話表現を目指します。
検討内容
まず、現在のTTS実装が同一話者内での対話ごとの速度調整に対応しているか調査します。次に、対応するためのAPIや設定の有無を確認し、テストケースを作成して実験を行います。実験結果を評価し、実現可能性を検討します。gemini-2.5-flash-preview-tts
モデルにおけるSSML(特に<prosody>
タグ)の正確なサポート状況について、公式ドキュメントや追加のWeb調査で詳細に確認することも検討します。より高度なSSML制御が必要な場合は、Google Cloud Text-to-Speech APIの導入も検討します。
実装内容
-
test_tts.py
を修正し、Google Gemini APIの音声合成機能がSSMLを直接処理できないことを考慮し、SSMLファイルを解析して自然言語の指示を含むプロンプトに変換するように実装しました。 - 同一話者内での対話ごとの速度調整を実現するため、
<prosody rate="...">
タグを「(ゆっくり話してください)」、「(速く話してください)」などの自然言語の指示に変換してプロンプトに含めるように変更しました。 -
tools/tts_test_dev/sample_script.ssml
を作成し、SSML形式での速度調整テストケースを定義しました。 -
output_audio_0.wav
を正常に生成し、同一話者内での速度調整が機能することを確認しました。 -
test_tts.py
、sample_script.ssml
、output_audio_0.wav
をGitコミット・プッシュしました。
補足: 開発中にgemini-1.5-flash
モデルをTTS専用モデルではないにもかかわらず一時的に使用してしまい、APIの制約によるエラー(音声出力不可)を経験しました。これはモデルの特性を誤解していたことによるもので、今後の開発におけるモデル選定の重要な教訓となりました。最終的には、TTS専用のgemini-2.5-flash-preview-tts
モデルを使用し、現在のライブラリバージョンに合わせたAPI呼び出し方法(genai.configure
とgenai.GenerativeModel
、辞書形式のgeneration_config
とspeech_config
)に修正することで、音声出力と自然言語プロンプトによる話速・ピッチ制御を実現しました。
# sample_script.ssml の例
<speak xmlns="http://www.w3.org/2001/10/synthesis">
<voice name="Puck">
<p>
<s>Speaker 1: (ゆっくり話してください) こんにちは。</s>
<s>Speaker 1: (速く話してください) 今日は良い天気ですね。</s>
</p>
</voice>
</speak>
技術的なポイント
SSMLを直接APIに渡すのではなく、自然言語の指示に変換することで、速度調整を実現した点が今回の技術的なポイントです。xml.etree.ElementTree
ライブラリを使用する際に、SSMLの名前空間を明示的に指定する必要があることを学びました。
所感
SSMLの解析に苦労しましたが、最終的に音声ファイルを生成できた時は達成感がありました。特に、<speak>
タグに名前空間が明示的に宣言されていない場合に、xml.etree.ElementTree
が要素を正しく認識しないという点に気づくまでに時間がかかりました。モデル選定の重要性も改めて認識しました。
今後の課題
- GitHub CLIでのプルリクエスト作成時に、すでにコミット済みであることとファイルパスの解釈に関するエラーが発生しました。今後は新規ブランチで作業し、プルリクエストを作成するフローを確立する必要があります。
-
test_tts.py
のSSML解析ロジックは改善されましたが、より複雑なSSML構造への対応やエラーハンドリングの強化を検討します。 - 音声生成の品質(特に自然さ)について、継続的な評価と改善が必要です。
- 長文のSSML入力に対するパフォーマンスと安定性の検証を行います。
まとめ
今回は、TTS音声の同一話者内での対話ごとの速度調整を検証し、SSMLを解析して自然言語の指示に変換することで実現しました。SSML解析の難しさやモデル選定の重要性を学びましたが、最終的に音声ファイルを生成できたことは大きな成果です。今後は、SSML解析ロジックの強化や音声品質の改善に取り組んでいきます。
Discussion