tktts_voicevox.py ライブラリ技術ドキュメント

ライブラリの機能や目的

tktts_voicevox.py は、PythonアプリケーションからVOICEVOXエンジンを介してテキストを音声合成するためのライブラリです。VOICEVOX REST APIと連携し、テキストを音声ファイル(WAV形式)として出力する機能を提供します。

主な目的と機能は以下の通りです。

  • VOICEVOXエンジンとの連携: VOICEVOXエンジンのREST API (/speakers, /audio_query, /synthesis) を利用して、テキスト音声合成を行います。

  • 利用可能な話者の取得と解決: VOICEVOXエンジンで利用可能な話者情報(名前、スタイル、ID)を取得し、ユーザーが指定した話者名(部分一致含む)からVOICEVOXのspeaker IDを解決します。

  • テキスト音声合成: 指定されたテキストと話者IDに基づき、VOICEVOXエンジンで音声合成を実行し、結果をWAVファイルとして保存します。話速やピッチの調整も可能です。

  • 対話形式のテキスト処理: 複数の話者による対話テキストを解析し、話者ごとに適切な音声合成を行い、個々の一時音声ファイルとして出力する機能を提供します。これにより、複雑な対話シナリオでの音声生成を容易にします。

  • 依存関係チェック: 必要な非標準ライブラリ(requests)がインストールされているかを起動時にチェックし、不足している場合はユーザーにインストール方法を案内して終了します。

本ライブラリは、VOICEVOXをバックエンドとするテキスト音声合成機能を、他のPythonプログラムに組み込むことを目的としています。

importする方法

tktts_voicevox.py ライブラリを他のPythonプログラムから利用するには、通常のPythonモジュールと同様に import 文を使用します。

import tktts_voicevox

あるいは、特定の関数のみをインポートすることも可能です。

from tktts_voicevox import speak, get_available_voices

必要な非標準ライブラリとインストール方法

このライブラリは、以下の非標準ライブラリに依存しています。

  • requests: HTTPリクエストを送信するために使用されます。VOICEVOXエンジンのREST APIとの通信に必須です。

これらのライブラリは、pip コマンドを使用してインストールできます。

pip install requests

また、このライブラリは tktts_base という別のライブラリから以下の関数をインポートしています。tktts_base も別途インストールまたは利用可能な状態にしておく必要がありますが、そのインストール方法はこのドキュメントの範囲外です。

  • apply_replacements

  • normalize_speaker

  • split_dialogue

importできる変数と関数

変数

  • TTS_ENGINE_NAME: VOICEVOXエンジンの名前を示す文字列。常に 'voicevox' です。

  • DEFAULT_VOICEVOX_VOICE: デフォルトで使用されるVOICEVOXの話者名。初期値は "四国めたん" です。

  • DEFAULT_ENDPOINT: VOICEVOXエンジンのREST APIエンドポイントのデフォルトURL。初期値は "http://127.0.0.1:50021" です。

関数

get_available_voices_info(endpoint=DEFAULT_ENDPOINT)

VOICEVOXエンジンから利用可能な話者(ボイススタイルを含む)の情報を取得します。

  • 動作: 指定されたVOICEVOXエンドポイントの /speakers APIにGETリクエストを送信し、利用可能な話者の詳細情報を取得してリスト形式で返します。

  • 引数:

    • endpoint (str, オプション): VOICEVOX APIのエンドポイントURL。デフォルトは DEFAULT_ENDPOINT です。

  • 戻り値:

    • list: 各要素が話者の名前、スタイル、IDを含む辞書であるリストです。 例: [{"name": "四国めたん", "style": "ノーマル", "id": 2}, ...]

get_available_voices(endpoint=DEFAULT_ENDPOINT)

利用可能な話者名を「話者名(スタイル名)」の形式で取得します。

  • 動作: get_available_voices_info を呼び出して話者情報を取得し、ユーザーフレンドリーな形式の文字列リストに変換します。

  • 引数:

    • endpoint (str, オプション): VOICEVOX APIのエンドポイントURL。デフォルトは DEFAULT_ENDPOINT です。

  • 戻り値:

    • list of str: 利用可能な話者名とスタイルを組み合わせた文字列のリストです。 例: ["四国めたん(ノーマル)", "ずんだもん(ノーマル)", ...]

    • 利用可能なボイスがない場合は False を返します。

list_available_voices(endpoint=DEFAULT_ENDPOINT)

利用可能なVOICEVOXの話者をコンソールに出力します。

  • 動作: get_available_voices_info を使用して話者情報を取得し、それぞれの話者の名前、スタイル、IDを整形して標準出力に表示します。

  • 引数:

    • endpoint (str, オプション): VOICEVOX APIのエンドポイントURL。デフォルトは DEFAULT_ENDPOINT です。

  • 戻り値:

    • bool: 利用可能な話者がある場合は True、ない場合は False を返します。

resolve_speaker_id(speaker_name, endpoint=DEFAULT_ENDPOINT, speakers_dict = None)

