Communitygithub.com

音效與音樂同步

像專業剪輯師一樣為影片配樂:讓剪輯點與音樂節拍完美吻合、在轉場處加入恰到好處的音效、調整旁白節奏使其聽起來自然流暢、安全地使用免版稅音樂,並透過閃避效果讓旁白清晰地浮在音樂之上。適用於為影片加入音樂、音效或旁白時。

音效與音樂同步 是什麼?

這個技能「音效與音樂同步」旨在成為影片製作者在音訊後期製作中的創意決策層,專注於節拍匹配剪輯、音效放置、旁白節奏以及混音(特別是閃避功能)。它明確不處理技術性的編碼工作,例如在 `remotion-compose` 中編寫 `<Audio>` JSX 元件或使用 `remotion-render` 運行渲染程序;相反,它會產出具體的數值(例如節拍所在影格、音效時間戳記、閃避音量),然後將這些數值交給那些工具執行。這個技能的操作流程是先選定一首歌曲並鎖定其 BPM(每分鐘拍數),然後建立一個節拍網格,將所有剪輯點都對齊到最近的節拍上。接著,它會在轉場處放置音效,確保音效的高峰與畫面的動作高峰同步。之後,技能會指導使用者以每分鐘約 150 字的速度撰寫旁白,並預留空間讓剪輯點不會切斷句子。最後,它會計算一個閃避包絡線,在說話時將音樂降低至約 30% 的音量,讓旁白能完全凸顯出來。這個技能與一套提示詞協同工作,包括供選擇鏡頭順序的 `video-storyboard`、供文字動畫用的 `kinetic-typography`,以及供視覺調色用的 `motion-color-and-light`。它提供無需依賴外部套件的 Node.js 腳本(`beat_grid.js` 和 `mix_levels.js`)作為計算器,來決定剪輯所用影格和閃避時的音樂音量,並確保所有音樂素材都來自經過授權的免版稅來源。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/SkillMedev/tutorial-video-studio/tree/main/skills/sound-and-music-sync

在你喜歡的 AI 中提問

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

說明文件

音效與音樂同步 是做什麼的?

聲音是影片的一半,卻是最常被忽略的一半。一個平庸的動畫若能對上節拍並搭配清晰的旁白,看起來就很專業;而一個精美的動畫如果剪輯點漂浮不定,旁白又被音樂淹沒,看起來就很業餘。這是關於聲音品味的層級。你來決定剪輯點落在哪裡、音效該在何處加強、旁白該如何呼吸、以及混音該如何平衡——然後你將具體的數值(節拍影格、音效時間戳記、閃避音量)交給 remotion-compose 來編排到時間軸上,並交給 remotion-render 來輸出。你不需要撰寫 <Audio> JSX 或執行渲染器;你做出驅動它們的創意決策。

這項技能與 motion-video-direction 系列的其他技能配合使用:video-storyboard 的場景清單和 motion-design-principles 的時間決策是你的輸入——你要根據已存在的節拍來進行配樂。如果文字要跟著音訊動畫,請搭配 kinetic-typography;如果剪輯節奏是為了引導產品介紹,請與 product-demo-director 協調;如果你在剪輯直向/社群媒體版本,請使用 social-video-formatter 為每個平台重新推導節拍。音訊混音是它自己的層級——視覺效果(調色、燈光、對比)交給 motion-color-and-light,然後根據它調完的結果來配樂。

工作流程

