makevideo について
makevideoは、MarkdownまたはJSONのシーンスクリプトからナレーションと字幕付きMP4を生成します。安定した動画生成を必要とするAIエージェント向けで、APIキーなしでCPU上で動作し、プレビューと検証機能も備えています。
主な機能
- 01MarkdownまたはJSONからMP4を生成
- 02ナレーションと同期字幕の生成
- 03横長・縦長・正方形動画の作成
- 04コンタクトシートによる画面プレビュー
- 05スクリプトとシーンのテンポ検証
活用シーン
- 01ナレーション付きリリースノートや振り返りの作成
- 02短尺ソーシャル動画の制作
- 03ゲームトレーラーやデモのレンダリング
MCP 対応
MCPサーバーは、MarkdownまたはJSONからの動画生成、コンタクトシートでのプレビュー、スクリプト検証、動画リファレンス取得のツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm ghcr.io/random00000000/makevideo:0.6.0ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/random00000000/makevideo:0.6.0stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
makevideo
AI エージェント向けの、高速で標準的な動画生成ツールです。 JSON スクリプトを 1 つ入力すると、毎回同じ方法でレンダリングされた完成済み MP4 が 1 つ出力されます。各シーンにセリフを添えて、シーンを作成します。makevideo は一貫した 1 つのニューラル音声でセリフを読み上げ、実際の音声に合わせて各シーンの長さを調整し、字幕を追加して、同梱の ffmpeg で MP4 をレンダリングします。CPU のみで動作し、ブラウザーも GPU も API キーもクラウドも不要です。
▶ エージェントが今すぐ動画を作成できます(1:39、エージェントが1 つの JSON ファイルから文章を作成し、音声を付けてレンダリング) · ▶ 87 秒のショーケースを見る。examples/showcase.jsonからノート PC の CPU でレンダリングされ、再生時間よりも短時間で完成します。
ショート動画にも対応: "format": "shorts" を指定すると、大きな単語単位の字幕付きで 1080×1920 の動画を作成できます。▶ TikTok 風デモを見る(examples/tiktok.json):23 秒の動画を 15 秒でレンダリングし、GIF も自動で書き出します。
その他のサンプルもすべて makevideo で作成: ▶ 0.6 の新機能:ゲームのトレーラー(仕様) · ▶ Neon Drift のゲームトレーラー(ビートシート) · ▶ 0.5 の新機能:ドキュメンタリー(仕様) · ▶ 59 秒のデモ(仕様) · ▶ ハウスボイス · ▶ 配信の振り返り · ▶ 0.4 の新機能:あらゆるエージェントにさらに対応(仕様) · ▶ 0.3 の新機能:速度(仕様) · ▶ 0.2 の新機能(1 つの Markdown ファイルから作成) · ▶ 一から作る代わりに makevideo を使う理由(仕様) · ▶ v0.1 の変更履歴動画(仕様):変更履歴や振り返りの動画は、主要なユースケースです。
できること: Electron + Three.js ゲームを撮影したショットを、ビートに合わせてカットするゲームトレーラー · ナレーション付きスライド · 自動トランジション(プッシュ、スライド、ズーム、ワイプ) · 動きのあるメッセージ · アニメーション付きグラフ · メディアとテキストの分割表示 · Markdown を書いて動画を作成 · スクリーンショット · ゲームプレイ/動画クリップ · GIF の読み込みと書き出し · コード · 統計 · 引用 · ビフォー/アフター · TikTok/Reels/Shorts 用字幕 · カスタムフォント · BGM · トレーラー用の画面録画 · .srt 字幕 · ポスターフレーム。
npm i github:random00000000/makevideo
npx makevideo init # writes video.json (or: init --style documentary | shorts | explainer)
npx makevideo video.json # → video.mp4 + video.srt + video.report.json + video.jpg
npx makevideo video.json --fast # same, about 3x faster on a first render
import { video } from 'makevideo';
await video({
title: 'Patch notes 1.2',
scenes: [
{ type: 'title', title: 'Patch 1.2', subtitle: 'Siege update', say: 'Here is what is new in patch one point two.' },
{ type: 'clip', src: 'siege.mp4', title: 'Rams breach gates', say: 'Rams can now breach wooden gates.' },
{ type: 'bullets', title: 'Also new', items: ['Faster pathing', 'New HUD'], say: 'Also new. Pathing is faster. And the HUD is redesigned.' },
{ type: 'decisions', items: ['Ship Friday?'], say: 'One decision for you. Do we ship on Friday?' },
],
});
理由
エージェントは動画を頻繁に求められますが、動画の作り方はエージェントごとに異なります。動画を作るたびに新しいパイプラインが必要になり、音声も異なり、誰かが頼まない限りナレーションはなく、レンダリングに10分かかることもあります。makevideo は、これを標準化します。
| 場当たり的なエージェントの動画 | makevideo | |
|---|---|---|
| 形式 | 毎回新しいスクリプト | 1つのJSON仕様(スキーマ) |
| 音声 | ランダムなTTS、ときには音声なし | Kokoro-82M。毎回同じ音声(af_heart) |
| ナレーション | リクエストが必要 | デフォルトで有効:すべてのシーンに say がある |
| タイミング | 推測 | 生成した音声から文ごとに計測 |
| 字幕 | めったにない | 動画に焼き込み、さらに .srt サイドカーファイルを出力 |
| 速度 | 数分 | CPUでもリアルタイムより高速(パフォーマンスを参照) |
| 検証 | 全編を見る | makevideo preview で約1秒でコンタクトシートを作成 |
デフォルトでプレミアム品質
エージェントが最初に作る動画から完成度の高いものにすることが目標です。追加設定なしで、次の機能を利用できます。
- 実際のフレームをつなぐトランジション。 各シーンは、直前のシーンの実際の最終フレームからつながります。
autoは、カットの内容に応じてプッシュ、ズーム、ワイプ、フェードを選びます。全体またはシーンごとに"transition"で上書きできます。 - パッケージに同梱されたタイポグラフィ。 Inter、Montserrat、JetBrains Mono(OFL)を同梱しているため、何もないクラウド上のLinuxマシンでも、ノートPCとまったく同じようにレンダリングできます。
- 奥行き: どのテーマにもキーライトのグラデーション、ビネット、柔らかなパネルのシャドウを適用します。
- 音声の調整: 自然な文章を書けます。
42%、v1.2、$3M、4.6x、35 s、e.g.、->はすべて正しく読み上げられ、字幕には入力した表記がそのまま残ります。 - Lint:
checkは、長すぎるテキスト、箇条書きの多用、同期していないリスト、長すぎる文、縦向き動画での情報過多なシーン、単調なペース配分を検出し、それぞれの修正方法を示します。
YouTubeドキュメンタリー(歴史、科学、恐竜)
style を1つ指定するだけで、映像と音声の雰囲気全体を設定できます。documentary(歴史チャンネル)、history(戦太鼓の音楽を追加)、または nature(科学と恐竜)を選びます。あとはスクリプトを書き、使いたい画像を指定します。
---
title: Tyrannosaurus rex, the tyrant lizard king
style: nature
thumbnailText: The real T. rex
---
## Tyrannosaurus rex
![Tyrannosaurus rex skeleton museum]()
The tyrant lizard king
> Sixty six million years ago, the largest predator in its world...
## Chapter: Built to kill
![Tyrannosaurus rex skull]()
> Chapter two. Built to kill.
## Timeline
- 68 Mya: T. rex appears
- 66 Mya: Asteroid impact
> Its story fits on one line. It appears sixty eight million years ago. It vanishes when the asteroid hits.
ほかに何も設定しなくても、次のものが得られます。
- 画像の確認:
previewは各検索で選ばれたファイルを一覧表示し、タイトルが検索語と一致しない選択(たとえば、別の種)には「?」を付けます。エージェントはレンダリング前に検索を調整できます。 - 公開用ライセンスの実画像。
![description]()(またはJSONの"search": "...")で Wikimedia Commons を検索します。公開に安全なライセンス(CC0、パブリックドメイン、CC BY、CC BY-SA)のみを使用し、動画内で画像を再利用せず、ダウンロードをキャッシュし、検索内容が細かすぎる場合は一致するものが見つかるまで検索語を短縮します。各画像には小さなクレジットを付け、完全なクレジット情報は概要欄に記載します。 - 映画のような動き: すべての静止画に、シーンごとに変化するゆっくりとしたケン・バーンズ効果(イン、アウト、左、右、上、下。
pan/focusで上書き可能)を適用し、チャプターカード(## Chapter: ...)とタイムラインを追加します。 - 音楽: 動画用にオリジナルのロイヤリティフリー音楽を生成します(
music: documentary | epic | wonder | tension)。ナレーション中は音量を下げます。 - 放送品質のラウドネス: 最終ミックスは、YouTubeの再生目標である −14 LUFS に正規化されます。
- 公開用パッケージ:
video.thumbnail.jpg(1280×720)と、YouTubeのチャプターのタイムスタンプ(最初は0:00、各チャプターは少なくとも10秒間隔)および画像クレジットを含むvideo.description.txtを出力します。
▶ T. rexの例(スクリプト):1つのMarkdownファイルからレンダリングした、2分37秒の動画です。
トランスクリプトを使う場合: 別のクリエイターのトランスクリプトは、スクリプトではなく調査資料として扱ってください。エージェントには独自のナレーションを書かせてください。他者のスクリプトを再公開することは著作権侵害であり、YouTubeでは「再利用されたコンテンツ」として収益化が無効になります。
画面上のテキストとナレーション(まとまりのルール)
エンジンはこれらのルールを適用します。スクリプトでも守ることで、動画の伝わりやすさが向上します。
- 画面にはキーワードを表示し、音声では文章を読み上げます。 タイトル、箇条書き、ラベルは短く(「ビルドが高速化」)、ナレーションは内容を文章で伝えます(「ビルドが以前の2倍の速さになりました」)。
- 大きなメッセージには、ナレーター自身の言葉を使います。 メッセージの言葉は、読み上げに合わせて一つずつ表示されるため、同じ言葉を
sayに入れてください。一致しない場合はcheckが警告します。 - 字幕で画面の表示内容を繰り返すことはありません。 画面にすでに表示されている言葉を含む字幕は、自動的に非表示になります(
.srtにはすべての行が残ります)。これを無効にするには、captions: "all"を使います。
Markdownを書いて、動画を作成する
---
theme: midnight
brand: My Game
---
# Patch 1.2
The siege update
> Here is what changed in patch one point two.
## Rams breach gates

