Communitygithub.com

redirhan/music-video

從歌曲檔案製作動態圖形音樂影片(2D 平面角色與節奏歌詞,無實拍畫面)。先建立一個包含模型無法聽見資訊的「歌曲資料夾」,再規劃節拍同步的 2D 舞蹈影片,並可選擇使用 HyperFrames 進行渲染。

music-video 是什麼?

本技能專為無法直接聽見音樂的 AI 代理設計,透過詳細的數值分析補足聽覺資訊。技能會先建立一個結構化的「歌曲資料夾」,包含節拍、小節、能量段落、下降段落、每個音軌的逐幀音量、大鼓/小鼓/鈸的敲擊點、可選的旋律音符,以及時間同步的歌詞。有了這些資料,AI 就能規劃並可選地渲染出一段節拍精確的 2D 動畫音樂影片。此流程確保了影音同步的精確性。該技能支援 Python CLI 工具、HyperFrames 專案輸出,以及可選的 Three.js 自訂角色。其運作方式在於:先對歌曲進行純資料分析(而非聽覺分析),在規劃階段提出創意概念,並使用內建的 2D 舞蹈產生器(包括一個帶有樞紐點動畫的扁平角色骨架),最後以 HyperFrames 或自訂渲染器進行渲染。輸出的影片為 1920×1080 解析度、30 fps、H.264 編碼,並包含原始歌曲音訊。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/redirhan/claude-music-video-skill/tree/main/skill/music-video

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

音樂影片(動態圖形)

您無法聽見歌曲。所有視覺元素都與測量數據同步,因此首要任務永遠是建立歌曲資料夾。如果歌曲資料錯誤,每個影格都會跟著錯。

輔助工具位於此檔案旁。使用技能資料夾中的 run.py 執行它們(預設安裝路徑如下;若安裝在其他位置請自行調整):

python3 ~/.claude/skills/music-video/run.py song-folder SONG.mp3 OUT_DIR [--fps 30] [--lyrics-lang en|tr] [--lyrics-text known.txt]
python3 ~/.claude/skills/music-video/run.py analyze SONG.mp3            # beats/bars/sections as JSON
python3 ~/.claude/skills/music-video/run.py dance2d SONG.mp3 --out DIR --analysis OUT_DIR/song-map.json --start 23.8 --dur 14.3 [--render]

切勿聲稱已聽過該歌曲。請說「根據分析結果」。

1. 歌曲資料夾(永遠優先)

檔案內容工具
passage.<副檔名>音訊檔案,位元組完全相同的副本(sha256 檢查);在最終合成時直接使用—
song-map.json / .mdbpm、節拍、強拍/小節、能量段落(平靜/堆疊/高潮)、每拍能量、下降段落Beat This! → aubio CLI → 內建 numpy 追蹤器
stems/人聲 / 鼓組 / 貝斯 / 其他(快取,重新執行很快)demucs htdemucs(可選)
envelopes.json混音及每個音軌的逐幀音量(dB 及 0..1)numpy
hits.json大鼓 / 小鼓 / 鈸的擊發點,強度 0..1對鼓組音軌進行分頻譜通量分析
notes.json旋律與貝斯音符(可選)basic-pitch
lyrics-passage.json / .md帶有時間戳的歌詞行對人聲音軌使用 whisper.cpp whisper-cli
song-story.md您需填寫的範本:主題、風格、情緒曲線、每個段落的關鍵畫面您根據歌詞和地圖填入
README.md每個檔案的說明、單位(秒)、fps自動產生