按順序執行。在剪輯點與節拍鎖定之前,不要開始放置音效;在旁白時間確定之前,不要完成混音——每個步驟都依賴前一個步驟。

  1. 挑選歌曲並鎖定節奏。 選擇與影片能量和長度匹配的音樂,確認其授權(參見 references/royalty-free-sourcing),並獲取其 BPM。大多數免版稅音樂庫都會列出 BPM;如果沒有,可以手動打拍子或用偵測器。BPM 是所有後續步驟的基礎——一個節拍持續 60 / BPM 秒,在專案影格率下則是 fps * 60 / BPM 個影格。

  2. 建立節拍網格並將剪輯點對齊。 將節拍轉換為影格編號,並將每個硬剪輯和主要場景變化都放在一個節拍上(執行下面的 beat_grid.js)。為了強調重點,在重拍(4/4 拍中的第 1、5、9 拍)上進行剪輯;對於常規轉場,可以在任何一個節拍上剪輯。一個偏離節拍兩三個影格的剪輯,即使觀眾說不出原因,也會覺得「不對」。將對齊後的影格清單作為 <Sequence from={...}> 的邊界交給 remotion-compose。

  3. 在轉場處放置音效,而不是蓋過它們。 音效的存在是為了讓動作感覺更真實。規則是:音效的高峰必須與動作的高峰同時出現。一個呼嘯聲 領先 於一個滑動(在剪輯點前約 3-5 個影格開始,讓它的尾音落在剪輯點上);一個撞擊/重擊聲 落在 卡片撞入的那個影格上;一個點擊/爆裂聲落在 UI 元素出現的那個影格上;一個漸強音在揭露前的 10-20 個影格中 逐漸增強,並在揭露那一刻達到頂點。每個轉場只放一個音效——堆疊多個音效只會把標點符號變成噪音。請參見 references/sfx-placement。

  4. 調整旁白節奏,讓它聽起來有呼吸感。 旁白決定了影片的實際節奏;視覺是為其服務的,反之則不然。目標是大約每分鐘 150 字的對話速度(約 2.5 字/秒)——太快會顯得倉促,太慢則像人質影片。在關鍵台詞之前和行動呼籲(CTA)之後,留下一段沉默的節拍(8-15 個影格)。為耳朵而寫:使用短句,每個句子一個想法,使用縮寫。永遠不要讓場景在一個字的中間剪輯——將場景邊界對齊到句子 之間 的間隙。先計時旁白,然後拉伸或壓縮場景長度以適應它(這會成為 remotion-compose 使用的 durationInFrames)。

  5. 混音:將音樂閃避,讓旁白浮在頂層。 這是音訊最常見的失敗。音樂和全音量的旁白在同一個頻率範圍內競爭,導致台詞聽不清楚。每當旁白在說話時,將音樂閃避到大約其原始音量的 25-35%,然後在間隙中再將音量拉回來。執行 mix_levels.js 以獲得具體的音量和時間數值。目標是讓旁白大約在 -3 到 -6 dB(清晰,絕不削波),閃避後的音樂大約在 -18 到 -22 dB。將閃避包絡線(哪些影格需要閃避,以及降低後的音量)交給 remotion-compose,它會透過每個 <Audio> 的 volume 回呼來應用。

  6. 檢查輸出。 在 remotion-render 產出 MP4 後,用筆電喇叭和手機喇叭聽,而不只是用好的耳機——大多數觀眾用的是爛喇叭。確認:旁白的每個字在音樂背景下都能聽懂,沒有音效削波或嚇人一跳,剪輯點感覺牢牢鎖在節拍上,而且最大聲的時刻沒有失真。如果某個字聽不清楚,就在那個時間範圍內將音樂閃避得更深;如果音效嚇人,就把它們調低 6 dB。

品質標準

只有當以下所有條件都成立時,音訊才算 A+ 等級:

  • 每個硬剪輯都落在節拍網格中的一個節拍影格上——沒有任何剪輯漂浮在節拍之間。
  • 每個轉場音效的高峰都與其動作的高峰發生在同一個影格上;漸強音在揭露那一刻達到頂點,而不是之前或之後。
  • 旁白速度維持在約 140-160 wpm,並在關鍵台詞之前和 CTA 之後有刻意安排的沉默;沒有場景在一個字的中間剪輯。
  • 在手機喇叭上,旁白在音樂背景下完全能聽懂——這是驗證過的,不是假設——因為音樂在說話時會閃避到大約 30% 的音量。
  • 每個轉場恰好有一個音效;音樂軌道能乾淨地循環或結束,在最後一個影格沒有突然中斷。
  • 每個音訊素材的授權都允許預期的用途(商業 / 付費廣告 / 客戶專案),並且記錄了歸屬要求。

