マニュアル

Movo は動画をプロジェクト JSON で書き、CLI から検証・描画・計測するツールです。 22 のコマンドがあり、どれも movo <コマンド> --help で同じ説明が読めます。

5 分ではじめる

$ movo doctor                       # 環境の診断
$ movo init my-video                # 雛形を作る
$ cd my-video
$ movo validate movo.json           # 検証
$ movo frame movo.json -t 1 -o check.png    # 1 枚だけ描く
$ movo render movo.json -o out.mp4  # 書き出す

movo initmovo.jsonassets/ を作ります。 サンプル素材も一緒に生成されるので、そのまま render まで通ります。 テンプレートは --template で選べます (basic / text / physics / character / showcase)。

エージェントから使う

AI エージェントや自動化スクリプトから使うときは、次の順に回すと安定します。 画面操作は 1 つも要りません。

  1. 使える部品を機械可読で受け取る。 movo skill list --jsonmovo list effects --jsonmovo list easings --json で、その版で実在する名前が取れます。 名前を推測せず、ここから選ばせると失敗が減ります。
  2. JSON を書く。 スキーマは https://movo.dev/schema/project-v1.json です ($schema に書いておくとエディタの補完が効きます)。
  3. 検証する。 movo validate mv.json --jsonissues[]pathmessage を持つので、 そのまま修正指示にできます。終了コード 3 で «JSON が不正» と分かります。
  4. 1 枚描いて確かめる。 movo frame mv.json -t 4.0 -o check.png。 画像を見られるエージェントなら、ここで «読めるか» を判断できます。
  5. 書き出して測る。 movo render のあと movo profile out.mp4 --json / movo compare で 狙った作風に寄っているかを数値で確認します。

機械可読な出口

  • --json: 対応コマンドは結果を JSON で返します。
  • --quiet: 進捗表示を抑えます。ログを読ませるときに。
  • 終了コード: 失敗の種類ごとに違う値です(一覧)。

同じ JSON からは同じ動画が出ます

乱数は project.seed で固定され、--jobs で区間に割って 並列に描いても出力は変わりません。だから 生成した JSON を git に入れて差分レビューでき、 CI で «前回と同じものが出ること» を検査できます。 --seed で 1 回だけ上書きすることもできます。

コマンド一覧

作る・描く

movo init <名前>プロジェクトの雛形を作る。--template / --width / --height / --fps
movo validate <file>スキーマ検証と意味検証。--json / --strict
movo render <file>書き出す。-o / -f / -q / --jobs / --from / --to / --seed
movo frame <file>1 枚だけ描く。-t 秒 または --frame 番号
movo frames <file>連番で描く。--from / --to / --pattern
movo preview <file>ローカルサーバーを立ててブラウザで見る(既定ポート 7777)
movo make <recipe>保存した «作り方» からもう一度作る
movo params <file>差し替えられる項目を一覧する
movo batch <テンプレート>1 つの型 × N 通りの入力値を連番で書き出す。--input / --out / --continue

音と歌詞

movo analyze <音声>BPM・1 拍目・小節・区間を推定する
movo lyrics align <音声>時刻の無い歌詞に時刻を付けて .lrc にする
movo make-mv <音声>曲に合わせた MV を 1 本作る

測る・寄せる

movo profile <動画|JSON>映像を 8 つの指標で数値にする
movo compare <動画>目標値と突き合わせ、外れた項目の直し方を出す

部品と環境

movo skill <list|show|render|expand|new>スキル(テンプレート)を扱う
movo list <種類>使える部品の一覧(後述)
movo assets <generate|plan>宣言された AI 素材を生成する/生成計画だけ見る
movo plugin <list|create>プラグインを一覧・作成する
movo config <set|get|list|unset|path>API キーなどの設定(~/.movo/config.json に 600 で保存)
movo doctorPython・ffmpeg・フォント・NumPy / Numba を診断する
movo setup-ffmpegffmpeg を ~/.movo/bin に用意する

どこでも使える共通オプション

