| .. | |||
| public | 3 hours ago | ||
| scripts | 16 hours ago | ||
| src | 3 hours ago | ||
| .eslintrc.cjs | 16 hours ago | ||
| AGENTS.MD | 7 days ago | ||
| README.md | 15 hours ago | ||
| package-lock.json | 1 day ago | ||
| package.json | 16 hours ago | ||
| tsconfig.json | 8 days ago | ||
Remotion と VOICEVOX を組み合わせて、複数キャラクターが時系列で登場・発話する動画テンプレートです。 サンプルテーマは「ネコミミはなぜかわいいのか?」です。
npm install
VOICEVOX のエンジンを起動してください。既定では http://host.docker.internal:50021 を参照します。 詳細は公式リポジトリを参照してください。
https://github.com/VOICEVOX/voicevox_engine
src/data/script.ts の characters と timeline を編集します。
show("sayo", {caption: "ネコミミ代表として、小夜が登場!"});
say("sayo-001", "sayo", "小夜です。ネコミミ代表として、耳のかわいさを証明しに来ました。");
say("zunda-005", "zundamon", "それじゃあ、また次回なのだ!");
characters: 表示名、VOICEVOX の speakerName / styleName、立ち絵設定を定義します。initialVisibleCharacters: 動画開始時から表示するキャラクターを定義します。show(...): キャラクターを画面に登場させ、任意の説明字幕を出します。say(...): キャラクターに読み上げさせ、字幕と音声を同期します。say(..., {voicevox: {styleName: "スタイル名"}}) を使います。npm run voice:generate
src/data/script.ts の say(...) から public/audio/lines/*.wav を生成し、 src/data/voicevox-manifest.json に長さ・話者・スタイル情報を記録します。 音声が未生成の行は、プレビュー時にテキスト長から尺を推定します。
ピザ窯サンプルの音声を生成する場合は、次を実行します。
npm run voice:generate:pizza-kiln
Rhubarb Lip Sync CLI を使い、VOICEVOX 音声から口形タイムラインを生成します。
npm run lipsync:generate
生成物は、Rhubarb の生 JSON が public/lipsync/raw/*.rhubarb.json、 Remotion 用に正規化した JSON が src/generated/lipsync/*.mouth.json、 プレビュー時に同期 import する集約 manifest が src/generated/lipsync/manifest.json です。
単体音声だけ再生成する場合は、次のように音声ファイルを指定できます。
npm run lipsync:generate -- public/audio/lines/zunda-001.wav
処理順は 1. npm run voice:generate、2. npm run lipsync:generate、 3. npm run start です。音声を作り直したら、口パク指示データも再生成してください。
Rhubarb CLI は次の順で検出します。
RHUBARB_BIN に指定された実行ファイルnode_modules/.bin/rhubarbtools/rhubarb/ または vendor/rhubarb/ 配下の実行ファイルrhubarbWindows / Linux / macOS で実行ファイル名が異なることがあります。 Dev Container で使う場合は Linux 版 Rhubarb を配置し、必要なら RHUBARB_BIN=/usr/local/bin/rhubarb のように指定してください。
日本語音声では Rhubarb の phonetic recognizer を使います。音声のみからの推定なので、 日本語の母音完全一致ではなく、動画用に自然に見える口パクを目的にしています。 Rhubarb 口形は次のように丸めます。
{
X: "rest",
A: "closed",
B: "i",
C: "e",
D: "a",
E: "o",
F: "u",
G: "i",
H: "e",
}
npm run start
npm run render YukkuriZundamon out/video.mp4
src/data/script.tssrc/data/voicevox-manifest.json (自動生成)src/generated/lipsync/manifest.json (自動生成)src/yukkuri-composition.tsx本テンプレートは、短編 VOICEVOX ドラマ動画や、実写映像を背景にした解説動画での利用を主用途としています。
そのため、字幕は @remotion/captions の Caption 型 JSON による単語単位・時刻単位の正式な字幕データとしては扱わず、src/data/script.ts の say(...) / show(...) に紐づく発話単位・シーン単位の表示テキストとして扱います。
say(...) の字幕は VOICEVOX で生成した音声尺、または未生成時の推定尺に同期して表示します。SRT/VTT 互換、単語単位ハイライト、自動文字起こし字幕が必要になった場合は、その時点で @remotion/captions の導入を検討します。
VOICEVOX_URL (既定: http://host.docker.internal:50021)src/data/script.ts の characters.*.voicevox で指定します。現在の小夜は CSS の仮立ち絵です。画像素材を使う場合は public 配下に画像を置き、 characters.sayo.avatar.imagePath に images/sayo.png のような public からの相対パスを設定してください。 口パクを使う場合は、立ち絵本体と同じ寸法の a.png / i.png / u.png / e.png / o.png / closed.png / rest.png を image/<キャラクター>-rhubarb-mouths/ に置くか、 avatar.mouthImageDir で配置先を指定してください。
以前の public/audio/zundamon.txt と src/data/script.json は互換用に残していますが、現在は参照しません。