Script2Voice 取扱説明書・操作マニュアル

本書は、台本ファイルから音声合成・空間音響処理・字幕(SRT)・編集タイムライン(FCPXML)・ ミックス済み音声(WAV)を一括生成するツール Script2Voice(Rust 版)の 取扱説明書です。インストールから台本の書き方、GUI の操作、挿絵を組み合わせた MP4 動画の書き出しまでを解説します。 早期反射・物理残響などの空間音響パラメータの詳細解説(第7章)も本書に統合されています。

1. Script2Voice とは

Script2Voice は、テキスト形式の「台本ファイル」を読み込み、登場人物(キャスト)ごとに 指定した音声合成エンジン(VOICEVOX / AivisSpeech / XTTS)で音声を生成し、 パン(左右の定位)・距離・残響などの空間音響処理を加えたうえで、 以下の成果物を自動生成するツールです。

台本ファイル(テキスト)を1つ用意するだけで、ナレーション動画やボイスドラマなどの 音声・字幕・編集タイムラインを一括して作成できることが最大の特長です。

操作方法はコマンドライン(CLI)と GUI の2通りがあります。 台本をまとめて処理するなら CLI(第3章)、 台詞を1行ずつ聴きながら空間音響を調整するなら GUI(第4章)が向いています。 どちらで実行しても生成される成果物は同じです。

さらに、挿絵等の静止画素材を用意すれば、生成した音声・字幕と組み合わせて MP4動画をそのまま書き出すこともできます(compose サブコマンド。 第5章 動画の作成を参照)。編集ソフトを使わずに、 静止画のスライドショー形式の動画を直接得たい場合に利用します。

2. 準備・セットアップ

2.1 ビルド方法

Rust ツールチェイン(cargo)がインストールされた環境で、プロジェクトのルートディレクトリから次を実行します。

# デバッグビルド(開発・動作確認用)
cargo build

# リリースビルド(実運用向け、最適化あり)
cargo build --release

ビルドが成功すると、実行ファイルは target/release/script2voice.exe(Windows の場合)に生成されます。 GUI(第4章)を使う場合は、同じビルドで target/release/s2v-gui.exe も生成されます(GUI だけをビルドするなら cargo build --release -p s2v-gui)。

script2voice.exe / s2v-gui.exe を任意の場所へコピーして使う場合は、 config.toml を実行ファイルと同じフォルダに置いてください (2.3)。GUI では音響ラボのプリセット presets.toml も同じ規約で読まれます。
動作確認やテストには cargo test --workspace を実行してください。 全クレート(s2v-core / s2v-engines / s2v-audio / s2v-export / s2v-video / s2v-gui / script2voice)の ユニットテストと統合テスト(E2E テスト)が一括で実行されます。

2.2 音声合成エンジンの起動

Script2Voice は HTTP 経由で音声合成エンジンに接続します。 VOICEVOX / AivisSpeech は、インストールされていれば Script2Voice が自動で見つけて起動するため、 通常は事前に起動しておく必要はありません(XTTS は exe_path を設定するか、事前に起動しておきます)。 エンジンが既に起動していれば(VOICEVOX アプリを開いている場合など)、それにそのまま接続します。

エンジンの自動起動・自動停止について
config.toml の各エンジンの設定に exe_path (実行ファイルのパス)を指定しておくと、Script2Voice は処理開始時に 接続確認を行い、応答がない場合は自動的にそのプロセスを起動して、 起動完了まで待機します(既定で最大60秒。各エンジンの startup_timeout_s で変更できます)。
また、処理が終了する際(成功・失敗を問わず)には、Script2Voice 自身が 起動したエンジンプロセスを自動的に停止します。VOICEVOX / AivisSpeech の run.exe のように エンジン本体を別プロセスとして起動するランチャーでも、本体まで含めて停止します。 複数の Script2Voice を同時に実行して同じエンジンを使っている場合は、最後の1つが終了した時点で停止します。
もともと起動済みだったエンジン(exe_path を介さずに 手動で起動していたエンジン)は停止されません。
VOICEVOX / AivisSpeech は exe_path を省略しても、インストール済みのエンジンを 自動で探して起動します(VOICEVOX 0.26 以降の %APPDATA%\voicevox\vvpp-engines 配下、 0.25 以前の Program Files\VOICEVOX\vv-engine 配下など)。 バージョンアップでエンジンの場所が変わっても、config.toml を書き換える必要はありません。
この機能を使わない場合は、これまで通り Script2Voice を実行する前に 手動でエンジンを起動しておいてください。
VOICEVOX / AivisSpeech のバージョンアップについて
エンジンのインストール・バージョンアップは利用者が各アプリで行います(Script2Voice はエンジンを同梱しません)。 VOICEVOX 0.26 以降はエンジンがエディタから分離され、アプリの初回起動時などにエンジンが導入されます。 バージョンアップ後に「エンジンの起動に失敗」と表示される場合は、VOICEVOX アプリを一度起動して エンジンの導入が終わっていることを確認してください。 標準以外の場所にエンジンを置いた場合だけ、exe_path でその場所を指定します。
エンジン名台本内の指定名既定の URL起動方法の例
VOICEVOX voicevox http://127.0.0.1:50021 VOICEVOX アプリを起動(または自動起動に任せる。0.25 以前は "C:\Program Files\VOICEVOX\vv-engine\run.exe")
AivisSpeech aivis http://127.0.0.1:10101 AivisSpeech アプリを起動(または自動起動に任せる。エンジン単体は "C:\Program Files\AivisSpeech\AivisSpeech-Engine\run.exe")
XTTS (Coqui TTS) xtts http://localhost:8020 python -m xtts_api_server --port 8020 --lowvram --model-version v2.0.2 --speaker-folder ./assets/speakers (exe_path/args で自動起動する場合は次項参照)

台本内で 使用しているエンジンのみが起動・利用されます (未使用のエンジンは起動チェックされません)。

2.3 config.toml の設定

実行時の挙動(接続先 URL、音響パラメータ、同時実行数、BGM 設定など)は プロジェクトルートの config.toml で設定します。 主な項目は次の通りです。

セクション / キー説明
[voicevox] urlVOICEVOX エンジンの接続先 URL
[aivis] urlAivisSpeech エンジンの接続先 URL
[xtts] urlXTTS エンジンの接続先 URL
[voicevox] / [aivis] / [xtts] exe_path (省略可)各エンジンの実行ファイルのパス。絶対パス(例: VOICEVOX/AivisSpeech の run.exe)と、PATH 上のコマンド名(例: "python")の どちらも指定できます。指定すると、未起動時に Script2Voice が自動的に起動し、 終了時に自動的に停止します (例: exe_path = "C:\\VOICEVOX\\run.exe"。 TOML 内ではバックスラッシュを \\ と二重に書くか、 'C:\VOICEVOX\run.exe' のようにシングルクォートで囲みます)。 [voicevox] / [aivis] では、省略した場合や指定したファイルが 存在しない場合(バージョンアップで場所が変わった等)、インストール済みのエンジンを 自動で探して使います(見つからない場合は警告します)。 [xtts] では、省略した場合は事前に手動で起動しておく必要があります。
[voicevox] / [aivis] / [xtts] args (省略可、既定は空配列)exe_path に渡す引数。 コマンドライン全体を1つの文字列に詰め込まず、トークンごとに配列要素として 分けてください。この形式ならパスに空白を含んでいてもクォート不要です (例: XTTS を python -m xtts_api_server --port 8020 で 起動する場合は次の通り)。
[xtts]
url = "http://localhost:8020"
exe_path = "python"
args = ["-m", "xtts_api_server", "--port", "8020"]
[audio] sample_rate出力音声のサンプリングレート (Hz)
[audio] microphone_spacing仮想ステレオマイクの間隔 (m)。既定 0.2m
[audio] sound_speed音速 (m/s)。両耳間の到達時間差 (ITD) の計算に使用
[audio] air_absorption_coeff空気吸収の係数。距離に応じた高音域の減衰の強さ
[audio] room_size場面の既定の部屋の広さ (0.0〜1.0)。@scene の room_size や寸法指定で上書き可
[audio] reverb_wet残響量の倍率(既定 1.0=物理量どおり)。部屋寸法と壁素材から算出される残響基準値に掛ける。@scene で上書き可
[audio] reference_dist / reference_gain_db / max_gain_db距離減衰や音量の基準値・上限値
[audio] mic_directivity / mic_angle仮想マイクの指向性の強さと向き(外開き ORTF 配置)。値が大きいほど定位の広がりが強くなる
[audio.early_reflections]空間音響(早期反射・物理残響)の設定。enabled(ON/OFF)、ear_height(聴取者の床からの高さ)、listener_offset、room_dims_min/room_dims_max(room_size 0→1 に対応する部屋寸法 [幅,奥行,高さ]m)、early_level、wet_distance_slope、および 5 素材(floor/ceiling/front_wall/back_wall/side_walls)の reflection_coeff・absorption_cutoff_hz。詳細は第7章 空間音響パラメータ解説を参照
[audio.engine_volume_offsets]エンジンごとの音量補正係数 (例: voicevox = 1.2)
[concurrency]エンジンごとの同時合成数、音響処理の並列数(0 = CPU コア数を自動使用)。 ただし XTTS はエンジン側がリクエスト単位ではなくグローバルな音声設定APIしか持たないため、 xtts の値に関わらず「設定更新→合成」は内部的に1台詞ずつ直列実行されます (他の台詞の設定が混入するのを防ぐため)。
[bgm] crossfade_s / se_fade_out_sBGM のクロスフェード秒数、SE のフェードアウト秒数
[http] connect_timeout_s / request_timeout_s(省略可、既定 10秒 / 180秒)エンジンへのHTTPリクエスト(バージョン確認・スピーカー一覧取得・音声合成)のタイムアウト。エンジンが接続だけ受け付けて応答しない場合に台詞の処理が無期限に待機するのを防ぐ
[export] fcpxml_2997fps(省略可、既定 false = 30fps)FCPXMLを29.97fps(NTSCドロップフレーム相当)で出力するか。字幕ズレ調査により、SRT/WAVとの時間基準を合わせるには30fpsが正しいことが確定している。29.97fps前提の編集環境にのみtrueにする
config.toml はプロジェクトルートに同梱のサンプル(config.toml)をコピーして、 接続先 URL や音響パラメータを環境に合わせて調整してください。
config.toml の配置場所について
--config オプションを省略した場合、Script2Voice は 実行ファイル(script2voice.exe)と同じフォルダにある config.toml を自動的に読み込みます(カレントディレクトリではありません)。
そのため、script2voice.exe と config.toml を同じフォルダに置いておけば、 どの場所から実行してもその設定ファイルが使われます。 別の設定ファイルを使いたい場合のみ --config で明示的にパスを指定してください (指定したパスが最優先されます)。