-h, --helpヘルプ
-v, --versionバージョン
--quiet進捗表示を抑える
-V, --verbose詳細ログ
--debugデバッグログ(例外の追跡も出す)
--json結果を JSON で出す(対応コマンドのみ)

JSON の書き方

プロジェクト JSON は プロジェクト → 動画設定 → シーン → レイヤー という入れ子です。必須は video.widthvideo.height だけで、 あとは足していく形です。

{
  "$schema": "https://movo.dev/schema/project-v1.json",
  "movoVersion": "1.0",

  "project": { "name": "my-video", "seed": 12345 },
  "video":   { "width": 1920, "height": 1080, "fps": 30, "duration": 6, "background": "#0f1220" },
  "assets":  { "logo": "assets/images/logo.png" },

  "scenes": [
    {
      "id": "main",
      "start": 0,
      "duration": 6,
      "layers": [ ... ]
    }
  ],

  "audio":  [],
  "render": { "quality": "standard" },
  "output": { "format": "mp4", "codec": "h264" }
}

トップレベル

キー中身
projectname / seed / bpm / rootseed が決定性の要です
videowidth / height(必須)、fps / duration / background / safeArea
assets素材の名前 → パス。ここで宣言した名前しかレイヤーから参照できません
variables式から読める値。使い回す数値を置く
variants同じ JSON から 16:9 / 9:16 / 1:1 を出すための «違うところだけ»
camera2.5D カメラ。レイヤーの transform.z と組み合わせて視差を作る
scenesカットの配列
audio音のトラック
renderquality: draft / preview / standard / high / ultra
outputformat: mp4 / webm / mov / gif / png-sequence / wav

レイヤー

idtype が要ります。id は全体で一意にしてください (重複は validate で落ちます)。位置と大きさは transform、 見た目は種別ごとのキー(style / shape / asset …)です。

{
  "id": "title",
  "type": "text",
  "text": "秋の窓",
  "start": 0,
  "end": 4,
  "style": {
    "size": 96,
    "color": "#ffffff",
    "align": "center",
    "stroke": { "color": "#00000099", "width": 4 }
  },
  "transform": {
    "x": 960, "y": 260,
    "anchorX": 0.5, "anchorY": 0.5,
    "opacity": 1, "rotation": 0, "scale": 1
  },
  "effects": [ { "type": "bloom", "amount": 0.4 } ],
  "mask":    { "type": "rectangle", "feather": 12 }
}

start / end はシーン内の秒です。省くとシーンいっぱいになります。 group レイヤーの子は layers に入れます。

拍で時間を書く

時間の欄には秒のほかに 拍と小節が書けます。 "duration": "8bar""start": "4beat" のように書くと、 project.bpm から秒へ解決されます。BPM は曲から取ることもできます。

"project": { "bpm": { "fromAudio": "song", "fallback": 120 } }

動かす

値を動かす方法は 3 つあります。混ぜても使えます。

1. キーフレーム

"animations": [
  {
    "property": "transform.opacity",
    "keyframes": [
      { "time": 0, "value": 0 },
      { "time": 1, "value": 1, "easing": "easeOut" }
    ]
  }
]

イージングは 45 種。movo list easings で一覧できます。

2. 式

毎フレーム評価される式です。time / bpm / beatPulse(...) / wiggle(...) / audio などが使えます。 式エンジンはサンドボックスで、ファイル・ネットワーク・プロセスには触れません。

"y": { "expression": "540 - beatPulse(bpm, 1, 9) * 14" }

3. モジュレーター

周期的な揺らぎを値に足します。frequency / amplitude / phase を持ち、combineadd / multiply / replace / min / max / average)で 元の値との混ぜ方を選べます。

"rotation": {
  "value": 0,
  "modulator": { "type": "sine", "frequency": 0.5, "amplitude": 3 }
}

使える部品

数と名前は版によって増えます。実際に使う版で movo list を叩いて確かめてください。 --json を付ければそのままエージェントに渡せます。