規則:

  • 段落是由能量短語構成(根據歌曲自身能量排序的兩小節短語),而非主歌/副歌。 請在 song-story.md 中自行命名。
  • --lyrics-text 搭配正確歌詞(每行一句)可將歌詞與 whisper 辨識出的單字時間對齊;無法匹配的單字會獲得插值時間(matched: false)。若不提供此參數,則歌詞為 raw whisper 輸出,請務必檢查。當人聲音軌為靜音時,歌詞行會被標記為 suspect(whisper 會在純音樂段落產生幻覺)。純音樂歌曲會跳過 whisper。
  • 每個耗費資源的步驟都會降級執行而非直接失敗:沒有 Beat This! → aubio(外部 CLI)→ numpy 追蹤器(無真實強拍,預設為 4/4 拍);沒有 demucs → 僅使用混音的 envelopes 和 hits;沒有 basic-pitch → 無 notes.json;沒有 whisper → 無歌詞。執行報告中的 warnings 會說明跳過了哪些步驟。請告知使用者。
  • hits.json 足夠用於觸發閃爍、震動和縮放效果,但並非專業的鼓組轉錄:鈸的擊發也可能在小鼓上被觸發,貝斯音符可能洩漏到小鼓頻段。
  • song-story.md 在重新執行時不會被覆寫。請只寫入歌詞和分析能支持的內容;若不明確,請在標題處留下「未知」,切勿憑空編造含義。

2. 創意規劃(在渲染前展示)

  • 一個來自 song-story.md 的概念,一個世界,一個色調,一個開放授權字型(OFL)用於歌詞排版。
  • 段落 → 場景表格:段落切換 = 場景或鏡頭切換;副歌 / 最高能量段落使用最大的視覺創意,每次重複時略有變化;下降段落 = 在強拍上進行切換、閃爍或縮放。
  • 歌詞排版僅用於關鍵句子(根據其單字時間進行動態字詞排版),而非每句都做卡拉 OK。
  • 在平靜音樂時,根據短語和能量節奏進行;不要對每個追蹤到的節拍進行硬切。不同處理方式的數量比剪輯的次數更重要。
  • 展示規劃(表格 + 3–4 張描述或渲染的靜止畫面)並獲得同意後再進行完整渲染。
  • 值得先閱讀的基礎建設:HyperFrames 自己的 music-to-video 技能(github.com/heygen-com/hyperframes,skills/music-to-video/,Apache-2.0)包含一系列節拍剪輯動態原語(閃切、急推、甩鏡、色差、螢幕震動、動態字母……)和歌詞佈局。

3. 內建 2D 舞蹈影片

外觀:扁平角色(圓形黑色頭部、圓角線條四肢、彩色襯衫和鞋子)、拱形鏡門、旋轉的太陽光背景(紫色 / 藍綠色 / 金色 / 粉紅色)、粗體窄版字型(Anton)的歌詞字詞及一個強調詞、一排不同顏色的鏡像舞者複製體、電影膠卷、皇冠和西洋棋道具。靈感來自 Devarf 的 YouTube 實驗中「低投入」2D 影片系列(每個製作投入程度都做一支音樂影片)。

規劃器(musicvideo/dance2d.py,純函數且使用種子亂數):

  • 視窗在強拍上進行切換;每拍一個姿勢關鍵影格,姿勢在該拍上到達;
  • 強拍使用大姿勢(堆疊:舉手 / 指 / 拍手,高潮:跳躍 / 舉手)和一個完整的屈膝;
  • 動作集(一個 4 拍短語)根據能量等級每小節變換,且不會連續重複兩次;
  • 場景在段落開頭和每 4 個小節進行切換(色調切換、太陽光速度根據等級變化、方向交替;平靜/堆疊段落使用門,高潮段落使用西洋棋 + 5 個舞者排,領舞者戴皇冠);
  • 舞者複製數量:平靜 1 個,堆疊 3 個,高潮 5 個;
  • 歌詞 JSON [{start, end, text, accent}] 以視窗時間為單位 → 每個字詞落在一個節拍上。

