🗣️

Gemini TTS API を用いたテキスト音声変換機能の検証と基盤整備(開発日記 No.114)

に公開

関連リンク

はじめに

昨日は、Gemini TTS API を用いたテキスト音声変換機能の検証を進めました。本日は、APIからの出力音声ファイルが再生できない問題の解決と、今後の機能拡張に向けた基盤整備を行います。

背景と目的

Gemini TTS API を利用して、テキストから音声を生成する機能の実装を目指しています。しかし、APIから出力された音声ファイルが正しく再生できないという問題が発生しました。この問題を解決し、安定したテキスト音声変換基盤を構築することが本日の目的です。また、将来的な機能拡張を見据え、必要な準備を行います。

検討内容

音声ファイルが再生できない原因を調査した結果、Gemini TTS API が返すデータが WAV ヘッダーを含まない生の PCM データであることが判明しました。このため、PCM データに手動で WAV ヘッダーを付加する方法を検討しました。

実装内容

  1. test_tts.py の修正:

    test_tts.py スクリプト内の save_binary_file 関数を修正し、API から受信した PCM データに WAV ヘッダーを付加する処理を追加しました。

    import wave
    import struct
    
    def save_binary_file(filename, data):
        # WAVヘッダーのパラメータ
        channels = 1  # モノラル
        sample_rate = 24000 # サンプルレート
        sample_width = 2 # 16bit
        n_frames = len(data) // sample_width
    
        # WAVヘッダーを書き込む
        with wave.open(filename, 'wb') as wf:
            wf.setnchannels(channels)
            wf.setsampwidth(sample_width)
            wf.setframerate(sample_rate)
            wf.setnframes(n_frames)
            wf.writeframes(data)
    
  2. check_audio.py の削除:

    デバッグ用に作成した check_audio.py は不要になったため削除しました。

技術的なポイント

Gemini TTS API から返される音声データが、WAV ヘッダーを含まない生の PCM データであるという点に気づけたことが、今回の問題解決の鍵となりました。適切な WAV ヘッダーを手動で付加することで、音声ファイルを正しく再生できるようになりました。

所感

当初、API から出力された音声ファイルが再生できないという問題に直面し、原因特定に苦労しました。しかし、エラーメッセージやAPIの仕様を詳細に調べた結果、データの形式が原因であることがわかり、解決策を見出すことができました。問題解決を通じて、音声データの形式やヘッダー情報の重要性を再認識しました。また、API のドキュメントを注意深く読むことの重要性を改めて実感しました。

今後の課題

今後は、以下の課題に取り組む予定です。

  • 異なる音声の選択機能の実装
  • 感情表現の追加機能の実装
  • 生成する音声の台本を外部ファイルから読み込む機能の改善

まとめ

Gemini TTS API を用いたテキスト音声変換機能において、音声ファイルが再生できないという問題を解決しました。WAV ヘッダーを手動で付加することで、音声ファイルを正しく再生できるようになり、今後の機能拡張に向けた基盤を整備することができました。

GitHubで編集を提案

Discussion