$ movo list layers
$ movo list effects --json
種類中身v0.1.0 での数
layersレイヤーの種別(text / image / shape / particle / mesh …)24
effectsエフェクト(bloom / glitch / halftone / lensFlare …)69
easingsイージング45
blendsブレンドモード22
deformers変形(bend / wave / meshWarp …)16
masksマスクの形10
particles粒子の種類7
physics物理(剛体・拘束・IK)6
renderersレンダラ6
profiles作風の目標値10

ほかに modulators / functions / formats / presets が引けます。

スキル

スキルは «入力値だけで絵になる» ひとまとまりです。JSON をゼロから書かずに、 名前と値を渡すだけで動画になります。大きさの違いで 4 段階あります。

種類置き場中身同梱数
基礎アニメーションanimations/1 レイヤーぶんの動き(登場・退場・持続)28
スキルskills/レイヤー群(文字と飾り、天候の演出など)15
シーンscenes/1 カットぶん(尺・背景・レイヤー一式)12
ムービーmovies/1 本ぶん(シーンの並び)3

使う

$ movo skill list --json                 # 一覧(機械可読)
$ movo skill show lyric-line             # 入力値と生成されるレイヤー
$ movo skill render weather --set kind=sakura --preset 720p
$ movo skill expand title-card --set title=Movo -o project.json

入力値の渡し方は 3 通りで、--set がいちばん強く効きます。

--set key=value何度でも。数値・true/false・JSON 配列も解釈します
--with '{"text":"あ"}'まとめて JSON で
--inputs <file.json>ファイルから

同梱スキル 15 個の作例

下の GIF は すべて Movo が実際に書き出したものです。 コマンドはそのままコピーして動きます(-f gif で書き出したあと、 README の手順で ffmpeg のパレット生成を通してファイルを小さくしています)。 素材は Movo-py/assets/free/CC0 とパブリックドメインのものだけです。

飛ぶ: audio-bars / counter-stat / cutin-title / flash-cut / glitch-overlay / logo-sting / lyric-line / lyric-vertical / manga-panel / night-sky / photo-slide / physics-drop / split-screen / title-card / weather

下端の 32 本のバーが左右対称に上下し、中央の円が拍で膨らむアニメーション

audio-bars — 音声ビジュアライザ

audio に wav を渡すと波形そのものに同期し、渡さなければ bpm で拍を作ります。中央の円は低域に反応して拡大し、拍で跳ねます。

主な入力値 audio(既定は空)/stylebars / mirror / wave、既定 bars)/ bars(既定 56・2〜512)/ring(既定 true)/ bpm(既定 120)/duration(既定 8)

$ movo skill render audio-bars --set style=mirror --set bars=32 \
    --set bpm=120 --set duration=3 --width 640 --height 360 --fps 12 \
    --background '#0a0a12' -f gif -o audio-bars.gif
見出しの下で数字が 12,345 回まで回り続けるアニメーション

counter-stat — 数字カウンター

from から to まで数字が回ります。 3 桁区切りは separator、単位は suffix で付きます。 見出しと下線が一緒に出るので、実績や統計をそのまま置けます。

主な入力値 label(既定「総再生数」)/from(既定 0)/ to(既定 12345)/suffixseparator(既定 true)/size(既定 120)

$ movo skill render counter-stat --set label=総再生数 --set to=12345 \
    --set suffix=回 --set size=280 --set duration=3 --from 0.25 \
    --width 640 --height 360 --fps 12 --background '#0b0b10' -f gif -o counter-stat.gif
集中線が内側から開き、中央に「サビ」の文字が集まって現れるアニメーション

cutin-title — 集中線カットイン

集中線が内側から開きながら、文字が四方から集まります。 線は lineCount 本まで増やせて、脈は bpm に同期します。 サビ前の 1〜3 秒に置くための短いカットです。