禁止事項

  • 不要為了保留場景的「自然」長度而讓剪輯點偏離節拍——改為將場景拉伸或修剪到最近的節拍。
  • 不要在旁白下方以全音量播放音樂;未經閃避的音樂是旁白聽起來含糊不清的原因。每當有人說話時都要進行閃避。
  • 不要在一個轉場上堆疊多個音效,或在每個剪輯點重複使用相同的呼嘯聲——要變化,否則耳朵會對它們麻木。
  • 不要在這裡編寫 <Audio> JSX、設置 startFrom / volume 回呼或呼叫渲染器——產出數值並將它們交給 remotion-compose / remotion-render。
  • 不要從 YouTube 下載、沒有明確授權的「免費」網站或客戶的 Spotify 取得音軌——商業用途需要真正的免版稅或授權來源。
  • 不要將整個混音標準化到最大聲;保留一些空間,讓最大聲的撞擊不會削波。
  • 不要為了適應固定的片長而讓旁白趕時間——根據旁白重新剪輯視覺,而不是反過來。

計算器:節拍網格

自含的 Node 腳本。儲存為 beat_grid.js 並使用 node beat_grid.js 執行。它將 BPM 和影格率轉換為你的剪輯點應該落下的精確影格編號,並標記出重拍。無需依賴其他套件。將列印出的影格作為 <Sequence from={...}> 邊界交給 remotion-compose。

// 節拍網格。編輯輸入,然後:node beat_grid.js
const input = {
  bpm: 120,            // 所選歌曲的節奏
  fps: 30,             // 專案影格率
  durationSeconds: 12, // 影片長度
  beatsPerBar: 4,      // 4/4 拍;重拍每 4 拍出現一次
}

const framesPerBeat = (input.fps * 60) / input.bpm
const totalFrames = Math.round(input.durationSeconds * input.fps)
const beats = []
for (let b = 0; ; b++) {
  const frame = Math.round(b * framesPerBeat)
  if (frame > totalFrames) break
  beats.push({ beat: b + 1, frame, downbeat: b % input.beatsPerBar === 0 })
}

console.log('每個節拍影格數:', framesPerBeat.toFixed(2), '(' + (60 / input.bpm).toFixed(3) + 's each)')
console.log('在這些影格上剪輯 (* = 重拍,最適合硬剪輯):')
for (const b of beats) {
  console.log('  beat ' + String(b.beat).padStart(2), '-> frame', String(b.frame).padStart(4), b.downbeat ? '*' : '')
}
console.log('僅重拍影格:', beats.filter((b) => b.downbeat).map((b) => b.frame).join(', '))

工作範例輸出

使用上述輸入,腳本將輸出:

每個節拍影格數: 15.00 (0.500s each)
在這些影格上剪輯 (* = 重拍,最適合硬剪輯):
  beat  1 -> frame    0 *
  beat  2 -> frame   15 
  beat  3 -> frame   30 
  beat  4 -> frame   45 
  beat  5 -> frame   60 *
  beat  6 -> frame   75 
  beat  7 -> frame   90 
  beat  8 -> frame  105 
  beat  9 -> frame  120 *
  ...
僅重拍影格: 0, 60, 120, 180, 240, 300, 360

解讀:在 120 BPM 和 30 fps 的情況下,一個節拍剛好是 15 個影格。將常規轉場放在任何一個列出的影格上,而將你最硬的剪輯——例如開頭到內容的剪輯、CTA 的揭露——放在一個重拍(0, 60, 120…)上。如果一個場景想要持續 70 個影格,將其對齊到 75(第 6 拍),而不是讓剪輯點漂浮在 70。這些對齊後的數值正是 remotion-compose 要放入 <Sequence from={...}> 中的內容。

計算器:混音音量和閃避時機

自含的 Node 腳本。儲存為 mix_levels.js 並使用 node mix_levels.js 執行。它計算閃避後的音樂音量以及每個旁白行需要閃避的影格範圍,這樣你交給 remotion-compose 的是一個具體的包絡線,而不是一種感覺。無需依賴其他套件。

// 混音和閃避規劃器。編輯輸入,然後:node mix_levels.js
const input = {
  fps: 30,
  musicVolume: 0.8,       // 無人說話時的音樂音量 (0-1)
  duckToPercent: 0.30,    // 在旁白下,將音樂閃避到此百分比
  voVolume: 1.0,          // 旁白音量(讓旁白成為最大聲的元素)
  duckFadeFrames: 8,      // 淡入/淡出影格數,使閃避不會太突兀
  // 旁白行 [開始秒數, 結束秒數];在每個範圍內閃避音樂,並加上淡變邊距
  voLines: [
    [0.5, 3.2],
    [4.0, 7.5],
    [8.2, 11.0],
  ],
}

