- name
- motion-render
- description
- ããŒããæž¡ãããããããã説æããã¢ãã¡ãŒã·ã§ã³åç»ã Claude Motion ã§äœãããã¬ãŒã·ã§ã³ïŒGemini TTSïŒãšããŒãã«åã BGMïŒLyriaïŒãä»ã㊠MP4 ã«ããããããã説æããåç»ãäœã£ãŠããããã®ç޹ä»åç»ãã/motion-render ããããæ¢åã® Motion ã®åç»ã MP4 ã«ããããšãã«äœ¿ãã
- argument-hint
- <åç»ã®ããŒããé·ãã»åºåå
ãªã©ã®æå®ãããã°äžç·ã«>
# Motion Render
`/motion-render <ããŒã>` ã®äžèšã§ãããŒãã説æããã¢ãã¡ãŒã·ã§ã³åç»ãäœãããã¬ãŒã·ã§ã³ãš BGM ãä»ã㊠MP4 ã«ããã
**ãã¬ãŒã·ã§ã³ãš BGM ã¯å¿
ãä»ããã** é³ã®ãªãåç»ã¯äœããªããæ¢åã® Motion ã®åç»ã MP4 ã«ãããšããã
å Žé¢ã«åãããŠãã¬ãŒã·ã§ã³ãæžããBGM ãäœãã
## æ±ºãæ¹: èããã«æ±ºãã
ããŒã以å€ã¯ Claude ãæ±ºãããå©çšè
ãæå®ãããã®ã ãåŸãã質åã§æ¢ããªãã
| é
ç® | æ¢å® |
|------|------|
| é·ã | çŽ 60 ç§ïŒ6ã9 å Žé¢ïŒããã¬ãŒã·ã§ã³ã®é·ãã§æçµçã«æ±ºãŸã |
| èŠãç®ã»é
è² | ããŒãã«åãããŠæ±ºãããå©çšè
ã®çµç¹ã«æ¢å®ã®ãã¶ã€ã³ã·ã¹ãã ãããã°ãã®é
è² |
| 声ã»è©±é | `Kore`ã1.1 åé |
| BGM | ããŒãã®é°å²æ°ãã Lyria ãžã®æç€ºæãæžãïŒäžã®ãBGMãïŒ |
| åºåå
| æå®ãç¡ããã° `$MOTION_RENDER_OUT_DIR`ãç¡ããã°ã«ã¬ã³ããã£ã¬ã¯ããªãã«ã¬ã³ãã git ãªããžããªãªã `~/Movies` ãªã©äœæ¥çšã§ãªãå Žæã«ãã |
Motion ã® Artifact åã¯äœææã« Styleã»Colorsã»Length ã質åããããæ±ãããããã®ã¹ãã«ã§ã¯å©çšè
ã
ãæ±ºããŠä»»ããããšé Œãã ãã®ãšããŠæ±ãã質åããã«æ±ºããã
## 0. æºåïŒæ¯åãæåã«ç¢ºãããïŒ
ãã®ã¹ãã«ã¯ãæç»ãšåæã `motion-render` ã³ãã³ãã§è¡ããClaude Code ã®ãã©ã°ã€ã³ãšããŠå
¥ããå Žåã¯ã
ãã©ã°ã€ã³ã `motion-render` ãçšæããã®ã§ãå©çšè
ã¯äœãããªããŠãããskills CLI ãªã©ã§ã¹ãã«ã ããå
¥ããå Žåã¯ã
ãã®ã¹ãã«ã®ãã£ã¬ã¯ããªïŒClaude ã«æž¡ããã "Base directory for this skill"ãä»¥äž `<skill>`ïŒããå
¥ããã
1. `motion-render --version` ãå®è¡ãã`<skill>/package.json` ã® `version` ãšæ¯ã¹ããåããªã次ãž
2. ã³ãã³ããç¡ãããŸãã¯çãéããšã㯠`npm install -g "<skill>"` ãå®è¡ãããæš©éã sandbox ã§å€±æãããã
Claude Code ã®ãã©ã°ã€ã³ãšããŠå
¥ãçŽãããæ¡å
ããïŒREADME ã®ãã€ã³ã¹ããŒã«ããããã§è¿œå ã®äœæ¥ã¯èŠããªããªãïŒã
`Unknown file extension ".ts"` ã§æ¢ãŸãã®ã¯ Node ã 22.18 ããå€ããããNode ã®æŽæ°ãæ¡å
ãã
3. `GEMINI_API_KEY` ãç¡ããš `narrate`ã»`bgm` ãæ¢ãŸããæ¢ãŸã£ãããããŒã Google AI Studio ã§çºè¡ããŠ
ã·ã§ã«ã®èšå®ã« `export GEMINI_API_KEY=...` ãè¶³ããClaude Code ãèµ·åãçŽãããæ¡å
ãã
4. `motion-render stills` ãªã©ã§ Chromium ã `bootstrap_check_in ... Permission denied` ã§èµ·åããªãã®ã¯ã
Claude Code ã® sandbox ã®äžã§åããŠãããããå©çšè
ã« `~/.claude/settings.json` ãžæ¬¡ãè¶³ãããæ¡å
ãã
ïŒClaude ã¯èªåã®æš©éèšå®ãå€ããªãïŒ:
`"sandbox": { "excludedCommands": ["motion-render:*"] }` ãš `"permissions": { "allow": ["Bash(motion-render:*)"] }`
ååã® `stills` ã `build` ã§ã¯ãChromiumïŒçŽ 210 MBïŒãèªåã§ããŠã³ããŒããããã
## åæ
- **`motion-render` ã¯åäœã§å®è¡ããã** `| grep`ã»`&&`ã»`FOO=1 motion-render` ã®ããã«ååŸã«äœãä»ãããš
sandbox å
ã§åããChromium ãèµ·åã«å€±æããããããã¯ãŒã¯ã䜿ã `narrate`ã»`bgm` ãåã
- äœæ¥ãã©ã«ã `<work>` 㯠scratchpadïŒãªããã°äœæ¥ãã£ã¬ã¯ããªïŒã«ãããŒãã衚ãè±å°æåã®ååã§äœã
## äœæ¥ãã©ã«ã
```
<work>/
script.json # åçš¿ïŒClaude ãæžãïŒ
timing.json # å Žé¢ã®ç§æ°ïŒnarrate ãæžãïŒ
audio/ # <å Žé¢id>.wavãbgm.mp3ãmix.m4a
film/ # Motion ããååŸããæ åããŒã¿ïŒprepare ãå±éããïŒ
```
`script.json` ã®åœ¢:
```json
{
"title": "Workload Identity Federation",
"bgm": "Calm, focused electronic music for a cloud security explainer: soft pulsing synth, light percussion, 100 BPM",
"scenes": [
{ "id": "title", "name": "ã¿ã€ãã«", "narration": "ã¯ãŒã¯ããŒãã¢ã€ãã³ãã£ãã£ãã§ãã¬ãŒã·ã§ã³ã§ãâŠ" },
{ "id": "token", "name": "ããŒã¯ã³çºè¡", "narration": "âŠ" }
]
}
```
- `id` ã¯è±å°æåã»æ°åã»`-`ãMotion ã®å Žé¢ã® id ãšåãã«ãã
- `narration` 㯠TTS ã«èªãŸããæãè±èªã®åºæåè©ã»ç¥èªã¯ã«ã¿ã«ãã§æžãïŒ`GitHub Actions` â `ã®ããããã¢ã¯ã·ã§ã³ãº`ïŒã
ç»é¢ã®æåã¯å
ã®è¡šèšã®ãŸãŸ
- ä»»æ: `voice`ã»`speed`ã»`bgmVolume`ïŒæ¢å® 0.15ïŒã»`lead`ã»`tail`ã»`endHold`
## æé
### 1. çµµã³ã³ããšåçš¿ãæžã
ããŒããã1 å Žé¢ 1 ã€ã®åºæ¥äºã«åãããä»çµã¿ã®èª¬æãªã次ã®åœ¢ãäŒãããããã
- ç»å Žãããã®ïŒäŸ: GitHub ActionsãããŒã¯ã³ãGoogle Cloud ã® STSããµãŒãã¹ã¢ã«ãŠã³ãïŒããã«ãŒããšããŠå Žé¢ã«çœ®ã
- ããåãïŒããŒã¯ã³ãèŠæ±ïŒã¯ãã«ãŒãã®éãåãããããšããŠæããé çªã¯çªå·ä»ãã®æµãå³ã§ç€ºããä»ã®æ®µãå
ããã
- åé ã§ãäœã®è©±ãããæåŸã§ãçµå±ã©ããªãããã 1 æã§èšã
- 1 å Žé¢ã®ãã¬ãŒã·ã§ã³ã¯ 1ã2 æïŒè©±ã㊠5ã9 ç§ïŒ
æ£ç¢ºããåªå
ãããä»çµã¿ã®èª¬æã«èªä¿¡ããªãéšåã¯ãå
¬åŒããã¥ã¡ã³ãã§ç¢ºãããŠããæžãã
### 2. ãã¬ãŒã·ã§ã³ãäœãïŒå Žé¢ã®ç§æ°ã決ãŸãïŒ
```bash
motion-render narrate <work>
```
`timing.json` ã«åå Žé¢ã®éå§ãšç§æ°ãåºããMotion ã®å Žé¢ã® `dur` ã¯ããã®å€ããã®ãŸãŸäœ¿ãã
### 3. Motion ã®åç»ãäœã
1. `Artifact` ã® `quickstart`ïŒ`intent: "other"`ïŒã `list`ïŒ`scope: "types"`ïŒã§ Motion åã® `type_url` ãèŠã€ãã`title` ãä»ããŠäœã
2. è¿ã£ãŠãã Motion åã®æç€ºã«åŸã£ãŠå Žé¢ãäœãããã ã:
- 質åã¯ããªãïŒäžã®ãæ±ºãæ¹ãïŒ
- `scenes.json` ã®å Žé¢ã® `id`ã»`dur` 㯠`timing.json` ãšåãã«ãã
- Motion å
èµã® BGMïŒ`score.js`ïŒã¯äœããªããé³ã¯ãã®ã¹ãã«ãä»ãã
3. 䞊è¡ã㊠BGM ãäœã£ãŠãã: `motion-render bgm <work>`
### 4. æ åããŒã¿ãååŸããŠç¢ºèªãã
1. `Artifact` ã® `read` ã§ `paths: ["index.html", "artifact-type/app.js", "artifact-type/app.css"]`ã`out_dir: <work>/film`
2. `ArtifactData` ã® `list`ïŒ`collection: "modules"`ïŒãš `get`ïŒ`film`/`script`ïŒã `out_dir: <work>/store` ã§ä¿å
3. `motion-render prepare <work>/store <work>/film`
4. `motion-render stills <work>/film <work>/stills <åå Žé¢ã®äžã»ã©ã®ç§ãã«ã³ãåºåã>` ã§å
šå Žé¢ãèŠãã
èŠåºãã®äžèªç¶ãªæ¹è¡ãã¯ã¿åºããéãªããããã° Motion åŽãçŽããæé 4 ãããçŽã
### 5. MP4 ã«ãã
```bash
motion-render build <work> [<åºå.mp4>]
```
ãã¬ãŒã·ã§ã³ãåå Žé¢ã®é ã«çœ®ããBGM ãäžå®ã®é³éã§éã㊠MP4 ã«ããããã¬ãŒã·ã§ã³ã BGM ãç¡ããšæ¢ãŸãã
### 6. 確èªããŠå ±åãã
- `ffprobe` ã§ãé·ããšæ åã»é³å£°ã®äž¡ãã©ãã¯ãããããšãèŠã
- å ±å: åºåã®ãã¹ãé·ããå Žé¢ã®æµããBGM ã®é°å²æ°ãMotion ã® URLãè³ã§èããŠããªãããšã¯èããŠããªããšæžã
## BGM
`script.json` ã® `bgm` ã«ãããŒãã®é°å²æ°ã«åãè±èªã®æç€ºæãæžããæ¥œåšã»ãã³ãã»æ°åãå
·äœçã«ã
| ããŒãã®çš®é¡ | æç€ºã®äŸ |
|--------------|----------|
| æè¡ã®ä»çµã¿ã»ã»ãã¥ãªã㣠| calm focused electronic, soft pulsing synth, light percussion, ~100 BPM |
| ãã¥ãŒã¹ã»çºè¡š | modern news broadcast theme, driving synth arpeggio, tight electronic drums, ~120 BPM |
| 補å玹ä»ã»æããè©±é¡ | warm upbeat, marimba and electric piano, light shaker, ~110 BPM |
| æ¯ãè¿ãã»ãã£ãšã | gentle ambient piano, soft pads, slow |
å©çšè
ã BGM ããã ããããªã©ãšèšã£ããã`bgm` ãæžãçŽã㊠`motion-render bgm` â `motion-render build` ãããçŽãã
æ åã®æãçŽãã¯èŠããªãïŒ`build` ã¯æ¯åæç»ããããMotion åŽã®å€æŽã¯äžèŠïŒã
## æ¢åã® Motion ã®åç»ã MP4 ã«ãããšã
URL ãæž¡ãããå Žåãé³ãä»ãããæ åããŒã¿ãååŸãïŒæé 4ïŒã`scenes.json` ã®å Žé¢ããšã«ããã®ç§æ°ã«åãŸã
ãã¬ãŒã·ã§ã³ãæžãïŒ1 ç§ããã 7ã8 åãç®å®ã`id` 㯠`scenes.json` ãšåãã«ããïŒã`build` ã¯ãã¬ãŒã·ã§ã³ã
åç»ã®å®éã®å Žé¢ã®éå§æå»ã«çœ®ããå Žé¢ã«åãŸããªããã¬ãŒã·ã§ã³ãããã°èŠåãåºããèŠåãåºãããåçš¿ãåãã
`speed` ãäžã㊠`narrate` ããããçŽãã
## ãã¡ã€ã«
- `scripts/cli.ts`: `motion-render` ã³ãã³ãïŒTypeScriptãNode 22.18 以äžããã®ãŸãŸå®è¡ããïŒ
- `scripts/audio.ts`: Gemini TTSã»Lyria ã®åŒã³åºãïŒ90 ç§ã®äžéãšå詊è¡ä»ãïŒãšé³å£°ã®åæ
- `scripts/work.ts`: `script.json` ã®æ€èšŒãš `timing.json` ã®èšç®
- `scripts/render.ts`: ãã¬ãŒã€ãŒãéããŠã³ããè¿ããæç»äžã¯å€éšãžã®éä¿¡ã鮿ããChromium ã® sandbox ãæå¹ã«ãã
- `scripts/json.ts`: ãã¡ã€ã«ã»APIã»ãã¬ãŒã€ãŒããæ¥ã JSON ãã圢ã確ãããªããèªã
View on GitHub