# 17_音声作品の動画化・再現仕様書(Irodori-TTS音声+口パクASMR動画) 最終更新:(投稿時に記入) 文書の性格:**再現仕様書**。前提は「Irodori-TTS は導入済み」。この文書だけで、別の Muse が同程度の品質の動画を1本作れることを目標に、パラメータ・閾値・判定基準・失敗時の切り分けまで数値で書く。数値はすべて一軒の制作環境での実測・採用値であり、根拠ファイルがあるものは根拠を併記する。他環境ではまず同じ値で始め、素材に合わせて比率で調整すること(絶対値より「声・素材に対する比率」が移植性の高い部分である)。 関連文書(この環境での実ファイル名。無い環境では読み飛ばしてよい): - 音声側の総合ガイド:`irodori-voice/voice_guide.md` - 口形持続時間の実測調査:`invite_asmr_video/lipsync_poc/lipsync_duration_research.md` - 映像の制作計画と決定履歴:`invite_asmr_video/VIDEO_PLAN.md` - 全編制作ノート:`invite_asmr_video/full_v20/PRODUCTION_NOTES.md` - 下絵アニメーション総括:`invite_asmr_video/hair_anim_poc/rev2/` --- ## 1. 前提・成果物の定義 ### 1.1 完成品の仕様(本番確定値) | 項目 | 値 | |---|---| | 画面サイズ | **1536×1152(4:3)**。16:9化はしない(2026-11-13 確定) | | フレームレート | **30 fps**(全パラメータはこの前提。1フレーム ≒ 33.3 ms) | | 尺 | 音声マスターと完全一致させる(実績:551.76 秒=16,553 フレーム) | | 本番マスター | H.264 crf18 + AAC 192 kbps(実績ファイル 186 MB) | | 音声マスター | WAV(Irodori-TTS 生成→QC→連結→SEミックス済み)。映像はこれに合わせて作る(逆はしない) | ### 1.2 完成品の構成要素(レイヤー順) 下から順に重なる。レンダーは単一パスで全要素を合成する(実績 `render_full_v20.py`)。 1. **下絵アニメーション**:静止画ジャケットを土台に、マスク領域だけを微小に動かす 6 秒ループ(第7章) 2. **口パク**:口なし下絵の上に口パーツを重ね、口形遷移はモーフィング(第6章) 3. **瞬き**:まぶたパーツ+モーフィング。第一声の開始フレームから開始(第8章) 4. **文字レイヤー**:完成ジャケットと素の画面の差分として抽出。導入部でフェードアウト(第8章) 5. **円形波形**:声に連動する円形ビジュアル。文字と入れ替わりに出現(第8章) 6. **カメラ(ズーム)**:場面ごとに決めた「ズーム島」の区間だけ寄る(第8章) 7. **音声**:音声マスターをそのまま mux する ### 1.3 本番標準の組み合わせ(映像側) **「整理版タイミング + Fix5 + 新素材(あ=大)+ 口モーフ + 瞬きモーフ + アニメーション下絵 rev2 + ズーム」** が本番標準(2026-11-13 本番化決定)。各要素の意味は第5〜8章。どれか1つでも欠けると品質が一段落ちる(特にタイミング規則 Fix5 と素材の作り方が効く)。 ### 1.4 大原則(全工程に効く3つ) 1. **リップシンクは「SEを含まない声だけの音源」からのみ作る。** SE混じりのミックスで解析すると、冒頭のドア音・足音などを発声と誤判定し、声が始まる前から口が勝手に動く事故が実際に起きた。本番では声チャンクだけを連結した「声ボディ」を別に用意し、タイミング生成の入力にする(実績:`build_body*.py` で声ボディの波形配列とチャンク区間表を生成し、マスター音声と全チャンク一致を検証してから使う)。 2. **尺に触る修正は音声マスター確定前に寄せる。** セリフの追加・差し替え・無音の増減はタイミング全再構築になる。 3. **機械チェックで候補を絞り、耳・目の確認は上位だけ。** 全件を人間(や自分の知覚)に回すと時間が溶ける。QCはすべて「ランク付きレビューリスト」方式で、自動却下はしない。 --- ## 2. パイプライン全体図 ``` 台本テキスト │ ①チャンク分割(100字以内・文の切れ目) ▼ Irodori-TTS 生成(チャンク単位)── QC不合格 → 別seedで再生成(第3章) │ ②QC(ラウドネス/末尾/バースト/繰り返し・数字列) ▼ 連結(0.6秒無音・実効無音の上限管理)= 声ボディ │ ③SE配置(声RMS比で音量管理)+BGM等 ▼ 音声マスター(WAV) │ ├─ 声ボディ(SEなし)→ ④タイミング生成(Julius境界+包絡→Fix5規則) │ → 口形タイミング(フレーム列) ├─ ジャケット+口パーツ素材(第5章。最終形はユーザー側が用意) ├─ 下絵アニメーション(6秒ループ、第7章) └─ 演出設計(文字フェード/波形/ズーム島、第8章) │ ⑤単一パスレンダー(下絵rev2+口モーフ+瞬きモーフ+フェード+波形+カメラ) ▼ 本番マスター動画(H.264 crf18+AAC 192k) │ ⑥共有用圧縮(画質を犠牲にし音質を守る、第9章) ▼ 共有版ファイル ``` 工程間の受け渡しファイル: | 工程 | 入力 | 出力 | |---|---|---| | 生成 | 台本チャンク一覧(JSONジョブ) | チャンクWAV群+生成ログ(RMS・引き直し回数) | | QC | チャンクWAV群+台本 | 合格チャンク群+要確認リスト | | 連結 | 合格チャンク群 | 声ボディWAV+区間表(各チャンクの開始・終了秒) | | SE | 声ボディ+SE素材 | 音声マスターWAV | | タイミング | 声ボディWAV+読み(かな) | 口形タイミングJSON(フレーム単位の口形列) | | レンダー | 下絵・素材・タイミング・演出パラメータ・音声マスター | 本番マスター動画 | --- ## 3. 音声工程の詳細仕様 ### 3.1 チャンク分割 - **1生成=100字以内**を上限とする。根拠:1回の生成は約30秒で打ち切られる仕様があり、約230字の一括生成では総長がちょうど30.0秒に圧縮され後半が飛び飛びになった実例がある。読み上げ速度の実測は約4.8字/秒で、自然な速度のまま30秒に収まる上限は約143字。余裕を持って100字(約21秒)。 - 分割点は**文の切れ目**。全体が100字を超える場合は、最初から文単位で割って生成し、後で連結する。 - 生成は常駐ランナー方式(推論ランタイムを1回だけ構築し、全チャンクを連続処理)を使う。チャンクごとに別プロセスを起動すると起動・読込が1チャンク約20秒超かかり、全体で約3倍遅くなる実測がある。 ### 3.2 生成条件(本番標準) | 項目 | 値 | |---|---| | 精度/ステップ/スケジュール | **fp32 / 16ステップ / linear** | | 参照音声 | **事前に latent 化した.pt ファイル**を `ref_latent` で指定(wav参照の都度エンコードを避ける。同一参照の2チャンク目以降は参照準備が実質0秒になる) | | seed | **ランダム**(固定しない。不良テイクは別seedで引き直すのが前提の運用) | | キャプション | 声質ごとの仕様書として書く(声の質はキャプションではなく参照で決まる、という実測がある。音量・音割れも参照側で決まる) | ### 3.3 TTS入力テキストの表記規則 - **カウントダウンの数字は、TTSに渡すテキスト側だけ漢字数字**(十・九・八・七・……)にする。表示・台本側は通常表記のまま別管理する。 - 例外:ゼロ付近の焦らしの伸ばし読みと、「ゼロ、ゼロ、ゼロゼロゼロ。」のような連呼表現はそのまま書く。 - 経緯:表記9種(ひらがな/カタカナ/算用数字/漢数字/英字等)を同一条件で比較しても読みの癖は再現せず、読み崩れの主因は表記ではなく **seed×テキストの不安定さ**だった。表記は漢数字に統一し、崩れは第3.4のASR照合で拾って再生成で直す、という役割分担にする。 - 文中の軽い間は「……」ではなく「、」で書く。「……」は生成音声では想定よりはるかに長い無音(実測で約1.2〜1.7秒)として実現されるため、本当に沈ませたい箇所だけに使う。意図した長さの間は記号任せにせず、チャンク分割+連結無音の実時間で担保する。 ### 3.4 QC(生成直後・連結前に全チャンクへ実施) #### (a) ラウドネスガード(自動・生成器内蔵) - 生成ごとにチャンク全体の **RMS(int16スケール)を測り、5200 を超えたらランダムseedで引き直す(最大2回)**。最終的に**一番静かなテイク**を保存し、ログに `rms=` と `redraws=` を残す。 - 引き直しのseedは必ずランダムにする(近傍seedは相関して大きいままだった実測がある)。 - 較正の裏付け:上限超えのテイクは耳判定でも全件「音割れ」であり、5200未満のテイクには音割れがなかった(監査6テイクでの一致)。正常テイクのRMSは約4300が目安。 - 上限まで届かなくても最静テイクが残る仕様(実測の最悪ケース 6045→5402)。 #### (b) 末尾断片スクリーニング(全件・波形) - 症状:生成音声の末尾や「……」位置に、テキストに無い声が付くことがある(既知の癖。頻度は生成条件によらない)。 - 手順:全チャンクの**末尾を波形エンベロープで機械スクリーニング**し、末尾に有声の断片があるチャンクだけを耳(またはASR)確認に回す。 - **末尾カットの安全規則(必須)**:末尾の有声部分を切る前に、**切る部分が台本の末尾と一致しないことをASRで確認する**。一致したら切らない(台本通りの語尾を「余分な声」と誤認して切ってしまい、セリフの一部が欠けた実事故があるため)。ハードコードした秒数での無検証カットは禁止。 #### (c) バースト検出(全件・ランク付きリスト) - 症状:台本に無い短い破裂的な音(パフ)が混ざることがある。 - 検出器(実績 `check_burst.py`):5msフレームのピーク包絡で「島」を切り、**持続5〜300ms/前後に −40dBFS 以下のディップ(立ち上がり rise ≥ 20dB)/周期性 ≤ 0.45** を全て満たすものを候補化する。 - **要確認の目安:ピーク ≥ −20dBFS かつ rise ≥ 30dB**。ただし自動ゲートにはせず、候補はピーク降順に上位から確認する。耳較正の結果、実際に聞こえたのは候補12件中 上位2件のみで、3位以下は聞こえないか **パ・バ行など破裂音の正規の発音位置と重なる誤検出**だった。破裂音の発音位置と重なる候補は割り引いてよい。 - **精査前の必須確認**:候補のあるファイルが「現行ビルドの実使用ソース」かどうかを先に確かめる(未使用の旧テイク内のバーストを精査して時間を溶かした実例がある)。 - 修理:低エネルギー区間のバーストは「減衰に沿う窓フェード補間」が有効(実例:区間ピーク −11.0→−32.6 dBFS、再検出なし、声区間のRMS無変化)。`ffmpeg adeclick` は約100msのパフには無効だった。声の本体に重なるバーストは補間せず再生成へ回す。 #### (d) 繰り返し回数の照合(対象チャンクのみ) - 連呼(同じ語の繰り返し)を含むチャンクは、ASRで書き起こして**繰り返し回数を台本と突き合わせる**(実績 `check_repetition.py`)。これも自動却下ではなく確認リスト方式。 #### (e) カウントダウン数字列のASR照合(対象チャンク必須) - 手順(実績 `check_countdown_asr.py`):faster-whisper **small**・CPU int8 で単語時刻つき書き起こしを行い、開始数字から0(ゼロ)までの数列を抽出して、正解の降順数列と照合する。重複・欠落・数列内の文字化けトークン(無関係な漢字等)をフラグにする。 - ASR環境の注意:faster-whisper のファイルパス渡しデコードが壊れている環境がある。その場合は wav を 16kHz の numpy 配列に自前で読み込んでから `transcribe()` に配列を渡す。 - 「要確認」になったチャンクだけ作り直し判定へ回す。 #### (f) ASR照合の適用範囲(コスト配分) | 対象 | 範囲 | |---|---| | 波形系チェック(末尾/バースト/余分な声) | **全チャンク** | | ASR照合 | 末尾カット候補チャンク(末尾数秒)+カウントダウン入りチャンク(数字列)+繰り返し入りチャンク | | 全文ASR照合 | 完成品(納品物)レベルの音声のみ | ### 3.5 連結ルール | 項目 | 値 | |---|---| | チャンク間の挿入無音 | **0.6秒** | | 実効無音の上限 | **1.49秒**。チャンク自体の前後無音が上乗せされ、実効無音(前の有声の終わり→次の有声の始まり)が1.49秒を超えたら、**無音区間の中央を切り詰めて**1.49秒以内に収める(声の立ち上がり・減衰には触れない)。意図的に作った無言区間は対象外 | | 上限の根拠 | チャンク内部ポーズの実測(n=243:中央値0.43秒/90%点0.88秒/最大1.49秒)の最大値を汎用基準にしたもの | | 声種切替の継ぎ目 | 通常系↔囁き系の切替点だけは、実効無音を上限ちょうどの **1.49秒まで延長**する(正面と耳元の間で頭が移動する時間に相当させるため)。通常系同士の切替は対象外 | | 囁き区間の音量 | 連結前に **約 −4dB** 落とす | ### 3.6 声ボディと音声マスターの二系統管理 - **声ボディ**:SE・BGMを含まない、声チャンクだけの連結。リップシンク解析専用(第1.4の大原則1)。 - **音声マスター**:声ボディにSE等を載せた完成音声。映像の尺・ズーム島・波形はすべてマスター側の実測(発声範囲)から決める。 - 声ボディとマスターでチャンク構成・尺が一致していることを、タイミング生成の前に検証する(実績では全チャンク一致を機械検証してから着手した)。 --- ## 4. SE工程の詳細仕様 ### 4.1 素材の調達と前処理 - SE素材は**自前で用意する**(ライセンス確認済みのフリー素材・購入素材を自分のライブラリに正規化コピーして使う)。生成の都度ネットから拾わせると質と権利が安定しない。 - 作品内で使う素材は、ライブラリ側で音量の正規化コピーを作っておき、本番ミックスでは正規化済みを使う。 ### 4.2 配置の原則 1. **同期原則**:SEは場面の動作イベントに同期させる。**触れていない・動いていない区間に、摩擦音や水音のベッド(敷きっぱなしの音)を置かない。** 単発系の音は「1イベント=1音」で置く。 2. **ベッド系**(敷くタイプの音)を使う場合も、入退場は 0.3〜1.0秒のフェードを付ける。粒(短い単発音)の繰り返しは、同じ素材の機械的反復ではなく同系統の候補からローテーション/ランダムに選ぶ。 3. **教え方**:SE配置の型を(別のClaudeや将来の自分に)継承させるときは、お手本の台本と完成音声を先に読ませ、置き場所は「状況説明+秒数」で指示すると定着が早い。 ### 4.3 音量管理(声RMS比) - 音量は絶対値ではなく **声のRMSに対する比(dB)** で管理する。作品全体で声の大きさが変わっても破綻しない。 - 場面別の基準値を持つ。実績のある基準(抜粋): | SEの種類 | 声RMS比の目安 | |---|---| | 標準値のないSEの初期値 | **−25 dB前後** から始めて調整 | | 手の動作音(乾いた手) | −25 dB前後。ストロークは描写の手のテンポに一致させる | | 密着・寄せの音 | **−18 dB** | | 水音ベッド | **−33 dB** | | きしみ音 | −27 dB、要所にだけ置く | | 衣擦れ | アクセント程度。−26 dB前後を動作の拍にだけ置き、パターン化しない | | 体内を通して聞こえるイメージの音 | ローパスでくぐもらせ、ピーク −30 dB前後、ランダムに小さく | - カウントダウン場面の専用ブレンド(実績):濡れ音系 60% + 手の音系 40% のブレンド。テンポは実テンポ(周期 約0.52秒)から入り、数字が減るほど加速(目安:0.49→0.45→0.35→0.29→ゼロで0.23秒周期)。音量は声RMS比で **開始 −35dB → ゼロで −18dB** へ上げる。ゼロの後は声を約3.4秒止めて余韻の鑑賞時間にする。 - 注意:クリック系SEのゲインをRMS基準で決めると暴れる(RMSが極小のため)。クリック系はピーク基準で置く。 ### 4.4 SEとQCの干渉 - SEを載せた後の音声にバースト検出をかけると、SEの粒が候補に挙がる。声の異常と区別して判断すること。原則として声のQC(第3.4)は**SEを載せる前の声ボディ**で完結させる。 --- ## 5. ジャケット・口パーツ素材の詳細仕様 この章は他の章と性質が違う。**ジャケット絵と口パーツは、最終的にユーザー(人間)側が用意した形になる**のが本番の到達点であり、Muse側だけで完結させようとすると品質で詰まる。理由と、詰まるポイント、ユーザーへ頼むときの頼み方を明記する。 ### 5.1 素材の構成(重ね方式) | 素材 | 役割 | |---|---| | **口なし下絵**(完成ジャケットから口を消した絵) | 土台。これが無いと口パーツを差し替えられない | | 文字入り完成ジャケット | 導入部の表示用。文字レイヤーは「完成ジャケット − 素の画面」の差分として抽出する(第8.2) | | **口パーツ(透過PNG)** | 口形ごとに1枚。口のROIだけを持ち、下絵の上に重ねる | | まぶたパーツ | 瞬き用(開/半/閉+モーフ中間形は生成側で作る) | ### 5.2 口パーツの命名と意味づけ(混同しやすいので厳密に) - ファイル **「口閉じ」= NEUTRAL(標準閉じ口)**。無表情の「閉じ」ではない。会話の標準表情としての閉じ口である。 - ファイル **「笑み」= SMILE**。**別途「デフォ(標準)」というファイルは存在しない**。「デフォ」と言われたら SMILE のことだと思って進めると事故る。逆に、第一声より前の待機画面で使う口形は SMILE(第8.2)。 - 母音パーツ:あ/い/う/え/お の5形+NEUTRAL+SMILE が基本セット。 ### 5.3 中間形の暫定定義(検証で使った定義。そのまま使うこと) モーフィングの素材としての中間形は、制作側の都合で次のように定義した。**この検証では、Museが作った中間形15ペアは使っていない**(ユーザー提供素材の検証のため)。 - **「え」** = 「あ↔閉じ口系(NEUTRAL・SMILE)の中間」かつ「あ↔いの中間」 - **「お」** = 「あ↔うの中間」 ### 5.4 サイズの決定(実績) - **「あ」は大サイズ(L)を採用**。小サイズ比で面積 **約1.61倍**。小さい「あ」は開口感が足りず、声の大きさに対して口が負ける。 - パーツごとに**重心が数pxずれる**ことがある。実績:「う」の重心は x=571.1 で、他のパーツ(x=579〜584)より約10px左。**これは素材の個性としてそのまま再現する**(勝手に位置補正すると、ユーザーが調整した見た目とずれる)。ただし新規に素材を作る場合は、重心を揃えてから渡すのが原則で、ずれたまま採用するかどうかは見た目で判断する。 ### 5.5 Muse側で作る場合に支障が出やすい点 1. **インペイントで作った口まわりの肌の色味が変わる**:顔クロップ→インペイントで口パーツや口なし下絵を作ると、口周辺の肌色が下絵と微妙にずれる。対策は LAB 色空間での色合わせ(LABマッチ)を後段に入れること。それでも残るずれは目立つので、最終素材としては不完全になりやすい(→ 5.6)。 2. **口なし下絵の作り方**:完成ジャケットから口だけを消す必要がある。口の消去もインペイントで行うため、上記1と同じ色味問題が起きる。消し残し(元の口の輪郭が薄く残る)と色シフトの両方を、拡大表示で確認すること。 3. **白い縁取りが出たときは、まず合成式を疑う**:口パーツの周囲に白い縁が見える症状は、素材の欠陥ではなく**合成式(アルファの扱い)の不具合だった**実例がある。素材を作り直す前に、ブレンド計算(プリマルチプライの扱い等)を疑い、切り分けること。切り分け手順は第10章。 4. **パーツ間の位置・サイズ**:素材側で位置とサイズを揃えてから合成に入る。合成側で毎回オフセットを吸収する設計にすると、ズームやモーフと干渉して追えなくなる。 5. **まぶた素材**:瞬きの段階パーツ(開/半/閉)は目のROIでモーフさせるため、まぶたの形が下絵の目と正確に重なること。ユーザー側で位置調整された版が正式素材になる。 ### 5.6 分担の実績と頼み方 本番で最終的に採用された素材は、**Museが作った素材を下敷きに、ユーザーが微調整した透過素材**である。経緯: - Muse側でインペイント生成した口パーツは、口まわりの肌の色味シフトが残り、そのままでは本番品質に届かなかった。 - ユーザーが素材一式を差し替え(位置・サイズ調整済み、口なし土台+透過レイヤー式)し、NEUTRAL(標準閉じ口)の形状微修正と、中間コマ15ペアの透過化もユーザーが担当した。 - その結果、形状の違和感は大幅に減少し、本番素材として継続使用が決まった。 したがって作り方は次の分担を標準とする: 1. Museは、口形の種類・サイズ関係・位置の設計と、試作素材の生成までを行う。 2. **肌色の最終一致、形状の微修正、透過化の仕上げは、詰まったら早めにユーザーへ頼む。** 頼むときは「どのパーツの」「何が(色味/形/縁)」「どうなってほしいか」を具体的に渡し、差し替え素材を受け取ったら**素材側の個性(重心のずれ等)は勝手に直さずそのまま使う**。 3. ユーザー提供素材が来たら、それを正式素材として固定し、旧素材は `old` フォルダ等へ退避して混用しない。 --- ## 6. リップシンク工程の詳細仕様 ### 6.1 入力と前提 - 入力は**声ボディ(SEなし)のWAV**+台本の**読み(かな表記)**。読みは「実際に発声された文字列」であること(後述の失敗事例:台本と実音声が食い違うとアライメントが破綻する)。 - 解析の土台は2系統の重ね合わせ: - **音響イベント検出**:波形エンベロープのピーク列から発話イベントを取る。 - **音素境界(Julius)**:音声認識 Julius の強制アライメントで音素境界とスコアを得る。エンベロープ単独より、Julius の中心時刻と重ねた方が中心一致率が高い。 ### 6.2 タイミング生成の到達点(Fix5、本番標準) 評価指標(同一素材での Fix4→Fix5 の改善、機械評価): | 指標 | Fix4 | Fix5 | |---|---|---| | すべり(口形のずれ)件数 | 17件 | **2件**(どちらも目に見える誤母音ではない) | | 文末ポーズ保持の一致率 | 0.733 | **0.800**(両方の物差しで一致) | | Julius中心との一致率 | 51.7% | **56.7%** | | 畳み(区間の潰れ) | 6件 | **0件** | | 被覆ゼロ件数 | 42件 | 39件(目標 ≤33 は未達。主体はタイミングでなく描画層の閉鎖塗り・吸収に移行) | ### 6.3 「すべり」の主因(先に理解しておくこと) 文末などで口形が1つずつずれる「すべり」の主因は、**エンベロープピークの「核の誤配分」**である。弱いモーラ、無声音、長い「ん」、笑いの息のような区間では、有声ピークの数と実際のモーラ数が一致せず、後続の母音イベントが前倒しに消費される。その結果、表示される母音が実音より約1イベント早く進み、文末のポーズ保持が間違った口形を固定してしまう。**対策は「ピーク検出の精度を上げる」ことではなく、後段の機械規則で過不足を吸収すること**である(次節)。 ### 6.4 Fix5 の規則群(再現の中核) イベント列→口形列への変換で、次の規則を積み重ねる。各規則はラベル付き境界集合(正例:検証済み境界109件/負例:境界を±10f・±16fずらした436件+誤配置確定7件)での機械評価から導出した。 1. **再アンカーのゲート(gate_b)は B6**:「Julius 位置 ±5f 内に包絡の局所最大がある」**OR**「前方 +12f 以内で包絡が活動閾値に到達する」のどちらかで通過とする。前方条項が必要な理由:真の境界の中には Julius 位置自体が無音区間内(包絡最大 −60〜−78、活動閾値 ≈−46〜−48)にあり、窓内最大だけでは原理的に通らないものがある一方、その前方 +12f には母音の立ち上がり(−6〜−8.4)が必ずある。B6 は信頼集合で **TPR 1.000**(検証済みの真の境界を決して落とさないことが最優先要件)。 2. **スコア下限ゲート(gate_a)は撤廃**:Julius スコアはこの素材では配置の正誤を分離しない(誤配置7件のスコア −37.4〜−29.5 と、真の境界の最低スコア −38.78 がほぼ完全に重なる)。下限を設けると真の境界を落とすだけになる。 3. **ゲート不通過時のフォールバック**:候補を捨てず、「スキャンフォールバック」で最も近い通過位置まで寄せる。 4. **笑い区間の境界**:笑い(息の笑い声)は音響的終了位置を実測し、それ以降は通常のイベント消費から解放する(笑いのピークが後続母音の核を食うのを防ぐ)。 5. **クランプのスラック借用**:区間長の制約でクランプが必要な場合、隣接区間からスラック(余裕)を借りて畳み(区間の潰れ)を解消する。 6. **再配分のドナー優先順位**:不足分の再配分は距離の近い区間から順に拡張ドナーとして使う。 7. **文末ポーズ保持の優先**:文末では「最後の口形=台本の最後の音」を最優先で一致させる(ポーズ保持一致率が体感品質に直結する)。 その他の不変ルール(Fix4から継続):スペクトルゲート、時間予約、時計統一、閉じ口上限、無音ポリシー、最小スパン保証。 ### 6.5 口形の時間パラメータ(実測裏付けあり) 基準:30fps、1フレーム≒33.3ms。実測の出典は `lipsync_duration_research.md`(学術実測の集約)。 | パラメータ | 採用値 | 実測根拠 | |---|---|---| | **閉じ口の上限(両唇音 /m/ /b/ /p/)** | **5フレーム**(≈167ms) | 連続発話の両唇閉鎖は 54〜95ms(約2〜3f)、明瞭・低速発話では 114〜166ms(約3.4〜5.0f)。本素材は低速で丁寧なナレーションなので上限側の帯域が合い、5f は実測範囲内。**注意**:通常の語中では 2〜3f に収まるのが実勢。上限5fに張り付く箇所が頻発する場合は、パラメータではなくアライメント側の区間過大を疑うこと。促音だけ上限を分けるなら 6f も許容範囲(単独発話実測 192.9ms≈5.8f) | | **撥音 /N/ の閉じ上限** | **4フレーム**(≈133ms)、標準は 3f | /N/ の単独発話実測は平均 121.6ms(≈3.6f)。「標準3f・上限4f」の運用が実勢に近い | | **閉じ口の下限** | **2フレーム**(≈67ms) | 実測の最短閉鎖 54ms(≈1.6f)を僅かに上回る。30fps描画で「閉じた」と視覚的に読める最小単位として妥当 | | **母音キーの最小保持** | **3フレーム**(≈100ms) | 実発音の平均像(自発話の母音部 1.5〜2.7f)より長めで、これは実測の再現ではなく**可読性のための下限の誇張**と位置づける。低速素材では実勢を大きく外れない。速い箇所で後続キーが圧縮される副作用に注意 | | **先行(リード)** | 1〜3f。両唇閉じの開始は **2f 先行まで**実測支持あり | 子音ジェスチャの閉鎖運動相は約86ms(≈2.6f)で、口形は音響的閉鎖の完了より前に動き始める。視覚同定は聴覚同定より約80ms先行する | | **アンダーシュート(短い音は中間形止まり)** | **未採用(提案のみ)** | 母音区間 ≲125ms(≲3.8f)ではフォルマントが目標値に到達しない実測(Lindblom 1963)があり、案自体は実測支持あり。実装するなら「区間3f以下は中間形止まり、4fでほぼ到達、5f以上でフル到達」の段階付けが実測の形に近い | | 囁き区間の時間補正 | **通常声と同じ設計** | 日本語の囁き声の体系的実測がほぼ無く、専用補正の根拠がない。閉じ口がやや長くなる方向の示唆のみ(英語の二次引用) | 知覚側の注意:持続時間の改変への許容度は「母音が最も狭く、鼻音・摩擦・無音(閉鎖)の順に広い」。つまり**閉じ口の時間誤差は目立ちにくく、母音区間の配分誤差が最も目立つ**。アライメントの精度は母音側に優先配分すること。また知覚は絶対msより比率(子音区間/モーラ長)で決まるため、素材の速度が変わったらフレーム数の絶対値も比率で見直す。 ### 6.6 モーフィング - **口モーフ**:口形の切り替えは単純クロスフェードではなく、**口ROI限定の密オプティカルフロー・モーフ(OpenCV DIS、双方向フローで両側からワープ+ディゾルブ)** で、クロスフェード2フレーム分をモーフ中間形に置き換える。実測で全ペアについてクロスフェードを下回らなかった方式がこれ。弱点ペア(あ↔い、え↔い、あ↔え)は他より理想から少し離れる(静止画では歯の溶けが読めることがあるが実時間では目立たない。中間コマ追加の第一候補)。 - **ペア別フェード長**:形の距離が大きいペア(閉↔あ、あ↔い等)は 3フレーム、小さいペア(お↔う等)は 1〜2フレーム。距離は口マスクの重なり具合や重心移動量から自動で測れる。 - **瞬きモーフ**:瞬きの各段階の2フレーム目を DIS フローモーフ中間形に置換する(閉じ量 0.25/0.75 の中間形)。タイミング自体は変えない。 ### 6.7 タイミング生成の手順(実行順) 1. 声ボディWAVを用意し、読み(かな)を**実音声どおり**に確定する(台本と実音声が違う箇所は実音声に合わせる。全文読みで Julius が失敗する場合は実音声側が正)。 2. Julius で音素境界・スコアを取得する。 3. エンベロープピークから発話イベント列を作る。 4. Fix5 の規則群(6.4)でイベント列を再アンカー・再配分し、口形タイミング(フレーム列)を出す。 5. 評価:すべり件数、文末ポーズ保持一致率、Julius中心一致率を機械計測し、前版と比較する。悪化していたら規則の競合を疑う(Fix5 開発時にも、規則同士の競合で一部指標が後退した経緯がある)。 6. 確認レンダー(短い区間)と静止画で要所を見てから本レンダーへ進む。 --- ## 7. 下絵アニメーションの詳細仕様(rev2) ### 7.1 方式 - **マスク+procedural ワープ**:静止画の下絵に対し、動かしてよい領域だけをマスクし、変位場で微小に揺らしてループ化する。I2V(動画生成モデル)は顔の完全静止を保証できないため使わない。 - ループ長は **6.0秒(180フレーム @30fps)**。本編ではこのループをタイル敷きする。 - 振幅は数px〜最大でも10px弱に抑える(「微風で揺れている」読みが成立する範囲)。 ### 7.2 絶対条件 - **顔保護領域の差分は全フレーム 0.0**(ピクセル単位で完全静止)。顔が動くと別人化するため、これは譲れない。 - ループの継ぎ目は不可視であること(実測:ラップ部の差分指標 0.1317 が通常部の平均 0.1328/最大 0.1808 の範囲内に収まること)。 ### 7.3 マスク設計(rev2 の到達点) マスクは編集可能な形で保持する(実績:`hair_anim_poc/rev2/masks/` に8領域+顔保護マスク)。 | 領域 | 扱い | |---|---| | 左垂れ髪/左の胸元髪 | **アニメーション対象から除外**(rev1 で衣装を引っ張る動きになったため。マスク内訳を調べると髪は約44%しかなく、残りは衣装だったのが原因)。両領域の残留変位は直下の呼吸マスク由来のみで最大 2.51px/1.06px(実測) | | 右の胸元髪 | マスクを**髪束の輪郭に沿って描き直し**(20,446 px → 11,703 px)。rev1 ではポリゴンの右半分が白フリル襟(服)だった | | 右カール髪 | 対象。最大変位 8.85px(毛先、実測) | | ペンを持つ腕(新設) | ペン+手+カフ+手首を1単位とし、支点まわりの微回転。実績:支点 (150,706)、ペン先の最大変位 3.50px、支点近傍はほぼ0 | | スカート(新設) | 黒オーバースカート+フリル裾+エプロン前当て。ウエスト側0→裾で最大の変位プロファイル、遅い基本周期のみ(位相は髪と +2.6 rad 差)。裾帯の最大変位 3.07px。右端はフリルの内側に寄せ、脚・ガーターは含めない | | 残りの髪マスク | 上端に頭飾りフリル少量・下端に毛先の隙間のフリル等が残るが、「服の大きな塊」の巻き込みが無いことを拡大図で確認してから採用する | 設計手順: 1. 第1段階としてマスクのオーバーレイ画像(対象外領域はグレー表示)と拡大確認図を作り、**マスクの中身(髪/服/背景の内訳)を先に確定**させる。マスクの面積ではなく「何が入っているか」で判断する。 2. 第2段階で 6秒ループ×2 のテスト動画を作り、顔差分 0.0 と継ぎ目の不可視を機械検証してから本番下絵にする。 3. マスクは後から直せる場所に置き、本番レンダーとは分離しておく。 --- ## 8. 画面演出の詳細仕様 ### 8.1 ズームの設計(共通) - ズームは「島」単位で設計する:寄る区間(島)を声ボディの実測発声範囲から決め、島と島の間は全画面。**隣接する島のアウトと次の島のインが近接するとヨーヨー(寄って戻ってすぐ寄る)になる**ため、その場合は独立した島を置かず、前のズームのアウトに担わせる(実績の判断)。 - 囁き区間には強いズーム(ズーム2)を**全編に同方式で適用**する(区間ごとに方式を変えない)。 ### 8.2 導入部(文字フェード+波形出現+瞬き開始) 実績値(この作品の実測タイムライン。他作品では「第一声の絶対時刻」を実測して読み替えること): | 要素 | 仕様 | |---|---| | 第一声(c01)の開始 | **絶対 6.143 秒**(計画書の推定値ではなく実測を使う。推定 7.4秒は誤りだった) | | 文字フェード | **5.143〜6.143秒の1.0秒間、smoothstep**。第一声の開始時点で文字は完全に消えていること | | 文字レイヤーの作り方 | 「完成ジャケット − 素の画面」の**差分抽出**で文字だけを抜く。フェード後は素の画面と**ピクセル単位で一致**することを確認する | | 波形の出現 | 文字と**クロスフェードで入れ替わり**に出現する(最初は非表示) | | 第一声より前の口形 | **SMILE で固定**(口パク解析の対象外。理由は第10章の事故事例) | | 瞬き | **第一声(c01)から開始**。瞬きスケジュール全体を +106フレーム平行移動し、最初の瞬きを第一声を含むフレーム(実績:フレーム184)に一致させる。それ以前は瞬きなし(目を開いたまま静止) | | 下絵アニメーション | **冒頭から動作**させる(途中から動き出すと違和感があるため) | | 演出意図 | 「静止画だと思っていたら動き出す」インパクトを狙う | ### 8.3 円形波形ビジュアル | 項目 | 採用値 | |---|---| | 配置(B案) | 右上の窓位置。**中心 (1300, 232)、公称外半径 155**(1536×1152 画面での値) | | 色 | **蛍光ピンク #FA76FF**(タイトル文字からスポイト。本線 #FCA3FF/円盤 #FDC8FF) | | モーション | 全体スケール連動:平滑化したレベルで円自体が **0.5倍(無音)〜2.0倍(最大)** に伸縮。**平均サイズは従来並みに保ち、変形幅だけを大きく**するのが要点 | | 平滑化 | attack 0.12秒/release 0.50秒。スケールは u =(平滑レベル/区間最大)^1.6 で 0.5〜2.0 に写像(実績の平均スケール約1.0、平均外周は旧方式比 0.968) | | バー(放射バー)の指数 | 0.65 → **1.0** に変更した版が本番 | ### 8.4 見せ場のカウントダウン場面の2段ズーム(採用版=中間版) 幾何(1536×1152 画面): | 段 | 矩形 | 中心 | 倍率 | |---|---|---|---| | 弱ズーム | (0, 261)–(1158.67, 1130) | (579.33, 695.5) | **1.3257倍**(到達実測 1.325662) | | 強ズーム(ズーム2と同一矩形) | (174, 436)–(866, 955) | (520, 695.5) | **2.2197倍**(到達実測 2.219653) | - ズーム2の画角設計:**目がちょうど画面外に切れ、見せたい領域が画面の 26.6% で最大化**される画角。横中心は弱ズームと縦中心を同一にし、横は最小限(実績 +59.33px)の調整で目元が見える画角にした。 - スケジュール設計の原則(絶対秒は作品ごとに実測で置く): - **第1段イン(2.25秒)**:カウントダウンの最初の数字の発声時点で弱画角が**成立**していること。インの開始はその 2.25秒前。 - **第2段イン(2.25秒)**:強い段への移行は、直前チャンクの発声終了の少し前(実績 0.355秒前=最終音の尾の内側)から寄り始め、溜めを跨いで、強い段の起点となる数字の子音開始時点で強画角が**正確に成立**すること。 - **アウト(2.25秒)**:カウントダウン最終音声の終了後、全画面へ復帰する。復帰完了は区間の窓終了の少し前(実績 0.4秒前)に置く。 - **遷移時間は全て 2.25秒**(1.5秒版=速すぎ、3.0秒版=間延び、の中間として採用)。 - **イージングは smootherstep**。 - **settle(到達後の小さな行き過ぎ)あり**:到達後 0.6秒間、進行率を `p = 1 + 0.018·sin(πu)·(1−u)`(u は settle 内の正規化時刻)として目標の先へ進めて戻す。バンプは u=0 で 0 から始まるため、**到達の瞬間は目標倍率を正確に通る**。実測ピークは第1段 **+0.341%**(1.330178)、第2段 **+0.708%**(2.235370)。アウト側に settle は付けない。なお行き過ぎ率は進行率にかかるバンプのため区間の幾何で変わる(全画面→強の単段幾何では +1.29% になる)。 - 速度の目安(倍率の変化速度の最大値):中間版は第1段イン 0.275/第2段イン 0.781/アウト 1.130(倍/秒)。初版(1.5秒・Quart-InOut)は最大 3.584 で「急」と判定された。**最大速度が 1.2 倍/秒前後を超えると急に感じる**のが実測の目安。 ### 8.5 囁きズーム(ズーム2単段) - 囁き区間はズーム2(2.2197倍・上記の強ズームと同一矩形)を単段で使う。遷移・settle の考え方は 8.4 と同じ(初期版は Quart-InOut イージング+settle で検証し、速度の基準は 8.4 の中間版に合わせてある)。 --- ## 9. 合成・書き出しと共有用圧縮 ### 9.1 レンダーの進め方 1. **単一パスレンダー**で全要素(下絵rev2+口モーフ+瞬きモーフ+文字フェード+波形+カメラ)を合成する。要素ごとに別動画を作って後で重ねる方式は、ズレの切り分けが困難になるため避ける。 2. 本レンダーの前に、**確認レンダー(短い区間を複数本)と静止画(要所のフレーム)で検証**する(実績:確認レンダー7本+静止画24枚)。確認項目:口形の文末一致、ズームの到達タイミング、フェード後のピクセル一致、波形の出現タイミング。 3. 長尺はセグメント分割してレンダーし、**全セグメントのフレーム数を再検証**してから連結する(実績:8セグメント、合計16,553フレーム。途中で実行が落ちた場合は、未完セグメントだけを再実行すればよい)。 4. 音声はマスターWAVをそのまま mux する(実績:AAC 192 kbps)。 ### 9.2 書き出し(本番マスター) | 項目 | 値 | |---|---| | 映像 | H.264、crf18、1536×1152、30fps | | 音声 | AAC 192 kbps | | 実績サイズ | 尺 551.76秒で 186 MB | ### 9.3 共有用圧縮の方針と実績 **方針:音質をできるだけ保ち、画質を犠牲にして容量を抑える(目安 約10MB)。約10MBに収まらなければ、音質を多少犠牲にしてもよい。** 実績(同一作品・尺551.76秒): | 版 | 設定 | サイズ | 結果 | |---|---|---|---| | 音声無加工・映像のみ圧縮 | 1024×768 | 34,722,477 バイト(約34.7MB) | 共有可 | | 約10MB版 | 640×480 + AAC 64 kbps | 10,188,058 バイト(約10.19MB) | 共有可 | | あぷ向け(大きめ) | 640×480 + AAC 60 kbps | 9,642,172 バイト | **無言で弾かれた**(エラー表示なし、一覧に現れない) | | あぷ向け(実績ライン) | 同上の設定で尺・画質を詰めた版 | **7,934,213 バイト** | **アップロード成功**(ファイル番号 f380858.mp4 として掲載) | - 対象はふたば☆ちゃんねる「あぷ」。ページ表示は「10.0Mまで」で MP4 対応だが、**実効上限は 7.9MB〜9.6MB の間**にある(9.64MB は弾かれ、7.93MB は通った)。ファイル名は半角英数字でも弾かれたため、名前は原因ではない。 - あぷのKB表示は **バイト ÷ 1000**(10進KB)。表示と実バイト数の換算に注意。 - 音声のみの共有(MP3):LAME VBR V0(約244kbps)で約16.8MB。あぷ向けは **112 kbps で 7,725,693 バイト**に収め、成功した(実績ライン 7.93MB より意図的に下に置く)。 - 教訓:制限のある共有先では「表示上の上限」ではなく「実績のあるサイズ」に寄せる。無言で弾かれる形式の失敗は、原因表示がないため切り分けに時間がかかる。 --- ## 10. 失敗事例と切り分け手順 症状→まず疑うところ→対処、の順に並べる。**原則:見た目の症状から素材を疑う前に、工程の上流(入力・合成式・実音声との一致)を疑う。** ### 10.1 声が始まる前から口が動く - 症状:導入部、第一声より前なのに口形が切り替わる。 - 原因:**リップシンク解析の入力にSEが混ざっていた**。導入部のドア音・足音を発声イベントと誤判定した。 - 対処:解析は声ボディ(SEなし)からのみ行う(第1.4 大原則1)。導入部の第一声より前の口形は SMILE 固定にする(第8.2)。 ### 10.2 文末の口形が台本と違う/全体に口形が少しずつ早い - 症状:文の終わりで間違った母音の口形が残る。特定の3点(笑いの後、特定の音の連続)で再現する。 - 原因:エンベロープピークの**核の誤配分**(第6.3)。弱モーラ・無声音・長い「ん」・笑いの息がピーク数をずらし、口形が約1イベント早く進む。文末のポーズ保持がその間違った口形を固定する。 - 対処:ピーク検出をいじらず、Fix5 の規則群(ゲートB6/フォールバック/笑い境界の解放/スラック借用/再配分)で吸収する。個別の症状を1件直すと別の指標が後退する(規則同士の競合)ため、**必ず評価指標(すべり件数/ポーズ保持一致率/Julius中心一致率)を前版と比較しながら**直す。 ### 10.3 口パーツの周囲に白い縁取りが出る - 症状:口の周りに白いフリンジが見える。 - 切り分け:**まず合成式(アルファブレンドの計算)を疑う**。この症状は素材の欠陥ではなく合成式の不具合だった実例がある。 - 手順:(1) 素材単体を単色背景に重ねて縁が出るか確認する→出なければ合成側。(2) 合成側なら、プリマルチプライ済みアルファの二重適用などブレンド計算を見直す。(3) 素材側だった場合のみ、透過化の仕上げ問題として扱う(ユーザーへ相談、第5.6)。 ### 10.4 インペイント素材の肌色が下絵と合わない - 症状:口まわりだけ肌の色味が浮く。 - 対処:LAB色空間での色合わせ(LABマッチ)を後段に入れる。それでも残る場合は素材品質の限界であり、**第5.6 の分担でユーザーに最終素材を頼む**。色味の最終一致は、人間の目と手作業が最も確実だった工程である。 ### 10.5 カウントダウンの数字の読みが崩れる - 症状:特定の数字から先の読みが崩れる(例:8から先が崩れる)。 - 切り分け:表記を変えても直らない場合は、表記ではなく **seed×テキストの不安定さ**を疑う。9種の表記×複数seedの比較でも、特定表記のせいとは言えない結果だった。 - 対処:表記は漢数字に固定し、`check_countdown_asr.py`(第3.4(e))で崩れたチャンクを特定して、別seedで再生成する。 ### 10.6 台本どおりに作ったのにアライメントが大きく崩れる - 症状:特定チャンクだけ Julius が失敗する、境界が全く合わない。 - 原因候補:**実音声が台本と違う**。実例:あるチャンクの実音声は、制作過程の都合で台本の前半2文しか残っていなかった(全文読みでアライメントすると失敗する)。 - 対処:読み(かな)は台本ではなく**実音声に合わせて**確定する。ASR書き起こしで裏付けを取る。音声マスターの差し替え(テイク変更)をしたら、その区間のタイミングは流用せず新規に作る(実績:差し替えチャンクは Julius を新規実行した)。 ### 10.7 音声の末尾に変な声が付く/セリフの語尾が欠ける - 症状(a):末尾に台本に無い声。→ 第3.4(b) のスクリーニングで拾い、別seedで再生成するか、ASR確認のうえで末尾を切る。 - 症状(b):語尾が欠けている。→ 過去に (a) の対処で**台本どおりの語尾まで切ってしまった**事故の再発を疑う。カット前に「切る部分が台本末尾と一致しないこと」をASRで確認する規則(第3.4(b))を守る。 ### 10.8 ズームが急に感じる - 症状:画角は合っているのにズームが唐突。 - 対処:遷移時間を延ばす(1.5秒→2.25秒で解消した実績)。倍率の変化速度の最大値が **1.2 倍/秒** を大きく超えていたら速すぎる(第8.4)。settle を消すのではなく残す(到達感は settle が作る)。 ### 10.9 下絵アニメーションで衣装が引っ張られる - 症状:髪を揺らしたつもりが、服まで一緒に動く。 - 原因:マスクの中身が髪だけではない(実績:対象マスクの約44%しか髪でなく、残りは衣装だった)。 - 対処:マスクの面積ではなく**内訳**を確認する。衣装の大きな塊を含む領域は対象から外すか、輪郭に沿って描き直す(第7.3)。顔差分 0.0 の検証は毎回行う。 ### 10.10 共有先にアップロードしても無言で消える - 症状:エラー表示なしに一覧へ現れない。 - 切り分け:ファイル名(半角英数字で再試行)→サイズ(表示上限より実効上限が小さい前提で、実績ラインまで落とす)。第9.3 の実績値を参照。 ### 10.11 尺が合わない/映像側を全部作り直すことになった - 原因:音声マスター確定後に尺へ触る修正を入れた。 - 対処:工程管理の問題として防ぐ。第2章の順序を守り、尺の変更は音声確定前に寄せる。 --- ## 11. 工程チェックリスト(この順に実行する) ### A. 音声 - [ ] 台本を文の切れ目で **100字以内** のチャンクに分割した - [ ] カウントダウン数字は TTS入力側だけ **漢数字** にした(ゼロ付近の例外表記は除く) - [ ] 生成条件は **fp32/16ステップ/linear**、参照は **latent** 指定、seed はランダム - [ ] ラウドネスガード(RMS **5200** 超で引き直し最大2回・最静テイク採用)が有効で、ログに rms/redraws が残っている - [ ] 全チャンクに末尾スクリーニングを通した - [ ] 末尾カットをした箇所は、切る部分が台本末尾と **一致しない** ことをASRで確認した - [ ] バースト候補をピーク降順に確認した(対象ファイルが実使用ソースであることを先に確認した) - [ ] 繰り返し入りチャンクは回数をASR照合した - [ ] カウントダウン入りチャンクは数字列をASR照合した(降順・欠落なし) - [ ] 連結:挿入無音 **0.6秒**、実効無音は **1.49秒** 以内(中央詰め)、声種切替点のみ1.49秒、囁きは **−4dB** - [ ] 声ボディ(SEなし)と音声マスター(SE込み)の2系統を作り、チャンク構成の一致を検証した - [ ] SEは声RMS比で管理し、無動作区間にベッドを敷いていない ### B. 素材 - [ ] 口なし下絵がある(口の消し残しと色シフトを拡大確認した) - [ ] 口パーツ一式(あ/い/う/え/お/NEUTRAL=「口閉じ」/SMILE=「笑み」)が透過PNGで揃っている - [ ] 「あ」は大サイズ(面積で小の約1.61倍)になっている - [ ] パーツ間の重心ずれを把握し、採用素材の個性として扱うか素材側で揃えた - [ ] 肌色の最終一致・形状の微修正・透過化の仕上げで詰まっていたら、ユーザーへ具体的に頼んだ(第5.6) - [ ] ユーザー提供素材を正式素材として固定し、旧素材と混用していない ### C. リップシンク - [ ] 解析入力は **声ボディのみ**(SE混入なし) - [ ] 読み(かな)は実音声に合わせて確定した(台本との差異をASRで裏付けた) - [ ] Fix5 規則群を適用した:ゲートB6(±5f局所最大 OR 前方+12f活動到達)/スコア下限ゲートなし/スキャンフォールバック/笑い境界の解放/スラック借用/距離順ドナー再配分/文末ポーズ保持の優先 - [ ] 時間パラメータ:閉じ上限 **5f**、/N/ は標準3f・上限 **4f**、閉じ下限 **2f**、母音キー最小保持 **3f**、先行 1〜3f(両唇閉じは2fまで) - [ ] 評価指標を前版と比較した(目標水準:すべり **2件以下**、ポーズ保持一致率 **0.800**、Julius中心一致率 **56.7%** 級) - [ ] 口モーフ(DIS・口ROI)と瞬きモーフ(2フレーム目を中間形に置換)を適用した ### D. 下絵・演出 - [ ] 下絵アニメーションは 6秒ループ、マスクの内訳(髪/服の混入)を確認した - [ ] 顔保護領域の差分が **全フレーム 0.0** であることを機械検証した - [ ] 導入部:第一声の絶対時刻を **実測** し、文字フェードを「第一声の1.0秒前〜第一声開始」に置いた(smoothstep、フェード後はピクセル一致) - [ ] 第一声より前の口形は SMILE 固定、瞬きは第一声のフレームから開始、下絵は冒頭から動作 - [ ] 波形:中心 (1300,232)・半径155(1536×1152時)、色 #FA76FF、スケール 0.5〜2.0倍(attack 0.12秒/release 0.50秒) - [ ] ズーム島を発声実測から決め、ヨーヨーになる近接島を統合した - [ ] カウントダウンズーム:弱 **1.3257倍** → 強 **2.2197倍**、遷移は全て **2.25秒**・smootherstep・settle あり(到達時に目標倍率を正確に通る) ### E. 合成・共有 - [ ] 確認レンダーと静止画で要所を検証してから本レンダーした - [ ] セグメント分割時は全セグメントのフレーム数を再検証した - [ ] 本番マスター:H.264 crf18 + AAC 192 kbps、1536×1152/30fps - [ ] 共有版は「音質優先・画質を犠牲」で作り、サイズ制限のある共有先では表示上限でなく実績ライン(約7.9MB)に寄せた --- ## 付記:数値の出所について - 音声工程の数値(100字/5200/1.49秒/0.6秒/−4dB/バースト閾値ほか)は `irodori-voice/voice_guide.md` の運用記録で裏付けた。 - 口形の時間パラメータの実測根拠は `invite_asmr_video/lipsync_poc/lipsync_duration_research.md`(学術実測の集約と現行値への評価表)による。 - Fix5 の指標と規則、ズームの幾何・settle 実測、波形・導入部の決定値、下絵 rev2 のマスク数値は、制作ファイル(`lipsync_poc/exp_v5/` のパラメータ記録、`full_v20/PRODUCTION_NOTES.md`、`hair_anim_poc/rev2/` 総括、`intro_test/` 報告)で裏付けた。 - 共有用圧縮のファイルサイズ(34,722,477/10,188,058/9,642,172/7,934,213 バイト)は実ファイルのサイズで確認した。音声MP3側の数値(VBR V0 で約16.8MB、112kbps で 7,725,693 バイト)と、「あ」の面積比(約1.61倍)、「う」の重心(x=571.1)は制作時の記録に基づく値で、本書の再編集時にファイル側の再計測はしていない。 - 「え」「お」の中間形の暫定定義と、素材が最終的にユーザー提供になった経緯は、制作時の決定記録による。 (以上。一軒の制作環境での再現仕様書。数値は自環境の実測・採用値であり、他環境での再現は未検証の部分を含む)