0.7.0 — VOICEVOX 対応
1. 目的・背景
slidemovie は multiai-tts を通じて TTS(音声合成)を行い、ナレーション動画を生成する。
現状 slidemovie が対応している TTS プロバイダは以下の 3 つである。
google(Google GenAI)openai(OpenAI)azure(Azure Speech)
multiai-tts が新たに VOICEVOX に対応した(dev/multiai-tts.md 参照)。
本仕様書は、slidemovie を VOICEVOX に対応させるための変更点を定義する。
2. VOICEVOX の特徴(multiai-tts より)
dev/multiai-tts.md に基づく VOICEVOX の仕様は以下のとおり。
- ローカルエンジンとして動作する。既定の接続先は
http://127.0.0.1:50021。 利用時にエンジンが起動している必要がある。 - API キー不要。
- モデル指定は不要(
set_tts_provider('voicevox')のみで選択可能)。 - 話者は 整数の style ID で選択する(
client.tts_voice_voicevox = 3のように指定)。 - 接続先 URL は
client.tts_voicevox_urlで上書き可能(既定http://127.0.0.1:50021)。 - エンジンに到達できない場合、
client.errorにエラーメッセージ(エンジンが起動しているか確認を促す内容)が設定される。 - 日本語音声に強い。
multiai-tts での呼び出し方(参考)
client = multiai_tts.Prompt()
client.set_tts_provider('voicevox')
client.tts_voice_voicevox = 3 # 話者 style ID(整数)
# client.tts_voicevox_url = "http://127.0.0.1:50021" # 既定。必要なら上書き
client.save_tts("こんにちは。", "output.wav")
3. 設計方針
3.1 プロバイダ選択の分岐追加
slidemovie/core.py の _speak_to_wav() に voicevox 用の分岐を追加する。
Azure と同様、set_tts_provider('voicevox') を呼ぶだけでよく、モデル指定は不要。
現状の分岐(抜粋):
if self.tts_provider == 'openai':
client.set_tts_model(self.tts_provider, self.tts_model)
client.tts_voice_openai = self.tts_voice
if self.tts_provider == 'google':
client.set_tts_model(self.tts_provider, self.tts_model)
client.tts_voice_google = self.tts_voice
if self.tts_provider == 'azure':
client.set_tts_provider(self.tts_provider)
client.tts_voice_azure = self.tts_voice
追加する分岐:
if self.tts_provider == 'voicevox':
client.set_tts_provider(self.tts_provider)
client.tts_voice_voicevox = int(self.tts_voice) # style ID は整数
if self.tts_voicevox_url:
client.tts_voicevox_url = self.tts_voicevox_url
3.2 話者 ID(tts_voice)の型変換
slidemovieの既存設定tts_voiceは文字列として扱われている(例:"sadaltager")。- VOICEVOX は 整数の style ID を要求する。
- 設定ファイル・CLI からは文字列(例
"3")または整数(例3)のどちらでも渡されうるため、 VOICEVOX 分岐内でint(self.tts_voice)により整数へ変換する。 - 変換に失敗した場合(整数に変換できない値)は、分かりやすいエラーメッセージを出して終了する。
3.3 新規設定キー tts_voicevox_url
VOICEVOX エンジンの接続先を上書きできるよう、新しい設定キーを追加する。
| キー | 型 | 既定値 | 説明 |
|---|---|---|---|
tts_voicevox_url |
string / null | null |
VOICEVOX エンジンの URL。null の場合は multiai-tts の既定(http://127.0.0.1:50021)を使用する。 |
対応する変更:
_get_default_settings()に"tts_voicevox_url": Noneを追加。_get_tts_config()にtts_voicevox_urlを含め、設定変更検知(status.json)の対象とする。_load_audio_state()の後方互換バックフィル(既存 status.json に本キーが無い場合に既定を補う処理)にtts_voicevox_urlを追加し、既存プロジェクトで不要な変更検知プロンプトが出ないようにする。
3.4 プロンプト(tts_use_prompt)の扱い
multiai-ttsはスタイルプロンプトを本文に前置して合成する(全プロバイダ共通)。- VOICEVOX でスタイルプロンプト(例
"Please speak the following.")を有効にすると、 そのプロンプト文字列が読み上げられてしまう恐れがある。 - したがって VOICEVOX 使用時は
tts_use_promptをfalseにすることを推奨する (Azure・OpenAI と同様の運用)。既定値そのものは変更せず、ドキュメントで推奨を明記する。 - 実装上は既存の
tts_use_prompt判定ロジックをそのまま利用する(VOICEVOX 固有の強制無効化は行わない)。
3.5 CLI
--tts-provider voicevoxは既存の引数でそのまま指定可能(追加変更不要)。--tts-voiceで style ID(整数値の文字列)を指定可能(追加変更不要)。- 接続先 URL を CLI から上書きできるよう、任意で
--tts-voicevox-urlオプションを追加する。slidemovie/cli.pyにparser.add_argument("--tts-voicevox-url", ...)を追加。args.tts_voicevox_urlが指定された場合にmovie.tts_voicevox_urlを上書き。
4. 変更対象ファイル一覧
| ファイル | 変更内容 |
|---|---|
slidemovie/core.py |
_speak_to_wav() に voicevox 分岐を追加。_get_default_settings() / _get_tts_config() / _load_audio_state()(バックフィル)に tts_voicevox_url を追加。docstring 更新。 |
slidemovie/cli.py |
任意で --tts-voicevox-url オプションを追加し、movie.tts_voicevox_url へ反映。 |
docs/configuration.md |
TTS 設定表に voicevox プロバイダ、tts_voicevox_url キー、および前提条件(ローカルエンジン起動)を追記。設定例を追加。 |
docs/ja/configuration.md(存在する場合) |
日本語版ドキュメントの同様の更新。 |
README.md |
対応プロバイダに VOICEVOX を追記。 |
tests/test_core.py |
VOICEVOX 分岐・tts_voicevox_url 設定・tts_voice の整数変換のテストを追加。 |
5. 前提条件・ドキュメント記載事項
利用者向けドキュメント(docs/configuration.md 等)に以下を明記する。
- VOICEVOX エンジンを事前にローカルで起動しておく必要があること。
- API キーは不要であること。
tts_modelは不要(無視される)であること。tts_voiceには 話者の style ID(整数) を指定すること。tts_use_promptはfalseを推奨すること(プロンプトが読み上げられるのを防ぐため)。- 既定の接続先は
http://127.0.0.1:50021。変更する場合はtts_voicevox_url(または--tts-voicevox-url)を使用すること。
設定例(config.json)
{
"tts_provider": "voicevox",
"tts_voice": "3",
"tts_use_prompt": false
}
接続先を変更する場合:
{
"tts_provider": "voicevox",
"tts_voice": "3",
"tts_use_prompt": false,
"tts_voicevox_url": "http://127.0.0.1:50021"
}
6. エラーハンドリング
- VOICEVOX エンジンに到達できない場合、
multiai-ttsがclient.errorを設定する。 既存の_speak_to_wav()のリトライ/エラー処理に従い、エラーメッセージをログ出力する。 - エンジン未起動はリトライしても解消しない決定的失敗であるため、
3 分待って再試行するのは無駄が大きい。既存の
RESOURCE_EXHAUSTEDや分割失敗と同様に、 エンジン到達不可を示すエラーメッセージを検知したら即座に終了することが望ましい (エラーメッセージ文言に応じた判定を追加検討する)。 tts_voiceが整数へ変換できない場合は、設定ミスとして明確なメッセージを出し終了する。
7. テスト方針
tests/test_core.py(multiai_tts は MagicMock で差し替え済み)に以下を追加する。
tts_provider = 'voicevox'のとき_speak_to_wav()がclient.set_tts_provider('voicevox')を呼び、client.tts_voice_voicevoxに 整数が設定されることを確認する。tts_voice = "3"(文字列)が整数3に変換されることを確認する。tts_voicevox_urlが設定されている場合、client.tts_voicevox_urlに反映されることを確認する。tts_voicevox_urlが既定値(None)を含め、_get_tts_config()の戻り値に含まれることを確認する。- 既存 status.json に
tts_voicevox_urlが無くても、バックフィルにより変更検知プロンプトが 発生しないことを確認する。
8. 互換性・影響範囲
- 既存の
google/openai/azureの挙動には影響を与えない。 tts_voicevox_urlの既定値はNoneで、既存 status.json はバックフィルにより 無用な変更検知を起こさない。- 新規設定キーの追加のみで、既存設定ファイルはそのまま利用可能。
9. 作業手順(サマリ)
core.pyに VOICEVOX 分岐とtts_voicevox_urlを実装。cli.pyに--tts-voicevox-urlを追加。- テストを追加し、
pytestが通ることを確認。 - ドキュメント(
docs/configuration.md、日本語版、README.md)を更新。