- Wooden gates break in 3 hits
- Stone gates still hold
> Rams now breach wooden gates. Three hits and they are down. Stone gates still hold.
## Load time
- Before: 12 s
- Now: 3 s
## Decisions
- Ship Friday?
npx makevideo patch-notes.md
各 #/## 見出しでシーンが始まり、その本文によって種類が決まります。リストは箇条書き/手順/判断事項、label: number の項目はグラフ、画像または動画は画像/クリップ(テキストもある場合は分割)、コードフェンスはコード、**42%** label は統計情報、段落はメッセージになります。> で始まる行はナレーションです。シーンにナレーションがない場合は、画面上のテキストが読み上げられます。ナレーションがデフォルトだからです。`` でシーンのオプションを設定します。examples/whats-new-0.2.md をご覧ください。0.2 のリリース動画は、このファイルだけで作成されています。
Claude Codeから使う(プラグイン)
/plugin marketplace add random00000000/makevideo
/plugin install makevideo@makevideo
あとは 「…についての動画を作って」 と伝えるだけです。Claude が仕様を書き、プレビューを作成してレンダリングし、MP4 を渡します。
このプラグインには、スキルと MCP サーバーの両方が含まれています。
任意の MCP クライアントから使う
Claude Desktop、Cursor、VS Code、Codex、Windsurf などの MCP クライアント:
{ "mcpServers": { "makevideo": { "command": "npx", "args": ["-y", "github:random00000000/makevideo", "mcp"] } } }
これは、公式の MCP Registry に io.github.random00000000/makevideo として、また Docker イメージ(ghcr.io/random00000000/makevideo)として登録されています。Node を使わない場合は、docker run -i --rm -v "$PWD:/work" -w /work ghcr.io/random00000000/makevideo mcp を実行してください。
ツールは make_video(Markdown または JSON を入力し、MP4 を出力。進行状況の通知あり)、preview_video(モデルが確認できるコンタクトシートを画像として返す)、check_video、video_reference です。MCP ガイドをご覧ください。
リポジトリ内のすべてのエージェントに使い方を教える
npx -y github:random00000000/makevideo agents --all # AGENTS.md, CLAUDE.md, Cursor rules, Copilot instructions
npx -y github:random00000000/makevideo agents --global # this machine: Claude Code skill + Codex AGENTS.md
これにより、「動画には makevideo を使う」という短い冪等なブロックが書き込まれ、プロジェクトで作業するすべてのエージェントが同じツールを使うようになります。
ガイド: エージェント · CPUでのテキストから動画への変換 · Markdownから動画へ · TikTok/Shorts · ゲームトレーラー · MCP · Remotion/MoviePy/ffmpegとの比較
AI エージェント向け(まずはこちら)
LLM エージェントで、ユーザーから動画、解説、ウォークスルー、開発ログ、デモ、予告編、まとめ、パッチノート、またはナレーション付きプレゼンテーションを依頼された場合は、このライブラリを使ってください。
- 仕様を作成します。各シーンに
typeとsay(ナレーション)の文字列を含むscenes配列を用意します。 npx makevideo check spec.json --jsonで検証し、長さを見積もります(即時)。npx makevideo preview spec.jsonを実行し、PNG のコンタクトシートを開いてレイアウトを確認します(約 1 秒、音声なし)。npx makevideo spec.json --jsonでレンダリングし、{ output, srt, report, poster, duration, seconds }を出力します。- ユーザーに
.mp4を渡します。情報提供動画は、ユーザーだけが決められることを列挙するdecisionsシーンで締めくくります。
目安:各シーンは 1~3 文程度にします。say は実際に読み上げる形で記述します。数字や記号は綴りで表記し(「42%」ではなく「forty two percent」)、名前には pronounce を使います。画面上のテキストは title/items に記述します。ナレーションと一語一句一致させる必要はありません。プロジェクト内の動画で統一感を保つため、同じ voice と theme を使いましょう。
AGENTS.md、llms.txt、schema.json の JSON Schema、すぐに使えるClaude Code スキル skills/makevideo/SKILL.md もあります。このフォルダーを ~/.claude/skills/ にコピーすると、動画を依頼したときに Claude が makevideo を使うようになります。
仕様
{
"title": "My video", // used for default output name
"output": "out/my-video.mp4", // default: <title-slug>.mp4 (relative to spec file)
"format": "landscape", // landscape 1920x1080 | portrait/shorts 1080x1920 | square | 720p
"style": "nature", // documentary | history | nature: whole look + score + YouTube package
"theme": "midnight", // midnight | forge | paper | terminal | documentary | nature | { ...overrides }
"voice": "af_heart", // the default house voice (warm female); "fast" = ~10x real-time Piper voice (male); false = silent
"speed": 1, // speech rate
"brand": "My Project", // small label top-right
"captions": true, // burned-in captions (an .srt is always written)
"progressBar": true, // chapter bar along the bottom
"music": "documentary", // generated score: documentary | epic | wonder | tension, or a file; ducked under the voice
"musicVolume": 0.12,
"pronounce": { "Hacksilver": "Hack silver" }, // TTS-only substitutions (merged over built-ins for JSON, MP4, GPU, ...); captions keep originals
"quality": "standard", // draft | standard | high
"transition": "auto", // auto | push | slide | zoom | wipe | fade | dip | cut (also per scene)
"captionStyle": "classic", // classic (subtitle box) | bold (TikTok word-by-word, default for portrait) | none
"font": "fonts/Anton.ttf", // display font: a .ttf/.otf path or an installed family name
"gif": { "width": 480, "fps": 12, "duration": 8 }, // also export an animated GIF (true = defaults)
"scenes": [ /* see below */ ]
}
すべてのシーンで say(ナレーション)と、任意の duration(最小秒数)を指定できます(say がない場合は必須です)。シーンの長さは、ナレーションの長さに短い余白を加えたものになります。
| type | fields | notes |
|---|---|---|
title | title, subtitle?, kicker? | オープニングカード。締めくくりには outro もエイリアスとして使えます |
bullets | title?, items[], highlight? | 項目は文に同期して表示されます。項目が N 個の場合、導入文を 1 文加えるのが最適です |
steps | title?, items[] | 番号付きリスト |
decisions | title?, items[] | 「ユーザーが決める必要のあること」を番号付きで表示 |
image | src, title?, subtitle?, fit?, zoom? | ゆっくりズームインします。fit: "contain" は画像全体をぼかした背景とともに表示します |
clip | src, start?, title?, subtitle?, fit? | 任意の mp4/webm/mov。画面いっぱいにトリミングされ、短い場合はループ再生されます。元の音声は削除されます |
code | code, title?, highlight? ([3, [5,8]]) | 構文に応じて色分けし、行番号を表示します |
stat | value, label? | 数値がカウントアップします("42%"、"$1.2"、"3x") |
quote | text, by? | |
compare | title?, left: {title, items}, right: {title, items} | 縦向きでは上下に配置されます |
statement | text, kicker?, align? | 動きのある大きな文字で表示されます。音声に合わせて単語が現れ、アクセントを付ける単語は *stars* で囲みます |
chart | bars: [{label, value}] (or {label: value}), title?, unit?, prefix?, highlight?, note? | 音声に合わせて棒が伸び、値がカウントアップします |
chapter | title, number?, subtitle?, src or search | セリフ体のタイトルを使った、画面いっぱいに画像を表示する章タイトルカード(Markdown では ## Chapter: ...) |
timeline | events: [{when, label}], title? | 音声に合わせてイベントが点灯します(## Timeline と - When: what) |
split | src (image or video), title?, items? or text?, side? (left/right) | メディアの横に同期する項目を表示します。動画はフレーム内で再生されます |
シーンの type を省略すると、自動的に推定されます(src + items/text → split、src → image/clip、bars → chart、items → bullets、code → code、value → stat、text → statement)。
CLI
makevideo <spec.json|spec.js> render (mp4 + srt + json report + jpg poster)
makevideo check <spec> validate, estimate duration (instant)
makevideo preview <spec> contact-sheet PNG of every scene (about 1 s)
makevideo init [file] [--style trailer] starter spec / trailer beat sheet
makevideo shoot <trailer.md> [--all] [--only "Label"] film every shot from your Electron game
makevideo beats <song.mp3> tempo, beats and sections of your track
makevideo record <out.mp4> --seconds 10 [--window "Game"] record screen/window for clip scenes
makevideo agents [--all|--global] tell agents to use makevideo for videos
makevideo mcp MCP server (stdio)
makevideo setup pre-download voice models
makevideo voices | themes | types | transitions | formats
-o <file> --draft --format <f> --voice <id> --theme <name> --json
.js 仕様では export default { ... }(または仕様を返す非同期関数)を使用できます。データからシーンを生成する場合に便利です。
API
import { video, check, preview, VOICES, THEMES, SCENE_TYPES } from 'makevideo';
const r = await video(spec, { baseDir, onProgress: (e) => console.log(e.stage, e.message) });
// r = { output, srt, report, poster, duration, seconds, scenes: [{ index, type, title, start, duration, say }] }
check(spec) // { ok, problems[], estimatedSeconds }
await preview(spec) // { output: '...preview.png' }
エラーはエージェントが対処できるように記述されています。対象のシーン名と、動作する例が含まれます。
makevideo: invalid spec
- scenes[2] (clip) is missing "src". Example: {"type":"clip","src":"gameplay.mp4","start":2,...}
- scenes[4] has no "say" (narration) and no "duration". Narration is the default in makevideo: ...
ゲームトレーラー:ショットリスト → 撮影済みショット → ビートに合わせた編集
▶ Neon Drift トレーラーを見る(36 秒)。サンプルの Electron + Three.js ゲームでは、1 つのビートシートからすべてのショットを撮影しており、すべてのカットが音楽のビートに合っています。
トレーラーは、ショットリスト、ショット、そして音楽に合わせた編集で構成されます。makevideo はそのすべてを行います。
npx makevideo init --style trailer # trailer.md: a beat sheet (shots, text slams, logo, Wishlist card)
npx makevideo preview trailer.md # storyboard on the beat grid + trailer lint (about 5 s)
npx makevideo shoot trailer.md # launches your Electron game and films every shot
npx makevideo trailer.md # cuts it on the beat with a score, text, logo and end card
1. ショットリストはビートシートです。 各 ## ブロックは、音楽のビート数で測った編集の 1 ビートです。shot ブロックには撮影する内容を記述します。単独のテキスト行はインパクトのあるカードになります。# はロゴです。「Steamでウィッシュリストに追加」はエンドカードです。
---
style: trailer
title: Neon Drift
bpm: 110
---
## Dogfight
```shot
setup: |
game.reset(); game.wave(20);
camera: orbit hero 9 2 -40 40
```
FLY FAST
## Until
THEN THEY CAME
# NEON DRIFT
A neon arena shooter
## Wishlist on Steam
Coming 2027
2. ゲームが自ら撮影します。 ゲームに 2 行追加します。
// Electron main process
require('makevideo/electron').attach(win);
// renderer (your Three.js code)
window.makevideo = { renderer, scene, camera };
makevideo shoot はゲームを起動し、各ショットの setup コードを実行して、カメラを移動させます(名前付きオブジェクトの周囲で orbit、push、dolly、fly、follow、hold)。その後、キャンバスを 1920×1080 で、仮想時間に基づいてフレームごとに録画します。マシンがゲームを 20 fps でレンダリングしていても、映像は 30/60 fps で完全に滑らかになり、HUD がショットに映り込むこともありません。ゲーム本来の音声が必要なショットでは、mode: realtime を使用できます。
インスタントリプレイ: プレイ中に F8 を押すと、直前の 15 秒間を makevideo-clips/ に保存できます。スクリプト化できない瞬間のための機能です。
3. 編集は音楽に合わせて構成されます。
- 各シーンの長さは整数個のビートで、各カットはビートから半フレーム以内に収まります。
- ヒットに合わせたカットではフラッシュします。
- 生成されるスコアは、セクション(イントロ → ビルド → ドロップ → ブレイクダウン → フィナーレ → アウトロ)に合わせて、ブラム、ドラム、ライザーを加えます。自分のトラックを使うこともできます。
makevideo beats song.mp3でテンポ、ビート、セクションを検出し、bpm+musicOffsetで同期を正確に合わせます。 - クリップは指定された
speed(またはramp: 1>0.3)で再生され、start: autoはクリップの中で最も動きのある区間を選びます。 - 各クリップのゲーム音声は音楽の下に重ねられ、マスター音量は −14 LUFS に正規化されます。
トレーラーの lint では、優れた Steam トレーラーの編集方法に基づいたルールを適用します。
- 5 秒以内にゲームプレイを入れる
- ゲームプレイの後にロゴを表示し、その前には表示しない
- 長さは 30~90 秒
- 行動喚起で締めくくる
- テキストカードは 5 語以下
- テキストカードを 3 枚連続させない
- ループしてしまうクリップ
- 音楽より長く続くショット
画面録画
ゲームが Electron 製ではない場合や、生の映像が必要な場合は次のようにします。
npx makevideo record captures/siege.mp4 --seconds 12 --window "Hacksilver" # one window (Windows)
npx makevideo record captures/menu.mp4 --seconds 8 # whole screen (Win/macOS/Linux)
その後、ビートシートで  を使用します。
パフォーマンス
makevideoは、ほとんどのエージェント用サンドボックスやクラウドランナーにGPUがないため、CPUで動作するように構築されています。
高速化したい場合は、--fastを追加してください(または"voice": "fast"を指定します)。これにより、2つのCPUスレッドで実時間の約10倍の速度で話すPiper音声に切り替わります。デフォルトのKokoroは、すべてのコアを使って実時間の約2倍の速度です。高速音声は自然さに欠けるため、下書き、長い動画、高速な反復に最適です。
npx makevideo video.md --fast # fastest: Piper voice + quick encode
npx makevideo setup # once per machine/image: pre-download voice models
同じ74秒、8シーンの動画(examples/whats-new-0.2.md)を、他の作業でマシンの約35%が使用されている状態のi7-10750H搭載ノートPC(6コア、GPUなし)で測定しました。両バージョンを続けて実行しています。
| v0.2.0 | v0.3.0 | |
|---|---|---|
| 初回レンダリング(音声のキャッシュなし) | 119.9 s | 81.0 s |
--fast音声での初回レンダリング | n/a | 36.3 s |
| 再レンダリング(音声のキャッシュあり) | 41.0 s | 28.4 s |
高速化の仕組み:
- フレームの保持。 スライドはほとんどの時間、静止しています。変化する可能性のあるフレームだけを描画します。各シーンタイプは、開始アニメーションの長さを正確に把握しているため、一般的なシーンでは「動的な」フレームが50%ではなく約30%になります。保持したフレームは色変換後にffmpeg内で繰り返されるため、ほとんどコストがかかりません。
- レンダリングプロセス。 シーンの描画とエンコードはワーカープロセスのプール(各プロセスにキャンバスとffmpegを1つずつ配置)で行われるため、描画にはNodeのメインスレッド1つではなく、多数のコアが使われます。ワーカーは音声の生成中に起動します。
- 音声処理の調整。 Kokoroは1~3個のプロセスとして動作し、ONNXスレッドはコア数/2/Nに固定されます。各プロセスがすべてのコアを確保すると、互いに競合するためです。アイドル状態のONNXスレッドはスピンせずにスリープし、レンダラーがCPUを使えるようにします。
- パイプラインの並列処理。 各シーンは、そのナレーションが用意でき次第レンダリングされます。ポスター、GIF、最終的なマルチプレクス処理は並行して実行されます。
- キャッシュ。 各文の音声は(エンジン、音声、速度、テキスト)ごとに
~/.cache/makevideoにキャッシュされます(MAKEVIDEO_CACHEで変更できます)。レイアウトを調整した後の再レンダリングでは、音声処理を完全に省略できます。 - 推測ではなく測定。 それぞれの最適化はプロファイルに基づいています。効果がなかった案もあります。フィルムグレイン(パターン塗りつぶしは1フレームあたり80 msかかります)、透明なコンテンツレイヤー(Skiaでは遅くなります)、x264スレッドの増加(シーンあたり2スレッドのほうが4スレッドより速くなります)です。
調整項目:--fast、quality: "draft"、format: "720p"、MAKEVIDEO_THREADS(シーンあたりのx264スレッド数、デフォルトは2)、video(spec, { concurrency, ttsWorkers, ttsThreads })、シーンごとのプロファイルを表示するMAKEVIDEO_DEBUG=1。
仕組み
spec ─► validate ─► split narration into sentences ─► Kokoro TTS pool (cached)
│ per scene, as soon as its audio is ready
▼
measure audio → scene duration, caption cues, reveal times
▼
Skia canvas draws only frames that change ─► ffmpeg (loop holds, x264)
▼
concat segments + narration WAV (+ music) ─► .mp4 .srt .json .jpg
要件
Node 18以上が必要です。それ以外はすべてnpmからインストールされます。ffmpeg-staticにはffmpegが含まれ、@napi-rs/canvasにはビルド済みのSkiaが含まれ、kokoro-jsはONNX Runtimeを通じてローカルで音声を生成します。CIでは、プッシュのたびにLinux、macOS、Windows(Node 20および22)でテスト動画をレンダリングします。
クレジットとライセンス
MITです。音声にはkokoro-js経由のKokoro-82M(Apache-2.0)を使用しています。動画はFFmpegでエンコードされます(ffmpeg-static経由)。
キーワード:AI動画ジェネレーター、テキストから動画への変換、動画の作成、ナレーション付き動画、高速動画生成、ボイスオーバー、TTS動画、解説動画ジェネレーター、プログラムによる動画生成、Node.js動画ライブラリ、JSONからのffmpeg動画、ナレーション付きスライドショー、自動字幕、字幕、SRT、エージェントツール、Claude Code動画、Codex動画、LLM動画生成、開発ログ動画、パッチノート動画、ゲームプレイトレーラーのナレーション、ブラウザー不要のRemotion代替ツール。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。