3. 基本操作

3.1 コマンドラインの使い方

script2voice <台本ファイル/フォルダ> [<台本ファイル/フォルダ> ...] [--config <設定ファイルのパス>]

台本は 複数指定でき、ファイルとフォルダを混在させられます。 フォルダを指定すると、その直下にある .txt ファイルが ファイル名の昇順でまとめて処理対象になります(サブフォルダは辿りません)。 同じ台本が重複して指定された場合は1回だけ処理されます。

引数 / オプション説明
<台本ファイル/フォルダ>(1個以上必須)処理対象の台本テキストファイル、または台本(.txt)を格納したフォルダのパス。複数指定・混在可
-c, --config <パス>設定ファイル (config.toml) のパス。省略時は実行ファイルと同じフォルダの config.toml が使用される
--no-strictパース警告(未定義キャストの台詞、空行なしで連続した @cast 定義の飲み込み、見つからない BGM/SE ファイルなど)があっても失敗にせず、警告を画面と run.log に出力したうえで処理を続行する。省略時は、パース警告が1件でもある台本をその場で失敗として扱う(台詞や効果音が静かに欠落する事態を防ぐため)
--strictパース警告のある台本を失敗として扱う。現在は既定の動作なので指定不要(以前の呼び出し方との互換のために受け付ける)。--no-strict と両方指定した場合は後に書いたほうが有効
-v, --verbose画面に出すログを詳しくする。-v で進捗(各フェーズの経過)まで、-vv でデバッグログまで表示する。省略時は警告・エラー・最終サマリだけを表示する(詳細は常にログファイルに残るため、通常は指定不要)

実行例:

# 台本を1つ処理(従来どおり)
script2voice .\scripts\episode01.txt
script2voice .\scripts\episode01.txt --config .\my_config.toml

# 複数の台本をまとめて処理(バッチ)
script2voice .\scripts\episode01.txt .\scripts\episode02.txt

# フォルダ内の .txt を名前順に一括処理
script2voice .\scripts

# ファイルとフォルダの混在も可
script2voice .\scripts 追加エピソード.txt
複数台本のバッチ処理について
複数の台本を指定すると、Script2Voice は1回の起動で全台本を順番に処理します。 このとき音声合成エンジンは最初に1度だけ起動して全台本で使い回し、 すべての処理が終わってから停止します。台本ごとにエンジンを起動し直さないため、 エンジンの起動待ち(特に AivisSpeech の初回モデルロード)がバッチ全体で1回だけになり、 多数の台本を処理するときに大幅に速くなります。
途中の台本でエラーが発生しても処理は中断されず、残りの台本を最後まで処理します。 終了時に成功・失敗の件数と、失敗した台本名・理由のサマリがログに出力されます (失敗が1件でもあれば終了コードは非0になります)。
ログの出力先
画面(標準エラー出力)には、既定では警告・エラー・最終サマリだけが出ます。 進捗を画面で追いたいときは -v を付けてください。標準出力には何も出さないため、 script2voice .\scripts > result.txt のようなリダイレクトやパイプの邪魔になりません。
詳細ログは、画面表示の設定にかかわらず常に次の2か所のファイルに残ります(-vv で表示されるデバッグログは画面のみで、ファイルには残りません)。
ファイル内容
<出力フォルダ>\run.logその台本1本分の全ログ。失敗した場合は失敗理由も末尾に記録される
%LOCALAPPDATA%\Script2Voice\logs\script2voice.log.<日付>起動から最終サマリまでの全ログ。バッチ全体の流れ、エンジンの起動状況、どの台本が失敗したかはここに残る。日付ごとに新しいファイルへ切り替わる
エクスプローラーのアドレス欄に %LOCALAPPDATA%\Script2Voice\logs と入力すると、全体ログのフォルダを開けます。

設定ファイルの探索順序は次の通りです。

  1. --config で明示的に指定したパス(最優先)
  2. (省略時)実行ファイル(script2voice.exe)と同じフォルダの config.toml