主な入力値 text(必須・既定「サビ」)/bpm(既定 174)/ lines(既定 true)/lineCount(既定 180・4〜2000)/ textSize(既定 140)/background(既定 #12081c

$ movo skill render cutin-title --set text=サビ --set bpm=174 \
    --set lineCount=120 --set duration=2.5 \
    --width 480 --height 270 --fps 10 -f gif -o cutin-title.gif
白い光が画面いっぱいに広がり、線を外へ散らしながら消えていくアニメーション

flash-cut — フラッシュカット

画面いっぱいの色が不透明度 1 から 0 へ落ち、同時に 220 本の線が外へ散ります。 他の映像に重ねて使うトランジションで、単体で描くと最後は透明です (この GIF は --background で下地を敷いています)。

主な入力値 color(既定 #ffffff)/ duration(既定 0.6・0.05 以上)/lines(既定 true)

$ movo skill render flash-cut --set duration=1 \
    --width 640 --height 360 --fps 20 --background '#12081c' -f gif -o flash-cut.gif
青い帯と走査線が飛び跳ね、画面全体が揺れるアニメーション

glitch-overlay — グリッチのオーバーレイ

9 本の帯が乱数で跳ね、色収差とノイズが全画面に重なります。 interval 秒ごとに発作的に暴れshake で画面ごと揺れます。 切り替えの直前に 1 秒だけ置くのが効きます。

主な入力値 amount(既定 0.6・0〜1)/color(既定 #4cc9f0)/ interval(既定 2・1 以上)/shake(既定 20)

$ movo skill render glitch-overlay --set amount=0.7 --set interval=1 \
    --set duration=1.6 --width 480 --height 270 --fps 12 \
    --background '#101018' -f gif -o glitch-overlay.gif
発光が膨らみ、MOVO の文字が回りながら現れるアニメーション

logo-sting — ロゴスティング

asset に渡したロゴ画像(無ければ text の文字)が 回りながら現れ、後ろの発光が膨らみます。出たあとも脈打ち続けるので、 2〜3 秒の締めのカットとしてそのまま置けます。

主な入力値 asset(宣言済みの素材名)/text(既定 MOVO)/ size(既定 320)/glowColor(既定 #4cc9f0)/ duration(既定 2.5)

$ movo skill render logo-sting --set text=MOVO --set duration=2.5 \
    --width 640 --height 360 --fps 12 -f gif -o logo-sting.gif
歌詞「夜のとばりが降りて」が左から順に塗られていくアニメーション

lyric-line — 歌詞 1 行(カラオケ塗り)

未塗りの baseColor から fillColor へ、 左から塗られていきます。塗る区間は startAtendAtendAt が 0 なら尺いっぱい)。reading を渡すと下にふりがなが並びます。

主な入力値 text(必須)/readingsize(既定 64)/ baseColor(既定 #5d6790)/fillColor(既定 #ffd166)/ startAt(既定 0.25)/y(中心からの縦位置)

$ movo skill render lyric-line --set text=夜のとばりが降りて \
    --set reading=よるのとばりがおりて --set size=150 --set duration=3 \
    --width 640 --height 360 --fps 12 --background '#0a0a12' -f gif -o lyric-line.gif
縦書きの 2 列の歌詞が右から左へ並び、上から塗られていくアニメーション

lyric-vertical — 縦書きの歌詞

改行ごとに列が増え、右から左へ並びます。塗りは上から下です。 改行は --set では書けないので、--with に JSON で \n を渡してください。

主な入力値 text(必須・改行で列)/size(既定 56)/ fillColor(既定 #4cc9f0)/x(中心からの横位置)/ startAt(既定 0.25)

$ movo skill render lyric-vertical --with '{"text":"静かに\n息をする"}' \
    --set size=140 --set duration=3 --width 640 --height 360 --fps 12 \
    --background '#0a0a12' -f gif -o lyric-vertical.gif
網点になったすすきの写真にコマ枠が引かれ、集中線が回り、吹き出しが飛び出すアニメーション

manga-panel — 漫画コマ風

写真を網点と輪郭線で漫画化し、コマ枠が手描きの震えつきで引かれ、 集中線が回り、吹き出しが飛び出します。levels が階調数、 dotSize が網点の大きさです。 素材を使うので、宣言済みの名前を渡せるプロジェクト JSON から呼びます。

主な入力値 asset(空ならトーンだけ)/text(空で吹き出しが消える)/ levels(既定 4・2〜12)/dotSize(既定 5)/ lines(既定 true)/frame(既定 true)

{
  "movoVersion": "1.0",
  "project": { "name": "manga-panel", "seed": 3 },
  "video": { "width": 400, "height": 225, "fps": 8, "duration": 1.6, "background": "#f5f2ea" },
  "assets": { "susuki": "assets/free/susuki.png" },
  "scenes": [{ "use": [{ "skill": "manga-panel", "with": {
    "asset": "susuki", "text": "CLIMAX", "levels": 4, "dotSize": 5, "duration": 1.6
  } }] }]
}
$ movo render manga-panel.json -f gif -o manga-panel.gif
濃紺から青へのグラデーションの上で、細かい星の粒がまたたくアニメーション

night-sky — 夜空

topColor から bottomColor への縦のグラデーションに、 stars 個の粒を撒いた背景です。ほかのスキルの下に敷いて使います。

主な入力値 topColor(既定 #05060f)/ bottomColor(既定 #243b7a)/ stars(既定 140)/duration(既定 8)

$ movo skill render night-sky --set stars=160 --set duration=4 \
    --width 560 --height 315 --fps 10 -f gif -o night-sky.gif
すすきの写真がゆっくり寄りながら、夕暮れの木の写真へクロスフェードするアニメーション

photo-slide — 写真のスライド

素材名を並べるだけで、1 枚 each 秒のケン・バーンズoverlap 秒のクロスフェードでつなぎます。film でフィルム調、 caption で下にキャプションが出ます。尺は「枚数 × each」で決まります。

主な入力値 assets(宣言済みの素材名・カンマ区切り)/each(既定 3)/ overlap(既定 0.6)/film(既定 true)/caption

{
  "movoVersion": "1.0",
  "project": { "name": "photo-slide", "seed": 3 },
  "video": { "width": 400, "height": 225, "fps": 8, "duration": 1.4, "background": "#0b0b10" },
  "assets": { "susuki": "assets/free/susuki.png", "tree": "assets/free/tree.png" },
  "scenes": [{ "use": [{ "skill": "photo-slide", "with": {
    "assets": ["susuki", "tree"], "each": 1.0, "overlap": 0.4,
    "film": true, "caption": "秋の記録"
  } }] }]
}
$ movo render photo-slide.json -f gif -o photo-slide.gif
7 個の玉が落ちて床で跳ね、壁のあいだに転がって止まるアニメーション

physics-drop — 物理で落とす

床と壁が静的な剛体、玉が動的な剛体で、 当たり判定を実際に解いて跳ねます。restitution が反発、 gravity が重力です。キーフレームでは書けない散らばり方になります。

主な入力値 count(既定 5・1〜40)/radius(既定 48)/ restitution(既定 0.7・0〜1)/gravity(既定 1400)/ walls(既定 true)

$ movo skill render physics-drop --set count=7 --set restitution=0.75 \
    --set duration=3 --width 640 --height 360 --fps 15 \
    --background '#101018' -f gif -o physics-drop.gif
3 かける 2 のマスに分かれた色面が、途中で 1 枚に統合されるアニメーション

split-screen — 分割画面

画面を columns×rows に割り、panels に書いた コンポジション名を各マスに敷けます(書かなかったマスは colors の色)。 merge の時刻に全マスが中央へ寄って 1 枚になります。

主な入力値 columns(既定 2・1〜8)/rows(既定 1・1〜8)/ panelscolorsseam(継ぎ目の太さ・既定 8)/ merge(既定 0 で統合しない)/zIndex(既定 -10)

$ movo skill render split-screen --set columns=3 --set rows=2 \
    --set merge=2.4 --duration 4 --width 640 --height 360 --fps 12 \
    -f gif -o split-screen.gif
帯が横に広がり、Movo とサブタイトルが現れてゆっくり呼吸するアニメーション

title-card — タイトルカード

帯が横に開き、その上にタイトルとサブタイトルが乗ります。帯を斜めの光が走り、 出たあともゆっくり呼吸しますalign で左寄せと中央を選べます。

主な入力値 title(必須)/subtitlecardColor(既定 #1b2140)/titleSize(既定 96)/ alignleft / center、既定 center

$ movo skill render title-card --set title=Movo \
    --set 'subtitle=JSON から動画をつくる' --set duration=3 \
    --width 640 --height 360 --fps 12 -f gif -o title-card.gif
桜の花びらが上から降り続け、画面全体が桜色に寄っているアニメーション

weather — 天候(雨・雪・桜)

舞い物を 1 行で足します。kindrain / snow / sakura / confetti / bubble の 5 種類で、 それぞれ速さ・大きさ・回り方が違います。tint の色を オーバーレイで重ねて画面全体の色味も寄せられます。 舞い物が画面を埋めるまで数秒かかるので、この GIF は --from で頭を捨てています。

主な入力値 kind(既定 snow)/rate(既定 0 で種類ごとの既定値)/ tint(既定 #8fb8ff・空で無し)/ tintAmount(既定 0.16・0〜1)/duration(既定 6)

$ movo skill render weather --set kind=sakura --set tint='#ff9ec4' \
    --set tintAmount=0.25 --set rate=90 --set duration=8 --from 4.5 \
    --width 560 --height 315 --fps 10 --background '#2a1430' -f gif -o weather.gif

プロジェクト JSON から呼ぶ

"scenes": [{ "use": [{ "skill": "title-card", "with": { "title": "Movo" } }] }]
"scenes": [{ "use": "mv-intro", "with": { "title": "入れ子の街", "bars": 4 } }]
"movie":  { "use": "lyric-mv", "with": { "title": "夜明けまで", "bpm": 92 } }
"layers": [{ "type": "text", "text": "あ", "use": [{ "animation": "pop-in" }] }]

定義は 組み込み → プロジェクト固有の順に読まれ、後が優先されます。 同じ名前を <プロジェクト>/skills/*.json に置けば上書きできます。

«プロジェクトの根» は JSON のあるディレクトリです。 tmp/ に置いた JSON からは skills/ が見えないので、 根をずらしたいときは "project": { "root": ".." } と書きます。

自分で書く

movo skill new <名前> --scene で雛形が出ます。 入力の型は text / textList / number / color / asset / enum / list です。

{
  "skill": { "name": "chibi-stage", "kind": "scene", "title": "…" },
  "inputs": {
    "lines": { "type": "textList", "label": "歌詞", "default": ["…"] },
    "bars":  { "type": "number", "label": "尺(小節)", "default": 8, "min": 0.5, "max": 64 }
  },
  "scene": { "duration": "${bars}bar", "layers": [ ... ] }
}

レイヤー ID には ${_id}-… を付けてください。固定の ID を書くと、 同じスキルを 2 回使ったときに «重複 ID» で検証に落ちます。 文字には fit を付けると、長さの違う歌詞でも枠に収まります。

"fit": { "mode": "shrink", "maxWidth": "${width * 0.92}", "minSize": 0.3 }

曲と歌詞

曲を解析する

$ movo analyze song.mp3 --json

BPM・1 拍目・小節・区間を推定します。WAV はそのまま読み、 mp3 などは ffmpeg があれば WAV に変換して読みます。 探す範囲は --min-bpm / --max-bpm(既定 60〜240)、 1 小節の拍数は --beats-per-bar(既定 4)です。

歌詞に時刻を付ける

$ movo lyrics align song.mp3 --text lyrics.txt -o song.lrc
$ movo lyrics align song.mp3 --text lyrics.txt --anchor 1=5.4 --anchor 17=88.0

時刻の無い歌詞に 下書きの時刻を付けて .lrc にします。 歌詞は空行でブロックに割られ、繰り返すブロックはサビとして扱われます。 出るのは下書きなので、ずれていたら --anchor 行番号=秒 で 2〜3 点だけ留めてください。留めた点のあいだが配分し直されます(行番号は 1 始まり)。

1 本ぶんを作る

$ movo make-mv song.mp3 --lyrics song.lrc --style hype-lyric-mv --jobs auto -o mv.mp4
--title / --lines曲名・歌詞(改行区切り)
--lyrics <ファイル>時刻つきの歌詞(.lrc / .srt / .vtt / JSON)
--asset 名前=パス画像などを素材として渡す(何度でも)
--style <スキル名>ムービースキル(既定 lyric-mv、激しいものは hype-lyric-mv
--intensity <0〜1>勢いの強い A メロを激しいシーンに寄せる(既定 0)
--max-bars1 カットの上限(既定 8 小節)

カット尺を 小節で決めるので、曲を差し替えればカット割りが追従します。 --lyrics を渡すと、小節数で機械的に配るのをやめ、 実際に歌われる時刻でカットへ割り当てます。

作風を測る

«なんとなく違う» を数字にして、直し方まで出すための仕組みです。 動画ファイルでもプロジェクト JSON でも測れます (JSON はその場で描いて測るので、書き出し前でも回せます)。

$ movo profile mv.mp4 --json
$ movo compare mv.mp4 --target profiles/kinetic-type.json

8 つの指標

指標見ているもの
cutSecondsカット尺(中央値)
cutsPerMinute毎分のカット数
motion動きの量
stillRatio止まっている割合
colors実質の色数(全体の 90% を占めるのに要る色数)
saturation彩度
contrast明暗の広がり
detail細かさ(文字や模様の多さ)

目標値を書く

作風を «数値の範囲» で書いたものです。 <プロジェクト>/profiles/*.json に置くと名前で呼べます。 同梱は 10 種(movo list profiles)。

{
  "name": "creator-yohaku",
  "label": "切らない・低彩度・文字は小さく整列",
  "target": {
    "cutSeconds": [6, 30],
    "cutsPerMinute": [2, 10],
    "motion": [0.003, 0.022],
    "stillRatio": [0, 0.8],
    "colors": [8, 48],
    "saturation": [0.05, 0.28],
    "contrast": [0.1, 0.35],
    "detail": [0.012, 0.045]
  }
}

--target を名前で指定したときの探索は «その動画のあるディレクトリ» が基準です。 tmp/ に置いた動画から呼ぶときは、パスで渡すほうが確実です。

カット検出の癖を知っておく

カットは 画面全体の明るさの変化で数えています (24 x 13 に縮めた輝度の格子で、平均差 0.18 以上を 1 カット)。 写真から別の写真へ切り替えても、どちらも同じくらいの明るさなら数えません。 低彩度の作風では特に起きます。対処は 2 つです。

  • 暗幕(スクリム)の濃さをカットごとに変えて、画面全体の明るさを上下させる
  • 繋ぎのフェードを詰める(0.2 秒のフェードは変化が 10 フレームに散り、判定に届きません)

速く描く

--jobs は動画を区間に割り、別プロセスで描いて ffmpeg で繋ぎます。 再エンコードしないので画質は落ちません。auto でコア数 − 1 になります。 «同じ JSON からは同じ動画» が成り立つからこそ、フレーム境界で割れます。

$ movo render mv.json --jobs auto -o mv.mp4
-q draftいちばん軽い。構成の確認に
--from / --to時間範囲を切って描く
-s <シーン id>1 シーンだけ描く
--super-sample <1〜4>アンチエイリアス倍率
--no-cacheキャッシュを使わない
--lockmovo.lock.json を書き出す
--variant / --all-variantsアスペクト比バリアント

終了コード

«失敗した» ことだけでなく «何で失敗したか» をスクリプト側で分けられるように、 エラーの種類ごとに違う値を返します。

意味エラー名
0成功
1上記以外の失敗
2使い方の誤りMOVO_CLI_USAGE
3JSON が不正MOVO_SCHEMA_INVALID
4素材が見つからないMOVO_ASSET_NOT_FOUND
5式が不正MOVO_EXPRESSION_INVALID
6API キーの認証に失敗MOVO_PROVIDER_AUTH_FAILED
7プラグインが無い/拒否MOVO_PLUGIN_NOT_FOUND
8ffmpeg が無いMOVO_FFMPEG_NOT_FOUND
9メモリ不足MOVO_OUT_OF_MEMORY
130中断(Ctrl-C)

まだ導入していない場合はインストール方法から。 実装とスキーマは GitHub で読めます。