音效與音樂同步 是做什麼的?
聲音是影片的一半,卻是最常被忽略的一半。一個平庸的動畫若能對上節拍並搭配清晰的旁白,看起來就很專業;而一個精美的動畫如果剪輯點漂浮不定,旁白又被音樂淹沒,看起來就很業餘。這是關於聲音品味的層級。你來決定剪輯點落在哪裡、音效該在何處加強、旁白該如何呼吸、以及混音該如何平衡——然後你將具體的數值(節拍影格、音效時間戳記、閃避音量)交給 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,然後根據它調完的結果來配樂。
工作流程
按順序執行。在剪輯點與節拍鎖定之前,不要開始放置音效;在旁白時間確定之前,不要完成混音——每個步驟都依賴前一個步驟。
-
挑選歌曲並鎖定節奏。 選擇與影片能量和長度匹配的音樂,確認其授權(參見 references/royalty-free-sourcing),並獲取其 BPM。大多數免版稅音樂庫都會列出 BPM;如果沒有,可以手動打拍子或用偵測器。BPM 是所有後續步驟的基礎——一個節拍持續
60 / BPM秒,在專案影格率下則是fps * 60 / BPM個影格。 -
建立節拍網格並將剪輯點對齊。 將節拍轉換為影格編號,並將每個硬剪輯和主要場景變化都放在一個節拍上(執行下面的
beat_grid.js)。為了強調重點,在重拍(4/4 拍中的第 1、5、9 拍)上進行剪輯;對於常規轉場,可以在任何一個節拍上剪輯。一個偏離節拍兩三個影格的剪輯,即使觀眾說不出原因,也會覺得「不對」。將對齊後的影格清單作為<Sequence from={...}>的邊界交給 remotion-compose。 -
在轉場處放置音效,而不是蓋過它們。 音效的存在是為了讓動作感覺更真實。規則是:音效的高峰必須與動作的高峰同時出現。一個呼嘯聲 領先 於一個滑動(在剪輯點前約 3-5 個影格開始,讓它的尾音落在剪輯點上);一個撞擊/重擊聲 落在 卡片撞入的那個影格上;一個點擊/爆裂聲落在 UI 元素出現的那個影格上;一個漸強音在揭露前的 10-20 個影格中 逐漸增強,並在揭露那一刻達到頂點。每個轉場只放一個音效——堆疊多個音效只會把標點符號變成噪音。請參見 references/sfx-placement。
-
調整旁白節奏,讓它聽起來有呼吸感。 旁白決定了影片的實際節奏;視覺是為其服務的,反之則不然。目標是大約每分鐘 150 字的對話速度(約 2.5 字/秒)——太快會顯得倉促,太慢則像人質影片。在關鍵台詞之前和行動呼籲(CTA)之後,留下一段沉默的節拍(8-15 個影格)。為耳朵而寫:使用短句,每個句子一個想法,使用縮寫。永遠不要讓場景在一個字的中間剪輯——將場景邊界對齊到句子 之間 的間隙。先計時旁白,然後拉伸或壓縮場景長度以適應它(這會成為 remotion-compose 使用的
durationInFrames)。 -
混音:將音樂閃避,讓旁白浮在頂層。 這是音訊最常見的失敗。音樂和全音量的旁白在同一個頻率範圍內競爭,導致台詞聽不清楚。每當旁白在說話時,將音樂閃避到大約其原始音量的 25-35%,然後在間隙中再將音量拉回來。執行
mix_levels.js以獲得具體的音量和時間數值。目標是讓旁白大約在 -3 到 -6 dB(清晰,絕不削波),閃避後的音樂大約在 -18 到 -22 dB。將閃避包絡線(哪些影格需要閃避,以及降低後的音量)交給 remotion-compose,它會透過每個<Audio>的volume回呼來應用。 -
檢查輸出。 在 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 下架通知或訴訟。
隨意使用此清單中的任何來源;引用您使用的內容。如果客戶要求特定的歌曲,而該歌曲沒有得到他們的音樂授權的許可,請指出風險並建議替代方案。