const duckedLevel = +(input.musicVolume * input.duckToPercent).toFixed(3)
const toFrame = (s) => Math.round(s * input.fps)
// 用於參考的大致 dB:20*log10(level)
const dB = (v) => (v <= 0 ? '-inf' : (20 * Math.log10(v)).toFixed(1) + ' dB')

console.log('旁白音量:           ', input.voVolume, '(' + dB(input.voVolume) + ')  <- 最大聲的元素')
console.log('音樂 (無說話聲):  ', input.musicVolume, '(' + dB(input.musicVolume) + ')')
console.log('旁白下閃避後的音樂:', duckedLevel, '(' + dB(duckedLevel) + ')')
console.log('閃避淡變:          ', input.duckFadeFrames, '影格 淡入/淡出')
console.log('在這些影格範圍內閃避音樂 (每側加上 ' + input.duckFadeFrames + ' 影格作爲淡變邊距):')
for (const [start, end] of input.voLines) {
  const a = toFrame(start) - input.duckFadeFrames
  const b = toFrame(end) + input.duckFadeFrames
  console.log('  旁白 ' + start + 's-' + end + 's  -> 閃避影格', Math.max(0, a), '至', b)
}

工作範例輸出

旁白音量:            1 (0.0 dB)  <- 最大聲的元素
音樂 (無說話聲):   0.8 (-1.9 dB)
旁白下閃避後的音樂: 0.24 (-12.4 dB)
閃避淡變:           8 影格 淡入/淡出
在這些影格範圍內閃避音樂 (每側加上 8 影格作爲淡變邊距):
  旁白 0.5s-3.2s  -> 閃避影格 7 至 104
  旁白 4s-7.5s    -> 閃避影格 112 至 233
  旁白 8.2s-11s   -> 閃避影格 238 至 338

解讀:旁白維持在全音量(混音中最大聲的元素),音樂在間隙中以 0.8 的音量播放,而每當有人說話時,音樂會在 8 個影格內閃避到大約 0.24——大約是三分之一——這樣音量下降就不會是突兀的跳躍。這些影格範圍正是 remotion-compose 提供給音樂 <Audio> volume 回呼的區間:在範圍之外是全音量,在範圍內是 duckedLevel,並在淡變邊際內線性漸變。這就是為什麼台詞能保持清晰,而音樂又不會消失。

範本:音訊提示表

複製此表格,用你的節拍網格和混音音量輸出填入 FILL 欄位,然後將填妥的表格交給 remotion-compose。它是影片中每個音訊決策的唯一真相來源。

音訊提示表。 [FILL: 影片名稱]。影格率 [FILL] / [FILL] BPM / [FILL]s 總長

音樂
  歌曲:                 [FILL: 標題 + 來源]
  授權:               [FILL: 例如 Epidemic Sound 商業授權 / CC0] - 歸屬: [FILL: 是/否, 文字]
  音量 (無說話聲):     [FILL: 0-1]    旁白下閃避後: [FILL: 0-1] (~30%)

節拍網格 (來自 beat_grid.js) - 剪輯點落在這裡
  重拍影格:       [FILL: 0, 60, 120, ...]
  硬剪輯在:          [FILL: 哪些重拍承載了大的剪輯]

音效 (每個轉場一個;高峰在動作高峰的那個影格上)
  影格            音效            角色
  [FILL]   [FILL whoosh]  領先於滑動 (提前約 4 影格開始,尾音落在剪輯點)
  [FILL]   [FILL impact]  卡片撞入,落在剪輯的那個影格上
  [FILL]   [FILL riser]   在 10-20 影格內逐漸增強,在揭露時達到頂點
  [FILL]   [FILL pop]     UI 元素出現

旁白 (約 150 wpm;場景配合旁白,而非反過來)
  台詞                                   開始    結束    場景
  [FILL line]                            [FILL]  [FILL] [FILL]
  (在關鍵台詞前 / CTA 後留下 8-15 影格的沉默)

閃避包絡線 (來自 mix_levels.js) - 降低音樂的影格範圍
  [FILL: 7-104, 112-233, ...]  淡變 [FILL]f 影格 淡入/淡出

交接:remotion-compose 編排 <Audio> + volume 回呼;remotion-render 輸出。

references/royalty-free-sourcing