与えられた話者名(フルネームまたは部分文字列)から、最初に一致したVOICEVOXのspeaker IDを解決します。

  • 動作: 指定された speaker_name が、利用可能な話者名またはスタイル名に含まれるかを検索します。大文字小文字は区別されません。speakers_dict が提供されていればそれを使用し、なければ get_available_voices_info を呼び出して取得します。normalize_speaker 関数を使用して speaker_name を正規化します。

  • 引数:

    • speaker_name (str): 検索する話者名またはスタイル名。

    • endpoint (str, オプション): VOICEVOX APIのエンドポイントURL。デフォルトは DEFAULT_ENDPOINT です。

    • speakers_dict (list of dict, オプション): 既に取得済みの話者情報辞書のリスト。API呼び出しの最適化に使用されます。

  • 戻り値:

    • (list, int): (speakers_dict, speaker_id) のタプル。speakers_dict は更新された(または既存の)話者情報リスト、speaker_id は見つかった話者のVOICEVOX IDです。

  • 例外:

    • ValueError: 指定された話者が見つからない場合に発生します。

speak(outfile, text, voice, speak_rate = None, speak_pitch = None, endpoint = DEFAULT_ENDPOINT)

指定されたテキストをVOICEVOXで音声合成し、ファイルに保存します。

  • 動作:

    1. VOICEVOXの /audio_query APIを呼び出し、音声合成クエリを生成します。

    2. speak_ratespeak_pitch が指定されていれば、クエリにそれらを適用します。

    3. VOICEVOXの /synthesis APIを呼び出し、音声データを生成します。

    4. 生成された音声データをバイナリ形式で指定された outfile に書き込みます。

  • 引数:

    • outfile (str): 音声データを保存するファイルのパス。

    • text (str): 音声合成するテキスト。

    • voice (int): VOICEVOXのspeaker ID。

    • speak_rate (float, オプション): 話速のスケールファクター。デフォルトは None(VOICEVOXのデフォルトを使用)。

    • speak_pitch (float, オプション): ピッチのスケールファクター。デフォルトは None(VOICEVOXのデフォルトを使用)。

    • endpoint (str, オプション): VOICEVOX APIのエンドポイントURL。デフォルトは DEFAULT_ENDPOINT です。

  • 戻り値:

    • str: 成功した場合、出力ファイルのパスを返します。

    • None: 音声合成またはファイル保存に失敗した場合。

speak_dialogue(dialogue, replacements, target_voices, speakers = {}, temp_dir=".", outfile=None, ext="wav", endpoint=DEFAULT_ENDPOINT, cfg = None)

対話形式のテキストを解析し、複数の話者で音声合成を行い、一時ファイルに保存します。

  • 動作:

    1. 入力された対話テキストのリストを反復処理し、split_dialogue を使用して個々のセリフと話者に分割します。

    2. replacements があれば、apply_replacements を使用してテキストを置換します。

    3. target_voices が文字列型の場合、すべてのセリフにその話者を強制的に適用します。

    4. resolve_speaker_id を使用して話者名からVOICEVOXのspeaker IDを解決します。

    5. speak 関数を呼び出し、各セリフを個々の一時音声ファイルとして temp_dir に保存します。

    6. cfg オブジェクトがあれば、そこから fspeak_rate, fspeak_pitch, monologue の設定を読み込み、話速やピッチの調整、モノローグモードの判断に使用します。

  • 引数:

    • dialogue (list of str): 対話テキストのリスト。

    • replacements (dict): テキスト置換ルールを定義する辞書。tktts_base.apply_replacements に渡されます。

    • target_voices (str or list): 音声合成に使用する話者を指定します。文字列の場合、全てのセリフがその話者で合成されます。リストの場合、split_dialogue が話者を決定します。

    • speakers (dict, オプション): 話者名のマッピング辞書。tktts_base.split_dialogue に渡されます。デフォルトは空の辞書です。

    • temp_dir (str, オプション): 生成される一時音声ファイルを保存するディレクトリパス。デフォルトは "." (カレントディレクトリ) です。

    • outfile (str, オプション): 最終的な結合ファイルパス。現在の実装では一時ファイルのリストを返すため、直接的な使用は限定的です。デフォルトは None です。

    • ext (str, オプション): 出力音声ファイルの拡張子(例: "wav")。デフォルトは "wav" です。

    • endpoint (str, オプション): VOICEVOX APIのエンドポイントURL。デフォルトは DEFAULT_ENDPOINT です。

    • cfg (object, オプション): 設定オブジェクト。fspeak_rate, fspeak_pitch, monologue などの属性を持つことが期待されます。

  • 戻り値:

    • (bool, list): (success, tmpfiles) のタプル。success は処理が成功したかどうかを示すブール値、tmpfiles は生成された一時音声ファイルのパスのリストです。

main scriptとして実行したときの動作

tktts_voicevox.py には if __name__ == "__main__": ブロックが存在しないため、このファイルを直接Pythonインタプリタで実行しても、特別なスクリプトとしての動作は定義されていません。

ただし、ファイルの冒頭で requests ライブラリの存在チェックが行われます。もし requests がインストールされていない状態でこのファイルを直接実行したり、他のスクリプトからインポートしたりしようとすると、以下のエラーメッセージが表示され、ユーザーの入力待ち(Press ENTER to terminate>>)の後にプログラムが終了します。

Error: Missing libraries:
requests
  install: pip install requests

Press ENTER to terminate>>

これは、ライブラリの依存関係を明示し、不足している場合に適切な指示をユーザーに提供するための仕組みです。