台本仕様

1. 台本は、次のセクションを含む。
	1. @scene
	2. @pause
	3. @asset
 	4. @cast
 	5. @script

2. 各セクションの機能
	1. @scene 台本の場面開始を宣言する。
		1. 場面の先頭で宣言する。
		2. @scene *** として場面の名前を***と付けることができる。
		3. 音響場（部屋）の設定を行う。下記のパラメータを @scene 行に パラメータ名=値 で指定する（いずれも省略可）。
			room_size=**     (0.0～1.0 小さいほど狭い)。部屋寸法の簡易指定。省略時は config の既定値。
			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で残響なし。
			※ 残響の長さ・量、および床/壁/天井からの早期反射は、部屋寸法と各面の素材（反射率・吸音特性）から物理的に決まる。
			   壁・天井の反射率を0にすると屋外（床反射のみ・ほぼ無残響）になる。素材の既定値は config.toml の
			   [audio.early_reflections]（床/天井/前壁/後壁/側壁ごとの reflection_coeff・absorption_cutoff_hz）で調整する。
		4. 情景描写（自由記述）
			@scene行の次の行から、次のセクション（@pause/@asset/@cast/@script）が現れるまでの行は、
			その場面の情景・雰囲気を自由文で記述したものとして扱う。音声合成には使用せず、
			画像/動画生成用プロンプトの作成（Claude等が台本を読んで行う）に使用する。省略可。
			空行は区切りにならず（@castの自由記述と異なる点）、次のセクション（@pause/@asset/@cast/@script）が現れるまでの行がすべて自由記述として蓄積される。ただし空行そのものは読み飛ばし、自由記述には含めない（空行を挟んだ前後の行は、改行1つで連結される）。
			自由記述の行を「@」で始めてはならない（行頭の@はセクション区切りとして解釈されるため）。
		5. 場面には、@asset、@cast、@scriptの各セクションを必ず含む。
		
	2. @pause 文間、話者間、段落間に設ける無音時間を設定する。
		sentens ****:	文間に****msの無音を挿入する。
		cast ****:	話者交替時に****msの無音を挿入する。
		paragraph ****:	段落間に****msの無音を挿入する。
	
	3. @asset BGM、SEの音源集のフォルダを指定する。
		1. bgm_dir = 絶対パス
			BGMの音源が保存されたフォルダを絶対パスで指定する。
			PATH名には、空白文字を含むことが出来る。
		2. se_dir = 絶対パス
			SEの音源が保存されたフォルダを絶対パスで指定する。
			PATH名には、空白文字を含むことが出来る。
	4. @cast 登場人物の役、話者名、音声合成エンジン、言語、各種パラメータを設定する。
		書式	役名:話者名:style,音声合成エンジン名、使用言語,各種パラメータ
		役名	@script内での役
		話者名	役名を担当する話者の名称
		style	話者の発声スタイル(VOICEVOX,AivisSpeechのみに存在、XTTSは"default"とする)
		音声合成エンジン名	VOICEVOX,AivisSpeech,Conqui TTSを想定するが、将来追加する可能性がある。
			Conqui TTS = xtts, VOICEVOX = voicevox, AivisSpeech = aivis とする。
		使用言語	話者の発声する言語(XTTSのみ使用する。XTTSのモデルは多言語多言語モデルを使用する。VOICEVOX,AivisSpeechは強制的に日本語とする。
			書式 language = ** 
			** en(英語) ja(日本語) 他 
		各種パラメータの名称。必要に応じて指定する。
			VOICEVOX {
  				"id": 0,
				"name": "string",
				"speaker_uuid": "string",
				"style_id": 0,
				"speedScale": 0,
				"pitchScale": 0,
				"intonationScale": 0,
				"volumeScale": 0,
				"prePhonemeLength": 0,
				"postPhonemeLength": 0,
				"pauseLength": 0,
				"pauseLengthScale": 1
			}
			AivisSpeech {
			    "id": 0,
			    "name": "string",
			    "speaker_uuid": "string",
			    "style_id": 0,
			    "speedScale": 0,
			    "intonationScale": 0,
			    "tempoDynamicsScale": 1,
			    "pitchScale": 0,
			    "volumeScale": 0,
			    "prePhonemeLength": 0,
			    "postPhonemeLength": 0,
			    "pauseLength": 0,
			    "pauseLengthScale": 1
			}
			Conqui TTS {
				"temperature"
				"length_penalty"
				"repetition_penalty"
				"top_k"
				"top_p"
				"speed"
				"enable_text_splitting"
				"stream_chunk_size"
			} 
		定位情報として、下記のパラメータを指定する。ステレオマイクの間隔は0.2mとします。これにより、話者のステレオ定位を定義する。
			pan = ±**:音声の左右の定位を指定する。単位は°とする。+は右方向、-は左方向
			distance = ***.** :話者のマイクまでの距離を指定する。 単位はmとする。
			height = ***.** :話者の床面からの絶対高さを指定する。単位はm。省略時は聴取者（マイク）と同じ高さ。
			                 行内臨時パラメータ（例 A(height=0.3):台詞）では、その行限定の加算オフセットとして働く。
		パラメータの指定方法は､パラメータ名=*** とする。
		外見描写（自由記述）
			各役の定義行（書式行）の次の行から、空行が来るまでの行は、その役の外見・特徴を自由文で
			記述したものとして扱う。音声合成には使用せず、画像/動画生成用プロンプトの作成
			（Claude等が台本を読んで行う）に使用する。省略可。
			空行は次の役の定義行との区切りを兼ねるため、複数の役を定義する場合は必ず役ごとに
			空行を1行以上挟むこと（空行がないと、次の役の定義行がその役の外見描写として
			読み込まれてしまう）。
			定義行を書かずに自由記述だけを書いた場合、その役は登録されない。
			自由記述の行を「@」で始めてはならない（行頭の@はセクション区切りとして解釈されるため）。
			
	5. @script 台詞･各種音声出力の指示をする。このセクション以外で音声出力をするものはない。
		書式	役名(臨時パラメータ):台詞'単語|読み'台詞
		役名と台詞の区切りは半角の":"のみとする。全角の"："は区切りとして扱わない。
				#コマンド
				空白行
		役名	@castセクションで定義された役名
		臨時パラメータ	@castで指定された役者に対する臨時パラメータに対し、±の補正値を加える。 複数を指定可能とする。panも同様に補正値を加える。
		台詞	発声するテキスト。誤読することがあるため、誤読を防ぐため単語をシングルクォーテーションで囲み指定する。単語と読みを半角"|"で切り分ける。
				例 '東京|とうきょう' '13:00|じゅうさんじ'
				区切りは半角"|"のみ。全角"｜"は区切りとして扱わない。単語・読みのどちらにも":"を含めてよい。
				同時にアクセントの指示も出来る。
		臨時パラメータは､castやsceneで設定された値に対し±の差分で指示する。エンジンのパラメータは正確にその名称を記載する。
		
		#で始まる行は、コマンド行とする。コマンドは以下とする。(追加可能)
			空白	コメント行。 #の後に空白文字があると、その行はコメント行とする。
			bgm_start ファイル名.wav	ファイル名.wavをBGMとして再生する。ファイル名.wavのファイルは、bgm_dirから探す。
			bgm_stop	bgmを停止する。
			se ファイル名.wav	効果音としてファイル名.wavを挿入する。ファイル名.wavは、se_dirから探す。
			pause ****	****msの無音を挿入する。
			paragraph ****	段落の区切りを示す。空白の後に名称などを記入することができる。
					「paragraph」の後の空白1つ以上に続く行末までを名称とし、前後の空白は取り除く。名称は省略可。
					名称に "]" は使えない。ファイル名に使えない文字(\ / : * ? " < > |)は避けること。
					［現在の出力］
						名称は字幕SRTに [PARAGRAPH 名称] として出力される。名称がない場合は [PARAGRAPH]。
						このSRTエントリは長さ0秒で、直前の台詞の終了時刻に置かれるため、字幕としては画面に出ない。
						timeline/timeline.json にも event_type="paragraph" のイベントとして、開始時刻(start_ms)と
						名称(name)が出力される。動画合成の正式な入力はこちらとする。
					［今後追加予定］動画クリップ・挿絵の自動挿入
						段落マーカーで区切られた区間を「カット」と呼び、カットごとに動画クリップまたは
						静止画(挿絵)を1つ割り当てて自動で挿入する。素材は次の順で解決する。
							1. scene_map.json の name が段落名称に一致するエントリ
							2. scene_map.json の index がカット番号(1始まり)に一致するエントリ
							3. assetsディレクトリ配下の「段落名称.拡張子」の自動検索
							   (mp4, mov, webm, png, jpg, jpeg, webp の順。複数一致はエラーとする)
							4. scene_map.json の default_image
							5. どれにも当たらなければエラー(未解決のカットを全件列挙して停止する)
						素材の種類は拡張子から自動判定する。動画素材がカットより短い場合は、既定では
						最終フレームで静止し、scene_map.json で指定すればループさせる。
						段落名称がそのまま素材ファイル名の検索キーになるため、名称はファイル名に
						使える文字で付けることが望ましい。
					［今後追加予定］同じ名称の #paragraph の扱い
						同じ名称を付けることは「同じ素材を使う」という指定である。
						・連続する段落が同じ名称のときは、1つのカットに結合し、素材を1つだけ割り当てる。
						  動画素材はカットの境目で頭出しし直されず、そのまま連続再生される。
						  (長い話を段落に細かく割りながら、絵は1枚のままにしたい場合に使う)
						・離れた位置にある同名の段落は結合しない。別々のカットになるが、名称が同じなので
						  同じ素材が割り当てられる。(同じ絵を番組中で繰り返し出す場合に使う)
						・名称なしの段落どうしは結合しない。従来どおり段落ごとに別のカットになる。
						なお、キャラクターの立ち絵は段落名称ではなく話者単位で切り替わるため、
						段落の結合の影響を受けない。
			数字	次の行から数字の文だけ同時発声する。
		空白行は無視する。

上記は繰り返し出現することができる。
+