商業影片需要使用你確實有權使用的音樂——「我在 YouTube 上找到的」不是授權,客戶的 Spotify 也不是。按使用場景分類的授權/免版稅來源:

  • 訂閱制音樂庫(對客戶/商業/廣告最安全): Epidemic Sound, Artlist, Musicbed, Soundstripe。固定費用,廣泛的商業授權,大型音效庫,無需每部影片署名。付費工作的預設選擇。
  • 有條件的免費(請檢查每個音軌的條款): YouTube Audio Library, Free Music Archive, Freesound.org, Incompetech, ccMixter。通常需要署名,並非所有音軌都允許商業使用——您必須驗證每個音軌的 Creative Commons 條款。請記錄您使用的音軌的署名文字。
  • AI 生成音樂(新興且變化快速): Mubert, Soundraw, Boomy。請檢查它們的服務條款——有些會將版權延伸至生成的內容,有些則不會。
  • 絕對不要使用: YouTube 下載工具、SoundCloud 翻錄、沒有授權資訊的「免費免版稅」網站、客戶的 Spotify 播放清單。這些來源中的每一個都可能讓您的客戶面臨 DMCA 下架通知或訴訟。

隨意使用此清單中的任何來源;引用您使用的內容。如果客戶要求特定的歌曲,而該歌曲沒有得到他們的音樂授權的許可,請指出風險並建議替代方案。

Individual skills in this repo

This repo contains 11 individual skills — each has its own dedicated page.

Captions From Transcript

Produce an accurate, properly timed caption track (SRT or WebVTT) from a video

Kinetic Typography

Put text in motion the right way - title cards, animated captions, lower-thirds, callouts, and word-by-word reveals - with a reading-time-per-word budget so copy holds long enough to read, plus enter/exit timing, weight and size transitions, and type hierarchy in motion. Use when someone asks to

Motion Design Principles

The craft layer for motion: pick the right easing (ease-in / ease-out / ease-in-out / spring), get timing and spacing right, build the anticipation→action→follow-through arc, and apply Disney

Narration Script

Write the spoken voiceover for a tutorial or demo - the actual words, phrased for the ear and synced one-instruction-per-action to what is on screen, with a pacing budget and a confident, jargon-checked tone. Use when someone says

Product Demo Director

Direct the craft of putting a real software UI on screen - cursor choreography, zoom/pan/callout language, screen-recording vs recreated-UI, and making state changes legible with highlights, focus pulls, and slow-downs. Use when filming or recreating an app for a product demo, feature walkthrough, onboarding clip, or release reel and asking

Remotion Compose

Turns a natural-language video brief into a complete, ready-to-preview Remotion composition - extracts duration, scenes, brand colors, aspect ratio, and real copy; plans the frame budget; and writes data-driven React/TypeScript using useCurrentFrame, interpolate, spring, AbsoluteFill, and Sequence, registered in Root.tsx. Use when someone says

Remotion Render

Renders a Remotion composition to MP4 and runs the edit-and-re-render loop - CLI render commands, 1080p/4K/9:16 presets, concurrency tuning, codec selection, batch variants from a JSON data file, and Lambda for cloud rendering. Use when someone says

Remotion Setup

Scaffolds a new Remotion video project wired for Claude Code Agent Skills - Node check, create-video scaffold, skills install, folder conventions, Google Fonts, and a smoke-test render. Use whenever someone wants to start making videos with Remotion and Claude, even just

Screencast Capture

Capture clean raw screen and camera footage for a tutorial or product demo - choosing the recorder (macOS Screenshot toolbar, QuickTime, OBS, Windows Game Bar), setting resolution / frame-rate / cursor / microphone, prepping a distraction-free stage, and recording in retakeable segments. Use when someone says

SkillMedev/tutorial-video-studio

Plan a product demo, feature announcement, or launch video as a beat sheet and shot list BEFORE animating - hook in the first 3s, problem, reveal, proof, CTA - with target duration and pacing per scene type, output as a JSON scene plan that remotion-compose consumes directly. Use when someone says

Social Video Formatter

Reframe and export a finished video for social platforms - 9:16 ↔ 16:9 cropping, burned-in captions, a platform-native first frame, loop design, and per-platform specs (aspect, length, safe areas) for TikTok, Reels, Shorts, X, and LinkedIn. Use when someone says

相關技能