3.2 処理の流れ

  1. プロジェクトフォルダの作成 — 台本ファイルと同じフォルダの中に、台本ファイル名(拡張子なし)と同名のフォルダを作成します。以後の出力はすべてこのフォルダに格納されます。
  2. 台本の解析 — @scene / @pause / @asset / @cast / @script の各セクションを解析し、場面(シーン)と台詞・コマンドのリストを構築します。
  3. エンジンの起動確認 — 台本内で使用されているエンジン(VOICEVOX / AivisSpeech / XTTS)にのみ接続を試みます。
  4. 音声合成 + 空間音響処理(並列実行) — 台詞ごとに音声合成 → ステレオ化(パン・距離・残響などの DSP 処理)を行い、audio/ フォルダに個別の WAV ファイルとして出力します。
  5. タイムラインの構築 — @pause の設定や同時発声指示(#数字)に従って、各台詞・BGM・SE の再生開始時刻を計算します。
  6. 各種ファイルの書き出し — 字幕(SRT)、編集タイムライン(FCPXML)、ミックス済み音声(WAV) を出力します。
複数台本を指定した場合は、上記 1〜6 を台本ごとに繰り返します。 各台本はそれぞれ自分の名前のプロジェクトフォルダに出力されます。 音声合成エンジンの起動確認(手順 3)はバッチの最初に1回だけ行い、 全台本で必要なエンジン(各台本の @cast で使われているエンジンの和集合)を起動して使い回します。 ある台本の解析や処理が失敗しても、その台本を失敗として記録するだけで次の台本に進み、 全台本を処理しきってからエンジンを停止し、サマリを出力します。

3.3 出力されるファイル

処理が完了すると、台本ファイルと同じ場所に作成されたプロジェクトフォルダ (例: episode01/)に、以下のファイル・フォルダが生成されます。

パス内容
audio/voice_0001.wav, voice_0002.wav, ...台詞ごとに空間音響処理済みのステレオ WAV ファイル(連番)
timeline/subtitles.srt台詞のタイミングと表示テキストをまとめた字幕ファイル
timeline/timeline.fcpxml各音声クリップ・BGM・SE の配置を記録した FCPXML 形式の編集タイムライン(Final Cut Pro 等で読み込み可能)
timeline/timeline.json動画合成の正式入力となる、機械可読な JSON 形式のタイムライン
full_dialogue.wavすべての台詞をタイミング通りに重ね合わせてミックスしたステレオ音声
FCPXML は Final Cut Pro やそれに対応した編集ソフトに読み込むことで、 台詞・BGM・SE がタイムライン上に自動配置された状態から動画編集を開始できます。

4. GUI(s2v-gui)の使い方

Script2Voice には、コマンドラインを使わずに台本の試聴・一括実行・音響パラメータの調整ができる GUI アプリ s2v-gui.exe が付属します。用途は大きく2つです。

一括実行で生成されるファイルは CLI(3. 基本操作)とまったく同じです。 GUI は CLI の代替であって、別の出力形式を持つわけではありません。

4.1 起動と準備

# GUI のビルド
cargo build --release -p s2v-gui
# → target/release/s2v-gui.exe

s2v-gui.exe は、実行ファイルと同じフォルダに置かれた config.toml(CLI と同じ規約)と presets.toml(音響ラボのプリセット。任意)を読み込みます。 GUI には --config に相当する指定手段がないため、この配置が必須です。

ファイル置き場所無い場合
config.tomlexe と同じフォルダ画面に「config.toml を読めません」と赤字で表示され、試聴・一括実行はできません
presets.tomlexe と同じフォルダ組込みプリセットのみ使用(正常動作。4.4 参照)
s2v-gui.lastexe と同じフォルダ(自動生成)前回開いた台本のパスを記録するファイル。起動時にその台本を自動で開きます
音声合成エンジンの扱い
GUI は、試聴や一括実行で実際に必要になった時点で、台本が使っているエンジンだけを起動します (VOICEVOX / AivisSpeech はインストール先を自動で探します。XTTS は config.toml に exe_path を設定してある場合。2.2 参照)。 一度起動したエンジンは GUI を使っている間ずっと使い回され、 GUI を終了するときに、GUI 自身が起動したエンジンだけを停止します。

4.2 画面構成

位置内容
最上部タブ切替(📜 台本 / 🎛 音響ラボ)
中央選択中のタブの本体
下部再生バー(どのタブからでも共通。4.5)と、合成中・エラーの表示
最下部実行ログ(折りたたみ式。直近 500 行)

4.3 台本タブ — 試聴と一括実行

台本を開く

「📂 台本を開く...」で .txt の台本を選びます(UTF-8 保存。BOM 付きでも読めます)。 開いたパスは記憶され、次回起動時に自動で開かれます。

「保存時に自動再読込」にチェックを入れておくと(既定 ON)、 お使いのエディタで台本を編集して保存するたびに GUI 側が読み直します。 台本の編集機能は GUI にはありません。編集はエディタ、確認は GUI という分担です。

再読込すると行番号がずれる可能性があるため、選択中の行と、 音響ラボが参照している「台本の行」の音源はいったんクリアされます。

台本にパース上の警告(未定義キャストの台詞、空行なしで連続した @cast 定義の飲み込みなど)があると、 「⚠ ○行目: …」という橙色の行が画面上部に一覧表示されます。CLI は既定で警告のある台本を失敗として扱いますが、 GUI にはこの設定がなく警告があっても実行できるため、警告は自分で確認してください。

行リストと詳細

画面は左右2ペインです。左の行リストには「行番号・役名・台詞の冒頭」が並び、 クリックすると右の詳細に切り替わります。詳細では次が確認できます。

1行だけ試聴する

ボタン動作
▶ この行を試聴その行だけを合成し、空間音響処理をかけて再生します。結果はファイルとして残らず、一時フォルダに置かれます
🎛 ラボでこの行を調整 →音響ラボタブへ移動し、その行の音を音源に設定します。まだ試聴していない行なら自動で合成を始めます
試聴は同時に1件だけ実行されます(実行中はボタンが無効になります)。 また、エンジンの初回起動(特に AivisSpeech のモデルロード)を含むため、 最初の1回は30秒以上かかることがあります。 下部の再生バーに「行N を合成中…」と出ている間はお待ちください。

一括実行(全台詞の生成)

画面下部の一括実行ストリップから、開いている台本を丸ごと処理します。

表示 / ボタン説明
▶ 一括実行台本全体を処理します。出力は CLI と同一で、台本ファイルと同じ場所の「台本名」フォルダに生成されます(3.3 出力されるファイル)
⏹ キャンセル実行中の処理を中断します
実行中: ○○現在のフェーズ(合成中・ミックス中など)
進捗バーdone/total 行 の形で進捗を表示
✅ 完了 / 📁 出力フォルダを開く完了後、出力先をエクスプローラーで開けます
⚠ 赤字失敗の理由。詳細は最下部の実行ログに出ます
キャンセルと途中終了について
「⏹ キャンセル」は、音声合成がエンジンの応答待ちで止まっている最中でも即座に効きます。 中断すると、生成中に確保していた出力ロック(出力フォルダ内の .s2v_generation.lock)は解放され、 そのまま再実行できる状態に戻ります。GUI のウィンドウを「×」で閉じて途中終了した場合も同じ後始末が行われます。
GUI と CLI の機能差
GUI で一括実行できるのは開いている台本 1 本だけです。 複数台本のバッチ処理(3.1)、パース警告による失敗判定(--no-strict で無効化)、 動画への書き出し(第5章 compose)は CLI から実行してください。

4.4 音響ラボタブ — 空間音響の試行錯誤

同じ台詞に対して部屋の広さ・立ち位置・残響量を変えながら聴き比べ、 決まった値を @scene 行として台本へ持ち帰るためのタブです。 各パラメータの意味は第7章 空間音響パラメータ解説を参照してください。

音源を選ぶ

台本の行台本タブで試聴した行の音(空間音響処理をかける前の合成音)。まだ試聴していないと選べません
WAVファイル「選択...」で任意の WAV を読み込みます。合成エンジンを使わずに音響処理だけ試したいときに便利です

部屋の俯瞰図(ドラッグ操作)

左側には部屋を真上から見た図が表示されます。聴取者 👤 と話者 🔊 をドラッグすると、 その位置関係から listener_dx / listener_dy と pan / distance が自動で計算されます (逆に数値を変えれば図が動きます)。位置は部屋の内側にクランプされ、話者と聴取者は 0.1m 以上離れます。 図の下には現在の寸法と、そこから物理計算した残響時間 RT60 の目安が表示されます。

パラメータ

部屋 幅 W2〜60 m(room_w)
部屋 奥行 D2〜80 m(room_d)
部屋 高さ H2〜30 m(room_h)
聴取 高さ z0.2〜5 m(listener_z)
話者 高さ0〜5 m(height)
残響倍率0〜3(reverb_wet)
pan−180〜+180 度(+ が右)
距離0.1〜30 m

幅 W・奥行 D・高さ H はそれぞれ独立に、スライダーでも数値入力でも設定できます。

プリセット

次の4つが組み込まれています。「適用」を押すと現在の値に反映されます。

名前W×D×H備考
ラジオスタジオ4×5×3 mデッドな小部屋
会議室8×12×2.7 m標準的な室内
2000席ホール25×45×18 m聴取者は中央より後ろ寄り(listener_dy=-15)
屋外風(残響なし)50×50×30 mreverb_wet=0

独自のプリセットは、exe と同じフォルダの presets.toml に追記すると一覧の末尾に追加されます。 書かなかった項目は現在の値が維持されます(部屋だけ切り替えて pan/距離は保つ、といった使い方ができます)。

# presets.toml
[[preset]]
name = "録音ブース"
room_w = 2.5
room_d = 3.0
room_h = 2.4
listener_dx = 0.0
listener_dy = 0.0
listener_z = 1.2
reverb_wet = 0.6
# pan / distance / height は書かなければ現在値のまま
presets.toml の書式が壊れている場合は、橙色の警告を出したうえで 組込みプリセットだけで動作します(GUI は起動します)。

試聴と @scene 行の書き出し

  1. ▶ 処理して試聴 — 現在のパラメータで音響処理し、再生します。
  2. 結果はパラメータとセットで試聴履歴(最大 50 件)に積まれます。
  3. 履歴の行をクリックすると A / B が付き、下部の再生バーの「▶ A」「▶ B」で交互に聴き比べできます。
  4. 気に入った設定が決まったら、画面中央に表示されている @scene … の行を 📋 コピー して台本に貼り付けます。
@scene シーン名 room_w=25 room_d=45 room_h=18 listener_dx=0 listener_dy=-15 listener_z=1.1 reverb_wet=1
履歴の操作説明
▶その履歴の音を単体で再生
呼び戻すその履歴のパラメータをスライダーに戻す
💾 書き出しその履歴の WAV を任意の場所に保存
クリア履歴を空にする
試聴・履歴の WAV は一時フォルダに置かれ、GUI を終了すると削除されます。 残しておきたい音は「💾 書き出し」で保存してください。

4.5 再生バーと実行ログ

画面下部の再生バーは、どちらのタブにいても共通で使えます。

▶直前に鳴らした音をもう一度再生
⏹再生停止
再生中: ○○.wavいま鳴っているファイル名
▶ A / ▶ B音響ラボの履歴で A/B 指定した音を再生(聴き比べ用)

最下部の「実行ログ」を展開すると、合成・音響処理・エラーの詳細が時系列で確認できます。 試聴や一括実行がうまくいかないときは、まずここを確認してください。

5. 動画の作成(compose コマンド)

3. 基本操作で音声・字幕・タイムラインを生成したあと、 compose サブコマンドを使うと、そのプロジェクトフォルダに挿絵などの静止画(または動画クリップ)を 対応付けて、ひとつの MP4 動画として書き出せます。 台詞の段落ごとに画面が切り替わるスライドショー形式の動画です。

この機能を使うには、ffmpeg と ffprobe(同じパッケージに同梱)が別途インストールされ、 PATH が通っている必要があります。Script2Voice 本体には同梱されていません。

5.1 全体の流れ

  1. 台本に #paragraph を入れて画面を切り替えたい位置を決める(5.2)
  2. script2voice <台本> で音声・字幕を生成する(3章)
  3. 段落数だけ画像(または動画クリップ)を用意する
  4. 段落番号と素材の対応を scene_map.json に書く(5.4)
  5. script2voice compose <プロジェクトフォルダ> で MP4 を書き出す(5.3)

5.2 段落(#paragraph)と画面の切り替わり

画面が切り替わる位置は、台本の #paragraph コマンド(6.6 コマンド一覧)で決まります。 #paragraph は台詞の間に@pause の paragraph 設定ぶんの無音を入れると同時に、 字幕 timeline/subtitles.srt に長さ0の [PARAGRAPH] マーカーを書き込みます。 compose はこのマーカーを読んで区間を切ります。 #paragraph 名称 と書くと [PARAGRAPH 名称] として出力されます(動画合成でカット名として使う機能は今後追加予定)。

台本の #paragraph の数動画の段落(=画面)数
0 個1(全編を1枚の画像で通す)
1 個2
N 個N + 1

各段落の長さは「前のマーカー〜次のマーカー」、最後の段落は「最後のマーカー〜音声全体の終わり」です。 音声の総時間は ffprobe で full_dialogue.wav(無ければ full_dialogue.mp3)から取得します。

段落番号は 1 始まりで、scene_map.json の index と対応します。 つまり「用意すべき画像の枚数 = #paragraph の数 + 1」です。

5.3 コマンドと引数

script2voice compose <プロジェクトフォルダ> [--scene-map <scene_map.jsonのパス>] [--burn-subtitle] [-o <出力ファイル.mp4>] [--generation <N>]
引数 / オプション説明
<プロジェクトフォルダ>(必須)3章で生成した出力フォルダ(audio/・timeline/・full_dialogue.wav 等が入っているフォルダ)
--scene-map <パス>scene_map.json のパス。省略時は <プロジェクトフォルダ>/scene_map.json を使用する
--burn-subtitle字幕(timeline/subtitles.srt)を映像に焼き込む(ハードサブ)
-o, --output <パス>出力する MP4 のパス。省略時は <プロジェクトフォルダ>/output.mp4(--generation N 指定時は output_N.mp4)。既存のファイルは警告を表示したうえで上書きする
--generation <N>出力ロックで連番 _N に退避された生成一式(full_dialogue_N.wav と timeline/subtitles_N.srt)から動画を作る。N は 1 以上。省略時は連番なしの full_dialogue.wav / timeline/subtitles.srt を使う

実行例:

# プロジェクトフォルダ直下の scene_map.json を使って動画化
script2voice compose .\scripts\episode01

# scene_map.json の場所と出力先を明示し、字幕を焼き込む
script2voice compose .\scripts\episode01 --scene-map .\assets\episode01_scenes.json --burn-subtitle -o .\out\episode01.mp4
compose は音声合成を行いません。既に生成済みのプロジェクトフォルダを入力にする、 独立した後処理コマンドです(音声合成エンジンの起動も不要)。 台本を修正したときは、先に通常の生成をやり直してから compose を実行してください。

5.4 scene_map.json の書式

段落番号(1始まり)ごとに、表示する画像または動画クリップを指定する JSON ファイルです。

{
  "paragraphs": [
    { "index": 1, "type": "image", "path": "images/scene01.png" },
    { "index": 2, "type": "video", "path": "clips/scene02.mp4" },
    { "index": 3, "image": "images/scene03.png" }
  ],
  "default_image": "images/fallback.png"
}
paragraphs[].index対応する段落番号(1始まり、重複不可。段落数を超える番号もエラー)
paragraphs[].type"image" または "video"。省略時は "image" 扱い(他の値はエラー)
paragraphs[].path画像/動画ファイルのパス。scene_map.json の置かれたフォルダからの相対パス、または絶対パス
paragraphs[].imagepath の代わりに使える旧形式のキー(常に画像として扱われる)。新規に作成する場合は type + path の形式を推奨
default_image(任意)paragraphs に対応エントリが無い段落番号に使うフォールバック画像
各段落に対応するエントリが paragraphs になく、default_image も設定されていない場合はエラーになります。 すべての段落に画像(または default_image)が行き渡るように用意してください。 指定したファイルが実在しない場合も、ffmpeg を起動する前にエラーとして報告されます。

5.5 生成される動画の仕様

解像度1920×1080(フル HD 固定)
映像コーデックH.264(libx264)/ CRF 18 / yuv420p
音声full_dialogue.wav(無ければ .mp3)を AAC に変換して収録
素材の収め方アスペクト比を保って縮小し、余白は中央寄せの黒帯で埋めます(切り取りはしません)
その他+faststart(ストリーミング再生向けにインデックスを先頭へ配置)

素材の種類による違いは次の通りです。

素材段落の長さに対する挙動
画像(image)段落の長さぶん静止表示します(画像1枚を引き伸ばして表示)
動画クリップ(video)クリップが段落より長ければ先頭から切り詰め、短ければ最終フレームで静止して不足分を埋めます。クリップの音声は使われません(音声は full_dialogue のみ)
1920×1080 に合わせた素材(16:9)を用意すると黒帯が出ません。 縦長・正方形の画像でも動作しますが、左右に黒帯が入ります。

5.6 挿絵の用意について

Script2Voice は画像を生成しません。あらかじめ用意した画像ファイルを scene_map.json で段落番号に割り当てる、という役割分担です。

挿絵のもとになるプロンプトは、@scene の情景描写(自由記述)や @cast の外見描写(自由記述)に書いておき、 それを画像生成 AI に渡す運用を想定しています。台本の中に「その場面がどう見えるか」を書いておけば、 台本ファイル1つで音と絵の両方の指示がまとまります。

5.7 うまくいかないときは

症状主な原因と対処
「ffprobe の実行に失敗しました」の原因に「30 秒でタイムアウトしました」と表示される音声・動画ファイルの長さを調べる ffprobe が応答しませんでした。ファイルが壊れていないか、ネットワークドライブ上で読み込みが止まっていないかを確認してください
「ffprobe の実行に失敗しました」「ffmpeg の起動に失敗しました」ffmpeg / ffprobe がインストールされていないか、PATH が通っていません。ffmpeg -version がコマンドプロンプトで通ることを確認してください
「字幕を読めません」指定したフォルダが Script2Voice の出力フォルダではありません(timeline/subtitles.srt が必要です)。台本ファイルではなく、生成されたプロジェクトフォルダを指定してください
「full_dialogue.wav / full_dialogue.mp3 が見つかりません」音声のミックスまで完了していません。先に通常の生成を成功させてください。生成時に出力ファイルが使用中で連番 _N の一式(full_dialogue_1.wav など)に保存された場合は、--generation N を指定してください
「段落番号 N に対応するアセットが無く、default_image も設定されていません」段落数(#paragraph の数 + 1)ぶんのエントリが scene_map.json にありません。default_image を設定するか、不足分を追加してください
画像が切り替わらない/全編が1枚のまま台本に #paragraph が1つも入っていません。切り替えたい位置に #paragraph を追加して、通常の生成からやり直してください
字幕が動画に出ない--burn-subtitle を付けていません。付けない場合、字幕は動画に含まれず subtitles.srt のまま残ります(プレイヤー側で外部字幕として読み込むこともできます)

6. 台本ファイルの書き方

台本ファイルはプレーンテキストで記述します。台本は次の5種類のセクションから構成され、 これらを場面ごとに繰り返し記述できます。

  1. @scene — 場面の開始を宣言する
  2. @pause — 無音時間(間)の設定
  3. @asset — BGM・SE 素材フォルダの指定
  4. @cast — 登場人物(キャスト)の定義
  5. @script — 台詞・各種音声出力の指示
# で始まる行はコメント、または特殊コマンドとして扱われます(詳細は 6.6 コマンド一覧を参照)。空行は無視されます。

6.1 @scene セクション — 場面の宣言

場面(シーン)の先頭で宣言します。場面名と音響場(部屋の大きさ・聴取者の位置・残響量)を指定できます。いずれのパラメータも省略可能です。

@scene 01_オープニング room_size=0.3 reverb_wet=1.0
@scene ホール room_w=25 room_d=45 room_h=18 listener_dy=-15 listener_z=1.1
場面名@scene の直後に書く任意の文字列(出力フォルダ名や FCPXML のクリップ識別等に利用)
room_size部屋の広さの簡易指定。0.0〜1.0、小さいほど狭い空間。省略時は config.toml の既定値。寸法(下記 room_w/d/h)が優先される
room_w / room_d / room_h部屋の幅・奥行・高さ(m)。3つすべて指定すると room_size より優先。座標は x=幅(左右)・y=奥行(前後=聴取者の正面)・z=高さ
listener_dx / listener_dy聴取者(ステレオマイク中心)の部屋中央からのオフセット(m。+x=右、+y=前)。省略時は config の値。前壁に寄せるとホール的な前方反射が強まる
listener_z聴取者(マイク中心)の床面からの絶対高さ(m)。省略時は config の ear_height
reverb_wet残響量の倍率(既定 1.0=物理量どおり)。部屋寸法と壁素材から算出される残響基準値に掛ける。0 で残響なし。省略時は config の既定値
残響の長さ・量、および床・壁・天井からの早期反射は、部屋寸法と各面の素材(反射率・吸音特性)から 物理的に決まります。素材の既定値や各面の調整は config.toml の [audio.early_reflections] で行います (壁・天井の反射率を 0 にすると屋外=床反射のみ・ほぼ無残響)。詳しくは 第7章 空間音響パラメータ解説を参照してください。

情景描写(自由記述)

@scene の宣言行の次の行から、次のセクション (@pause / @asset / @cast / @script)が現れるまでの行は、 その場面の情景・雰囲気を書いた自由記述として扱われます。

@scene 01_オープニング room_size=0.3
夕暮れの港町。潮風が吹き抜ける石畳の坂道。
遠くで汽笛が鳴り、カモメの声が響いている。

@cast
...
情景描写は音声合成には使用されません。第5章 動画の作成で使う 挿絵・動画クリップを用意する際に、画像生成AIへのプロンプトの元ネタとして (Claude等が台本を読んで作成する運用を想定)利用することを目的としています。省略可能です。
開始位置@scene 宣言行の次の行から
終了位置次のセクション(@pause/@asset/@cast/@script)の行の直前まで
空行の扱い区切りにならない。次のセクションが現れるまでの行がすべて自由記述として蓄積される(@cast の外見描写とは扱いが異なる点に注意)。ただし空行そのものは読み飛ばされ、自由記述には含まれない(空行をはさんだ前後の行は、改行1つでつながる)
禁止事項自由記述の行を @ で始めてはならない(行頭の @ はセクション区切りとして解釈されるため)

各場面には @asset / @cast / @script の各セクションを 含めることができます。新しい @scene が現れると、そこまでの内容で ひとつの場面が確定し、次の場面の解析が始まります。

6.2 @pause セクション — 間(無音)の設定

台詞と台詞の間、話者交替時、段落の区切りに挿入する無音時間(ミリ秒)を設定します。

@pause
sentence 200
cast 500
paragraph 1000
sentence ****同じ話者の台詞間に ****ms の無音を挿入する
cast ****話者が交代するときに ****ms の無音を挿入する
paragraph ****段落の区切り(#paragraph コマンド使用時)に ****ms の無音を挿入する

省略した項目は既定値(sentence: 200ms、cast: 500ms、paragraph: 1000ms)が使用されます。

6.3 @asset セクション — 素材フォルダの指定

BGM・効果音 (SE) の音源ファイルを格納したフォルダを指定します。

@asset
bgm_dir = ./assets/bgm
se_dir = ./assets/se
bgm_dirBGM 音源フォルダのパス(絶対パス・相対パスとも可。相対パスは実行時の作業フォルダ(カレントディレクトリ)が基準。空白を含むパスも指定できます)
se_dir効果音 (SE) 音源フォルダのパス(書き方は bgm_dir と同じ)
#bgm_start / #se にファイル名(相対パス)を書くと、それぞれ bgm_dir / se_dir のフォルダから探します。 絶対パスで書いた場合や、@asset でフォルダを指定していない場合は、書いたパスをそのまま使います。 ファイルが見つからないとパース警告になり、CLI では既定でその台本が失敗扱いになります(3.1 の --no-strict を参照)。 BGM/SE は 44.1kHz など出力と異なるサンプリングレートでも使えます(出力のレートへ自動で変換します)。

6.4 @cast セクション — キャスト(登場人物)の定義

台本中で発声する役(キャスト)ごとに、話者・音声合成エンジン・各種パラメータを定義します。

@cast
役名:話者名:スタイル,エンジン名,パラメータ1=値1,パラメータ2=値2,...
「スタイル」と「エンジン名」の区切りは カンマ(,)です。 コロン(:)で区切ると正しく解析されず、エンジン名が誤認識されます。 書式は必ず 役名:話者名:スタイル,エンジン名,... の形を守ってください。

記述例:

@cast
めたん:四国めたん:ノーマル,voicevox,pan=-30,distance=1.0,volume=1.0
まい:まい:ノーマル,aivis,pan=30,distance=1.0,volume=0.9
解説:Gitta Nikolina:default,xtts,language=ja,pan=0,distance=1.0
役名@script 内で発言者として指定する名前
話者名音声合成エンジン側の話者(スピーカー)名
スタイル発声スタイル(VOICEVOX / AivisSpeech のみ。XTTS の場合は default を指定)
エンジン名voicevox / aivis / xtts のいずれか
language発声言語。XTTS のみ有効(例: ja, en)。VOICEVOX/AivisSpeech は常に日本語
pan左右の定位(単位: 度)。+ で右方向、- で左方向
distance聴取者(マイク)までの距離(単位: m)
height話者の床面からの絶対高さ(単位: m)。省略時は聴取者と同じ高さ。床・天井反射の幾何に影響する。行内臨時パラメータ(例 めたん(height=0.3):…)では、その行限定の加算オフセットとして働く
volume音量の倍率(既定 1.0)
その他のパラメータ各エンジン固有のパラメータ(speedScale, pitchScale など)をそのまま 名前=値 の形式で指定可能
パラメータの値は、数値として読めれば数値、読めなければ文字列(language=en など)として扱います。 pan / distance / height / volume は数値でなければならず、数値でない場合は警告を出して既定値を使います。 nan や inf のような有限でない値は、どのパラメータでも警告を出して無視します(@scene 行・@pause・行内臨時パラメータも同様)。 役名:話者名:スタイル,... の形になっていない定義行(コロンが足りない行)も、行番号つきで警告されます。
pan(方向)・distance(距離)・height(高さ)は、外開き(ORTF 的)に配置した 仮想ステレオマイク(マイク間隔は config.toml の microphone_spacing、既定 0.2m)でとらえた音として、 到達時間差(ITD)・音量差(ILD)・床/壁/天井の早期反射を計算して定位を再現します。 pan は仕様どおり + で右、− で左に定位します。定位の強さ(広がり)は config.toml の mic_directivity / mic_angle で調整できます(値が大きいほど広がりが強い)。 詳しくは第7章 空間音響パラメータ解説を参照してください。

外見描写(自由記述)

各役の定義行(書式行)の次の行から、空行が来るまでの行は、 その役の外見・特徴を書いた自由記述として扱われます。

@cast
めたん:四国めたん:ノーマル,voicevox,pan=-30,distance=1.0
緑髪をショートボブにした、快活な印象の少女。制服の上に古びたコート。

まい:まい:ノーマル,aivis,pan=30,distance=1.0
物静かな雰囲気の女性。白いワンピース姿。
外見描写も情景描写と同様に音声合成には使用されません。第5章 動画の作成で使う 挿絵を用意する際の、画像生成AIへのプロンプトの元ネタとして利用することを想定しています。省略可能です。
複数の役を定義する場合は、役ごとに空行を1行以上はさんでください。 空行は次の役の定義行との区切りを兼ねるため、空行を入れずに次の役の定義行を続けて書くと、 その定義行が直前の役の外見描写として読み込まれてしまい、新しい役として登録されません。 また、定義行を書かずに自由記述だけを書いた場合は、その役自体が登録されない点にも注意してください。
開始位置各役の定義行の次の行から
終了位置空行が来るまで(空行は次の役の定義行との区切りを兼ねる)
禁止事項自由記述の行を @ で始めてはならない

6.5 @script セクション — 台詞と音声指示

場面内で実際に発声される台詞や、BGM・SE・無音などの指示を記述します。

役名:台詞テキスト
役名(臨時パラメータ):台詞テキスト
#コマンド
(空行)

基本の台詞

めたん:こんにちは、まいさん。

役名 は @cast セクションで定義済みの役名と一致させてください。

臨時パラメータ(その台詞だけ値を変える)

カッコ内に パラメータ名=±値 の形式で記述すると、 @cast で設定された値に対する増減(オフセット)として、その台詞限定で適用されます。 複数指定する場合はカンマで区切ります。

めたん(pan=15,distance=2):このセリフだけ定位と距離が変わります
めたん(pitchScale=+0.01,speedScale=+0.5):感情の高まりを声の変化で表現する例

6.6 コマンド一覧 (#行)

# で始まる行はコマンドとして解釈されます。

コマンド書式説明
コメント# コメント文(# の直後に空白)その行は無視されます
BGM 再生開始#bgm_start ファイル名.wav指定した BGM を再生開始します。ファイルは @asset の bgm_dir から検索されます(絶対パスで書いた場合はそのまま使用。見つからない場合はパース警告)
BGM 停止#bgm_stop再生中の BGM を停止します(クロスフェードあり)
効果音 (SE)#se ファイル名.wav指定した効果音を挿入します。ファイルは @asset の se_dir から検索されます(絶対パスで書いた場合はそのまま使用。見つからない場合はパース警告)
無音の挿入#pause ****その位置に ****ms の無音を挿入します
段落区切り#paragraph または #paragraph 名称段落の切れ目を示し、@pause の paragraph 設定の無音を挿入します。名称を付けると字幕に [PARAGRAPH 名称] として出力されます(動画合成でカット名・素材ファイル名として使う機能は今後追加予定。5.2)
同時発声#数字(例: #2)続く指定数の台詞を同時刻から同時に発声させます(複数キャラが同時に話す演出など)

同時発声の例(2人が同時に驚く演出):

#2
めたん(delay=500):きゃっ!何かしら今の音!?
まい:な、なんなのだ!? 地震なのだ!?

delay=**** を臨時パラメータとして指定すると、 同時発声の基準時刻からその台詞の発声開始を ****ms 遅らせることができます。

6.7 ルビ表記・台詞の書き方

誤読されやすい単語は、シングルクォーテーションで囲んで '表記|読み' の形式で指定すると、 音声合成では「読み」、字幕表示では「表記」が使われます。 区切りは半角の | のみで、全角の | は区切りとして扱われません。 表記・読みのどちらにも : を含めることができます。

めたん:'東京|とうきょう'に行く
項目結果
音声合成(読み上げ)に使われるテキストとうきょうに行く
字幕(SRT)に表示されるテキスト東京に行く

複数のルビを1つの台詞に含めることもできます。

解説:「'深淵|しんえん'より出でし'者|もの'、'黎明|れいめい'の光を掲げよ」……?

6.8 サンプル台本

ここまでの要素を組み合わせた台本の例を示します。

@pause
sentence 200
cast 500
paragraph 1000

@asset
bgm_dir = ./assets/bgm
se_dir = ./assets/se

@cast
めたん:四国めたん:ノーマル,voicevox,pan=-30,distance=1.0,volume=1.0
まい:まい:ノーマル,aivis,pan=30,distance=1.0,volume=1.0

@scene 01_オープニング room_size=0.3 reverb_wet=0.5
@script
#bgm_start morning_breeze.wav
めたん:こんにちは、まいさん。
まい:こんにちは、めたんさん。

#2
めたん(delay=500):きゃっ!何かしら今の音!?
まい:な、なんなのだ!? 地震なのだ!?

#se thunder_distant.wav
#pause 1500
めたん:'東京|とうきょう'にも、こんな音が響いたのかしら……。

#bgm_stop
#paragraph
まい:そろそろ向かいましょうか。

7. 空間音響パラメータ解説(早期反射・物理残響)

本章は、早期反射(イメージソース法)と 距離依存の残響量制御に関する設定パラメータの意味・追加場所・調整方法をまとめたものです。 すべて config.toml の数値設定のみで調整でき、プログラムの再ビルドは不要です。

7.1 この機能は何か

従来の音響処理は「直接音(左右の定位・距離減衰)→ いきなり拡散リバーブ(残響の尾)」 という構成で、その間を埋める早期反射が存在しませんでした。 人間の耳は、直接音の直後(数ミリ秒〜数十ミリ秒)に届く床・壁・天井からの最初の反射を 直接音と融合させて、「音が実在の空間の、その場所にある」と接地・外在化します。 これが無いと、左右の方向は分かっても距離・上下が曖昧になり、音が「宙に浮いて」聞こえます。

この機能は、部屋を箱(直方体)としてモデル化し、床・天井・前後左右の 6面の一次反射を計算して直接音の直後に加えます。これにより接地感が生まれます。 部屋の大きさは既存の room_size に連動します。

上下方向(仰角)の定位は耳介の形状(HRTF)に依存し、通常の2chステレオでは原理的に再現できません。 本機能は水平面のモデルですが、床反射などで「接地感」を補うことで「浮き」を軽減します。

7.2 追加場所(config.toml)

設定は実行ファイル(script2voice.exe)と同じフォルダにある config.toml の [audio] セクション内、新しいサブセクション [audio.early_reflections] に記述します。 配置は [audio] のスカラー設定(mic_angle など)すべての後、 かつ [audio.engine_volume_offsets] の前です。

[audio]
# ... sample_rate, microphone_spacing, ... , mic_directivity, mic_angle まで ...
mic_directivity = 0.2
mic_angle = 30.0

[audio.early_reflections]
enabled = true
ear_height = 1.2
listener_offset = [0.0, 0.0]
room_dims_min = [4.0, 5.0, 3.0]
room_dims_max = [25.0, 45.0, 18.0]
early_level = 1.0
wet_distance_slope = 0.1
floor      = { reflection_coeff = 0.5,  absorption_cutoff_hz = 3500.0 }
ceiling    = { reflection_coeff = 0.6,  absorption_cutoff_hz = 6000.0 }
front_wall = { reflection_coeff = 0.85, absorption_cutoff_hz = 10000.0 }
back_wall  = { reflection_coeff = 0.40, absorption_cutoff_hz = 4000.0 }
side_walls = { reflection_coeff = 0.70, absorption_cutoff_hz = 8000.0 }

[audio.engine_volume_offsets]
# ...
このセクション全体、あるいは個々の項目を省略しても動作します(後方互換)。 省略した項目は上記の既定値が使われます。既存の config.toml をそのまま使っても問題ありません。

7.3 空間モデルの考え方

7.3.1 座標系

箱(部屋):x∈[0,W]、y∈[0,D]、z∈[0,H](単位:メートル)
X 軸=幅(左右。+x が右)/Y 軸=奥行(前後。+y が聴取者の正面)/ Z 軸=高さ(上下。+z が上)

部屋の寸法 [W, D, H] は、room_size(0.0〜1.0)に応じて room_dims_min と room_dims_max の間を線形補間して決まります。 room_size=0.0 で最小(小スタジオ)、1.0 で最大(大ホール)です。

7.3.2 聴取者=マイク位置

聴取者の位置 = ステレオマイクペアの中心です。部屋の水平中央 (listener_offset でずらせる)・高さ ear_height に置かれます。 実際の収音は、その中心から左右に microphone_spacing/2(既定 ±0.1m)離れた2本のマイクで行われます (microphone_spacing は [audio] 既存設定)。

音源は、聴取者から見て台本の pan(方位角)・distance(距離)・height(高さ)の位置に 置かれます(height 省略時は聴取者と同じ高さ。7.7節参照)。各面の鏡像(イメージソース)から届く反射の 遅延・音量・左右方向がこの幾何から自動計算されます。

7.3.3 処理の流れ

音響処理は次の順で行われます。早期反射はこの2番目に挿入されました。

直接音(定位・距離減衰)
  → 早期反射(6面の一次反射)
  → 拡散リバーブ(残響の尾)
  → リミッター(音割れ防止)

7.4 パラメータ詳細

7.4.1 全体・部屋・聴取

パラメータ既定値意味・効果
enabledtrue 早期反射機能の ON/OFF。false にすると早期反射は一切付加されず、従来とまったく同じ出力になります。
ear_height1.2 聴取者(マイク)の高さ[m]。床・天井反射の遅延に影響します。値が小さいほど床が近く=床反射が早く・強くなります(例:着席1.2、立位1.6程度)。
listener_offset[0.0, 0.0] 聴取者を部屋中央から動かすオフセット [左右, 前後][m]。左右にずらすと左右の壁反射が非対称になります。前にずらす(前壁に近づける)と前壁反射が早く・強くなり、ホールの「最前列」的な前方反射が得られます。
room_dims_min[4.0, 5.0, 3.0] room_size=0.0 のときの部屋寸法 [幅, 奥行, 高さ][m]。既定はラジオ収録スタジオ程度の小部屋。
room_dims_max[25.0, 45.0, 18.0] room_size=1.0 のときの部屋寸法[m]。既定は約2000席のコンサートホール相当(体積≒2万m³級)。
部屋寸法は room_size で min〜max を線形補間します。room_size 自体は [audio]・各シーン・台本の臨時パラメータで指定できる既存の設定です(拡散リバーブにも連動)。
大きな部屋(room_size 大)では壁が遠いため壁反射の遅延が長くなり、聴取者が中央だと 「早期反射」というより後部残響に近づきます。その範囲では主に床・天井反射が接地感を担います。 大ホールでも前方からの早期反射を強めたい場合は listener_offset の前後成分で前壁に寄せてください。

7.4.2 距離による残響(D/R:直接音/残響比)

パラメータ既定値意味・効果
early_level1.0 早期反射全体の音量倍率。1.0 が物理基準。上げると反射が強く=空間が「生き生き」するが、過大だと付帯音・濁りが出ます。下げると控えめになります。
wet_distance_slope0.1 音源が遠いほど拡散リバーブ(残響)を増やす度合い。実効残響量 = reverb_wet × (1 + slope × 距離)(上限0.9)。値を大きくすると遠い音源がより残響的になり距離感が強調されます。既定 0.1 は従来の固定値と同じ=挙動変化なし。

D/R(直接音と残響の比)は距離感の重要な手がかりです。直接音は距離に応じて素直に減衰し、 早期反射(early_level)と拡散残響(wet_distance_slope)が相対的に増えることで、 「遠いほど残響に包まれる」自然な距離感を作ります。

7.4.3 面ごとの素材(反射率・吸音)

反射面を 5つの素材グループに分け、それぞれに2つの値を設定します。インラインテーブル ({ reflection_coeff = …, absorption_cutoff_hz = … })で記述します。

キー反射率 (reflection_coeff)吸音カットオフ (absorption_cutoff_hz)
floor(床)0.53500 Hz
ceiling(天井)0.66000 Hz
front_wall(前壁)0.8510000 Hz
back_wall(後壁)0.404000 Hz
side_walls(左右の側壁)0.708000 Hz
項目範囲の目安意味・効果
reflection_coeff0.0 〜 1.0 その面の反射の強さ。0 でその面の反射を無効化、1 で減衰なしの強い反射。高いほど明瞭で硬い響き、低いほど吸音された落ち着いた響き。
absorption_cutoff_hz例 2000 〜 Nyquist(24000) 反射時のローパス(高域吸音)のカットオフ周波数[Hz]。低いほど高域が削れて柔らかい素材(カーペット・カーテン等)、高いほど高域も反射する硬い素材(コンクリート・ガラス等)。Nyquist 付近にすると吸音は実質無効。
既定では前壁を高反射(0.85 / 10kHz)にしています。これはコンサートホールで ステージ側(演者の背後)の壁の反射が強いことを模したものです。後壁は吸音寄り(0.40 / 4kHz)にしています。 左右の側壁は同一素材として扱います(位置は listener_offset で左右非対称にできます)。

7.5 チューニング指針

すべて config.toml の数値変更のみ。試聴しながら少しずつ調整してください。

狙い・症状調整
まだ「浮く」感じが残るfloor.reflection_coeff を上げる/early_level を上げる/ear_height を少し下げて床を近づける
反射が強すぎる・付帯音や濁りが気になるearly_level を下げる/各面の reflection_coeff を下げる
空間を広く/狭くしたいroom_size(部屋寸法に連動)を上げる/下げる
素材を柔らかく/硬くしたい該当面の absorption_cutoff_hz を下げる(柔)/上げる(硬)
遠近感(距離感)を強めたいwet_distance_slope を上げる
前方からの反射を強めたい(ホール感)front_wall.reflection_coeff を上げる/listener_offset の前後成分で前壁に寄せる
機能を一時的に切りたいenabled = false

7.6 互換性・注意点

7.7 台本(scene)で部屋を指定する

config.toml の [audio.early_reflections] は全体の既定値・素材を決めますが、 部屋の大きさと聴取者の位置は台本の @scene 行で場面ごとに指定できます。 これにより「ホール」「小部屋」「屋外」などを場面単位で切り替えられます。

@scene パラメータ意味・効果
room_size 0.0〜1.0 の簡易指定。room_dims_min〜room_dims_max を補間して寸法を決める。省略時は config 既定。
room_w / room_d / room_h 部屋の幅・奥行・高さ[m]。3つすべて指定すると room_size より優先。座標は x=幅(左右)・y=奥行(前後=正面)・z=高さ。
listener_dx / listener_dy 聴取者(マイクペア中心)の部屋中央からのオフセット[m](+x=右、+y=前)。省略時は config の listener_offset。前壁に寄せるとホール的な前方反射が強まる。
listener_z 聴取者(マイク中心)の床面からの絶対高さ[m](listener_dx/dy の中央オフセットとは違い絶対値)。省略時は config の ear_height(既定1.2)。床・天井反射の遅延に効く。
reverb_wet 残響量の倍率(7.8節参照)。場面ごとに残響の効きを調整できる。
@scene ホール room_w=25 room_d=45 room_h=18 listener_dy=-15 listener_z=1.1 reverb_wet=1.0
@scene 小部屋 room_size=0.1
@scene 屋外 room_w=50 room_d=50 room_h=30 reverb_wet=0.0
話者ごとの位置(聴取者から見た pan=方向、distance=距離、height=高さ)は @cast で指定します。 @scene は「部屋」と「その中での聴取者の立ち位置・高さ」を、@cast は「聴取者から見た各話者の位置・高さ」を決めます。

話者の高さ(@cast height)

話者の高さは @cast 行の height=**(床面からの絶対高さ[m])で指定します。 省略時は聴取者と同じ高さになります(後方互換)。話者を高く/低く置くと、床・天井反射の遅延・距離が変わります。

書き方意味
@cast 行 height=1.7その話者の基準の高さを 1.7m(床から)に設定。
行内 A(height=0.3):台詞その行限定の加算(基準+0.3m)。pan/distance の臨時パラメータと同じ扱い。
高さは早期反射の床/天井反射の幾何にのみ効きます(Sabine 残響=7.8節には影響しません)。値は部屋の高さ room_h 内にクランプされます。
屋外にするには、config の [audio.early_reflections] で壁・天井の reflection_coeff を 0 にします (床のみ反射)。これにより 7.8節の物理計算で残響もほぼ無くなります。場面によって屋内/屋外を変えたい場合は、現状は 素材が config 全体共通のため、屋外専用の config.toml を用意して使い分けてください。

7.8 残響の物理導出と reverb_wet

拡散リバーブ(残響の尾)は、部屋寸法と各面の素材から物理的に導出されます。手動の固定値ではありません。

パラメータ既定意味・効果
reverb_wet1.0 物理基準量 wet_base への倍率。実効残響量 = reverb_wet × wet_base × (1 + wet_distance_slope × 距離)(上限0.9)。1.0で物理どおり、下げるとドライ寄り(ナレーションの明瞭さ確保等)、0で残響なし。config.toml の [audio] reverb_wet または @scene で指定。
仕様変更(非互換):reverb_wet は以前の「絶対的な残響ミックス量(0〜1)」から 「物理基準量への倍率(既定1.0)」へ意味が変わりました。素材・寸法から残響が決まるようになったため、 以前の台本・config の reverb_wet 値そのままでは響きが変わります。必要に応じて再調整してください。
素材(reflection_coeff/absorption_cutoff_hz)は早期反射と拡散残響の両方を同時に決めます。 反射率を上げると早期反射が強まり、残響も長く・大きくなります(物理的に一貫)。

8. トラブルシューティング

症状主な原因と対処
「台本パスが見つかりません」「処理対象の台本が見つかりません」と表示される 渡した台本ファイル/フォルダのパスが間違っています。コマンドに渡したパスと存在を確認してください。フォルダを指定した場合は、その直下に .txt ファイルがあるか(サブフォルダ内の台本は対象外)も確認してください。
「キャスト「○○」が未定義です(この行は無視されます)」と表示される @script 内で使用している役名が @cast セクションで定義されていません。表記揺れ(全角/半角、空白等)がないか、@cast の定義行どうしの間に空行があるかを確認してください。
「パース警告があるため失敗として扱います(警告を承知で続行するには --no-strict)」と表示され、その台本だけ生成されない CLI は既定で、パース警告が1件でもある台本を失敗として扱います(台詞や効果音が気づかないうちに欠けるのを防ぐため)。同じ行に表示される警告の内容を見て台本を直してください。警告を承知で生成したい場合は --no-strict を付けて実行します(3.1)。
「BGMファイルが見つかりません」「SEファイルが見つかりません」と表示される #bgm_start / #se のファイルが、@asset の bgm_dir / se_dir の中にありません。ファイル名とフォルダの指定を確認してください(6.3 @asset セクション)。
「キャスト定義行の書式(役名:話者名:style,エンジン名,...)になっていません」と表示される @cast の定義行のコロンが足りません。役名:話者名:スタイル,エンジン名,... の形に直してください。定義行を書かずに外見描写だけを書いた場合も、この警告になります。
「パラメータ「○○」の値が数値ではありません」「有限の数値ではありません」と表示される pan などの数値パラメータに数値以外(または nan / inf)が書かれています。そのパラメータは既定値になる(または無視される)ので、正しい数値に直してください。
「engine '...' not registered」「合成失敗」と表示される @cast 行の書式が 役名:話者名:スタイル,エンジン名,... になっているか確認してください(コロンとカンマの混同に注意)。また、対象の音声合成エンジンが起動済みか、config.toml の URL が正しいかも確認してください。
「エンジンの起動に失敗したため話者 '○○' を解決できません: …」と表示される 音声合成エンジンを起動できず、話者の一覧を取得できていません(話者名の誤りではありません)。: 以降に表示される理由を確認してください。「実行ファイルが見つかりません」なら、エンジンがインストールされているか(VOICEVOX はアプリを一度起動してエンジンの導入が終わっているか)を確認し、標準以外の場所に置いた場合は exe_path を指定します。「起動待機が N 秒でタイムアウト」なら startup_timeout_s を増やしてください(2.2)。
「話者一覧を取得できていません(エンジンが起動していない可能性があります)」と表示される エンジンに接続できていないか、エンジンが話者を1人も返していません。エンジンが起動しているか、config.toml の URL が正しいかを確認してください。
「話者 '○○' がエンジンに見つかりません」と表示される エンジンは動いていますが、その話者名がありません。@cast の話者名がエンジン側の名前(VOICEVOX / AivisSpeech アプリの表示名)と完全に一致しているか、エンジン名(voicevox / aivis)の指定が正しいかを確認してください。AivisSpeech では、その音声モデルがインストールされているかも確認します。
「exe_path が見つかりません。インストール済みのエンジンを探します」と警告される config.toml の exe_path に書いたファイルがありません(バージョンアップでエンジンの場所が変わった場合など)。Script2Voice は自動で見つけたエンジンを使って処理を続けます。警告を消すには、config.toml の該当する exe_path の行を削除するかコメントにしてください。
「ミックス対象の音声が存在しません」と表示され full_dialogue.wav が生成されない すべての台詞の音声合成・音響処理が失敗しています。上記の合成失敗の原因を解消してから再実行してください。
定位(左右の広がり)が指示より強い/弱いと感じる 定位は pan の角度に加えてマイク指向性の効きで決まります。config.toml の [audio] mic_directivity / mic_angle を下げると広がりが穏やかに、上げると強くなります(既定は控えめ寄りに調整済み)。pan は + が右、− が左です。
音が宙に浮いて聞こえる/距離感・上下感が弱い 床・壁・天井の早期反射が接地感を与えます。[audio.early_reflections] の floor.reflection_coeff や early_level を上げる、@scene で部屋寸法(room_w/d/h)や聴取者高さ(listener_z)を指定する等で調整できます(第7章 空間音響パラメータ解説参照)。
処理が遅い/メモリ消費が大きい config.toml の [concurrency] セクションで、各エンジンの同時合成数や音響処理の並列数 (audio_process) を環境に合わせて調整してください。
「出力ファイルのいずれかが使用中のため、今回の生成一式を連番 _N で保存します」と表示される 前回の出力(full_dialogue.wav / timeline/*.srt・*.fcpxml / audio/voice_*.wav)を動画編集ソフト等で開いたまま再実行すると、ファイルが使用中で上書きできません。この場合プログラムは異常終了せず、今回の生成一式すべてを共通の連番 _N(例 full_dialogue_1.wav, audio/voice_0001_1.wav, timeline/timeline_1.fcpxml, timeline/subtitles_1.srt)で保存します。FCPXML は同じ _N の音声を参照するので整合性は保たれます。既定名の前世代ファイルはそのまま残ります。元の名前で出力したい場合は、開いているアプリを閉じてから再実行してください。連番の一式から動画を作るときは compose --generation N を指定します。
GUI で「▶試聴」を押しても音が出ない・反応がないように見える エンジンの初回起動(特に AivisSpeech のモデルロード)と合成で数十秒かかることがあります。画面下部の再生バーに「行N を合成中…」と表示されている間はお待ちください。起動が遅い環境では config.toml の各エンジンに startup_timeout_s = 120 のように待機秒数を指定できます。失敗した場合は再生バーとログ(フッター)に理由が表示されます。
GUI に「config.toml を読めません」と赤字で表示され、何も操作できない s2v-gui.exe は実行ファイルと同じフォルダの config.toml を読みます(GUI に --config 相当の指定手段はありません)。exe をコピーして使っている場合は config.toml も一緒に置いてください(4.1 起動と準備)。
GUI で音響ラボの試聴音を残したい/終了したら消えた 試聴・履歴の WAV は一時フォルダに置かれ、GUI 終了時に削除されます。残したい音は履歴の「💾 書き出し」で保存してください(4.4 音響ラボタブ)。
compose(動画書き出し)が失敗する/画像が切り替わらない ffmpeg・ffprobe の PATH、#paragraph の有無、scene_map.json の段落番号を確認してください。症状別の対処は5.7 うまくいかないときはにまとめています。

9. 付録: パラメータ早見表

@cast / 台詞の臨時パラメータで指定できる定位パラメータ

pan左右の定位(度)。+ = 右、- = 左
distance聴取者(マイク)までの距離(m)
height話者の床面からの絶対高さ(m)。省略時は聴取者と同じ高さ。行内では加算オフセット
volume音量倍率
delay同時発声時の発声開始の遅延(ms)

@scene で指定できる音響場パラメータ

room_size部屋の広さの簡易指定(0.0〜1.0)
room_w / room_d / room_h部屋の幅・奥行・高さ(m。3つ指定で room_size に優先)
listener_dx / listener_dy聴取者の部屋中央からのオフセット(m。+x=右、+y=前)
listener_z聴取者の床面からの絶対高さ(m)
reverb_wet残響量の倍率(既定 1.0)

主なエンジン固有パラメータ(@cast / 台詞の臨時パラメータとして指定可能)

エンジン主なパラメータ例
VOICEVOX / AivisSpeechspeedScale(話速)、pitchScale(音高)、intonationScale(抑揚)、volumeScale、prePhonemeLength、postPhonemeLength、pauseLength、pauseLengthScale など
XTTS (Coqui TTS)language(言語)、temperature、length_penalty、repetition_penalty、top_k、top_p、speed など
これらのパラメータは 名前=値 の形式で @cast 行、 または台詞の臨時パラメータ 役名(名前=±値, ...) として指定します。 詳細な値の範囲や意味は、各音声合成エンジンのドキュメントを参照してください。

10. ライセンス

Script2Voice は GNU General Public License v3.0 以降(GPL-3.0-or-later)で公開しています(同梱の LICENSE)。無保証です。 組み込んでいるオープンソースのクレートとフォント(GUI 用の Hack・Noto Emoji・emoji-icon-font)のライセンスは THIRD-PARTY-NOTICES.txt にまとめています。

音声合成エンジン(VOICEVOX・AivisSpeech・XTTS)は同梱せず、別のプログラムとして呼び出します。 生成した音声の利用条件(クレジット表記など)は、各エンジン・音声ライブラリ・キャラクターの利用規約に従ってください。