骨架(runtime/char2d.js,window.Char2D):具有樞紐點的 SVG 群組(臀部 > 大腿 > 小腿 > 腳、軀幹 > 手臂 > 前臂、頭部)。肢體角度為向外延伸的正角度(0 度向下,90 度側向,180 度向上),使一個姿勢適用於兩側;地面鎖定功能讓下方腳掌保持在地板上(蹲下動作自動下沈),air 屬性用於跳躍時抬起。姿勢:idle、stepL/R、armsUp、swayL/R、pointL/R、clap、jump、squat、handsOnHips(mirror(p) 交換左右)。poseAt(keys, t) 保持姿勢,然後在最後 ≤0.26 秒內緩入,並在重大擊打點加入超調。runtime/dance2d.js 從 window.MV_DANCE 繪製規劃;一個 GSAP 時間軸驅動代理 setter → draw(t),因此每個影格都是 t 的純函數。

dance2d 的輸出:DIR/plan.json 和 DIR/project/(一個 HyperFrames 專案)。使用 --render 參數還會輸出 DIR/dance2d.mp4:1920×1080、30 fps、H.264 yuv420p、歌曲音訊(AAC,無淡入淡出)。使用 CC BY 授權的音樂需在畫面上顯示 --credit。

渲染與否由使用者決定。 --render 會執行 npx hyperframes render,它會下載並驅動一個無頭 Chrome/Chromium。請在使用前詢問。若不使用此參數,僅使用 Python 即可完成專案資料夾前的所有步驟。GSAP 未隨附。請將 gsap.min.js 放入 runtime/(或設定 MV_GSAP),否則專案會在渲染時從 jsDelivr CDN 載入 GSAP 3.14.2。

4. 內建骨架以外的角色(自備)

本技能不附帶任何 3D 模型。如果使用者想要 3D(Three.js)角色:

  • 請使用授權允許在完成的影片中重新分發的模型,例如 CC0 模型,或使用者從自己的 Mixamo 帳戶下載的角色和動畫(在完成的影片中可以;原始檔案不得重新分發或提交到公開儲存庫);
  • 切勿在未檢查授權的情況下複製其他專案的範例模型;
  • 或者只使用程序生成的幾何體(膠囊體、球體、盒子組成的簡單骨骼鏈),這些完全沒有授權問題。 幀確定性仍然適用:每一幀使用 mixer.setTime(t * rate),切勿使用 mixer.update(dt);rate = song_bpm / clip_bpm;在小節邊界切換片段。

5. 渲染規則(任何渲染器)

  • 一切都是 t = frame / fps 的純函數。沒有 Date、沒有 requestAnimationFrame 的 delta 值、沒有未使用種子亂數的 Math.random()。
  • 小型擊打效果(鏡頭震動、燈光閃爍、縮放彈出)根據 hits.json 中的大鼓/小鼓觸發;亮度或光暈根據 envelopes.json 觸發。
  • 輸出:1920×1080(或 Reels/Shorts 用的 1080×1920)、30 fps、H.264 yuv420p、AAC、長度與歌曲相同(或選擇的視窗長度)。
  • 光敏感性:每秒鐘全畫格閃爍不超過 3 次。
  • 預算:更多的思考時間能產生更好的動作,但請在一次工作階段內進行審查。對單一音樂影片進行多次代理審查循環會快速消耗 Token,且往往在達到限制後重新開始。

6. 交付前檢查

  • 影片能播放到最後;時長 == 歌曲(或視窗)時長 ±1 影格。
  • 音訊串流為原始歌曲(比較解碼後的 PCM 雜湊值,或檢查延遲為 0 的互相關峰值)。
  • 同步點抽查:在副歌強拍處渲染 5 個影格,並確認擊打姿勢 / 閃爍是否準確落在該處。
  • 每個段落生成一張接觸表(ffmpeg -i out.mp4 -vf "fps=1,scale=480:-1,tile=4x4" sheet.jpg)並確實檢視。
  • report.md:說明您製作了什麼、為什麼、如何製作、檢查了哪些項目,以及您不確定的地方。

相關技能