外掛安裝: 在執行設定或更新指令前,若此 skill 位於 HyperFrames 外掛內,請遵循外掛執行規則。獨立安裝則保留以下更新說明。
HyperFrames 音訊
混音是一套關係的集合,而非處理器的堆疊。兩個各自聽起來沒問題的音軌,放在一起可能會變得很刺耳,而解決方案幾乎從來不是「把其中一個調小聲」— 而是找出它們在爭奪什麼,並將那個頻段分配給更需要它的音軌。這裡的每個工具都是為表達這些關係而存在。
效果存在於元素上的 data-fx-chain 屬性中,預覽與渲染執行的是同一個 Web Audio 圖形 — 在即時環境中使用 studio,在離線環境中使用引擎(位於其驅動的瀏覽器內部)。每個效果只有一種實作,因此你在拖動時間軸時聽到的,就是最終會寫入的內容。你永遠不需要調整兩次。
片段時序仍屬於 /hyperframes-core:音訊/影片修剪與來源範圍使用 data-start、data-duration 和 data-media-start,而交叉淡變則讓不同音軌上的片段重疊。此 skill 擁有放置後音軌的淡入/淡出、交叉淡變包絡、音軌增益/音量、音量與效果自動化、閃避/旁白雕刻,以及效果鏈。/media-use 則負責來源管理、生成與預處理。
常數 data-playback-rate(0.1..10)在配對的音訊/影片元素使用相同的時序、來源偏移與速率時,可安全地進行影像與保留音高的聲音渲染。速度變化是一個位於 data-automation 中的 rate 通道(詳見 docs/reference/speed-ramps);它會覆寫常數,並在預覽與渲染中保持音高。HyperFrames 不提供自動波形同步或漂移校正。
如需可複製的剪輯/交叉淡變/重新計時範例,請使用 /hyperframes-core → references/creator-editing-recipes.md。
三個屬性承載了所有內容,它們位於音訊/影片元素本身 — 或者,對於前兩個屬性,位於一個 <hf-audio-group> 匯流排上(請參閱「一個匯流排服務多個音軌」):
| 屬性 | 承載內容 |
|---|---|
data-fx-chain | 效果,按訊號處理順序排列 |
data-automation | 此音軌上音量或其效果參數的包絡線 |
data-fx-carve | 雕刻本身的設定,以便日後可以重新推導 |
內建的效果家族包括:增益、EQ(高通、低通、峰值、高低架)、壓縮器、限制器、閘門、飽和、延遲、殘響、合聲、移相器和位元壓碎。
每個效果的確切 JSON 格式,以及通道必須滿足的規則:references/attributes.md。
每個效果及其參數、範圍和單位:references/fx-registry.md。
如何判斷一個你無法聽到的檔案出了什麼問題:references/diagnosis.md。
預設、命名作業與單旋鈕設定檔,以及症狀對應修復表:references/presets.md — 在手動建立效果鏈之前請先閱讀,因為其中一個預設或命名作業通常已經指出了問題。
如何運作
兩個編輯介面負責寫入這些屬性;兩個執行時期透過相同的建構器讀取它們。這個共享的中間層就是預覽能預測渲染結果的原因。
flowchart TB
voice["語音音軌<br/>媒體檔案"]
bed["音樂襯底<br/>媒體檔案"]
subgraph AUTHOR["編輯 — 唯一寫入屬性的地方"]
panel["工作室<br/>旁白雕刻控制"]
script["scripts/carve.mjs<br/>偵測配對,預設為動態"]
analysis["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
panel --> analysis
script --> analysis
end
voice --> analysis
bed --> analysis
subgraph ATTRS["寫入襯底元素的屬性"]
carveAttr["data-fx-carve<br/>source · strength · dynamic"]
chainAttr["data-fx-chain<br/>peaking xN + gain, 標記 fromCarve"]
autoAttr["data-automation<br/>每個雕刻參數一個通道"]
end
analysis --> carveAttr
analysis --> chainAttr
analysis --> autoAttr
subgraph SHARED["單一實作,兩者皆讀取"]
build["audioFxGraph.ts · buildFxChain"]
sched["audioFxAutomation.ts · scheduleChainAutomation"]
end
chainAttr --> build
autoAttr --> sched
build --> preview["預覽<br/>即時 AudioContext<br/>attachElementFxChain"]
sched --> preview
build --> render["渲染<br/>無頭瀏覽器中的 OfflineAudioContext<br/>applyAudioFxChain"]
sched --> render
preview --> heard["拖動時間軸時聽到的內容"]
render --> wav["處理後的 WAV<br/>+ chainTailSeconds 確保混音讓尾音通過"]
wav --> mix["引擎 · audioMixer<br/>音量通道在此處烘焙到 PCM 中,而非圖形中"]
mix --> out["渲染後的混音"]
edit["播放中編輯屬性"] -.->|MutationObserver| preview
雕刻本身的設定在播放時從不被讀取 — 實際播放的是它產生的效果鏈和通道。data-fx-carve 的存在是為了讓現有雕刻的強度可以被更改,而無需從濾波器中反向猜測。
在一個已雕刻的襯底內部,訊號會先經過凹陷,接著是電平匹配,然後是你自行添加的任何效果 — 這就是為什麼你後續添加的限制器仍然能作為最終的天花板:
flowchart LR
src["解碼後的襯底"] --> p1["peaking<br/>400 Hz"]
p1 --> p2["peaking<br/>1 kHz"]
p2 --> p3["peaking<br/>1.6 kHz"]
p3 --> g["gain<br/>電平匹配"]
g --> hand["你的自訂效果<br/>例如限制器"]
hand --> dest["音軌增益,然後輸出"]
l1["通道 fx.n1.gain"] -.->|"該頻段語音電平的<br/>包絡線"| p1
l4["通道 fx.n4.gain"] -.->|"襯底整體<br/>閃避的程度"| g
靜態雕刻則是相同的圖形,但使用固定的數值且沒有任何通道。
首先,判斷問題所在
下表從「聽起來太轟」開始 — 這假設已經有人聽過並提出了這個問題。當你拿到一個檔案並被告知「修好它」,但你沒有這樣的描述也無法親自聆聽時,就必須進行測量。有一個規則主導這一切:
無法診斷單一未知語音的絕對頻譜。 共振峰有 ±10 dB 的變化,基頻範圍在 85–255 Hz 之間,句子結尾會衰減 5–6 dB。這些特性單獨來看都像是缺陷,但實際上都是說話者的特徵。
因此,要進行比較,而且是與同一檔案內的參考點比較:如果有的話就用乾淨的原始版本,否則就用暫停間隙 — 在間隙中能聽到的任何聲音都是額外添加的,而間隙的頻譜代表的是通道本身而非語音。與出版的標準頻譜或合成控制語音進行比較是無效的:兩位說話者之間的差異遠大於大多數缺陷的影響,而本指南評估中出現的兩個錯誤答案正是來自於這種比較方法。
當沒有原始版本也沒有可用的靜音時,靜態的音調缺陷確實是無法確定的。請直接說明這一點,並提供符合條件的讀數,而不是隨意選擇一個並基於它建立效果鏈。
指令、陷阱和可行的操作範例:references/diagnosis.md。在診斷一個沒有人描述過的檔案之前,請先閱讀它。
從症狀開始
一旦你確定了頻段和類型,就試著說出音訊的問題。大多數不良音訊都屬於以下一或兩種情況,而每個情況都有一個內建的解決方案:
| 聽起來像 | 嘗試使用 |
|---|---|
| 底下有哼聲或重擊聲 | rumble-cut,或 80 Hz 的 highpass |
| 轟鳴、沉重 | 抑制轟鳴感作業 (200 Hz) |
| 模糊、像隔著紙板 | 減少混濁感作業 (250 Hz) |
| 語音難以辨識 | 增加清晰度作業 (3 kHz),或雕刻襯底 |
| 刺耳且令人疲勞 | 柔化刺耳感作業 (3.2 kHz) |
| 某些單詞比其他大聲很多 | 對壓縮器使用均勻度,或平衡電平 |
| 句子之間有殘響 | room-gate |
| 語音與音樂互相干擾 | 旁白雕刻 — 不是在任一者上使用 EQ |
| 乾澀、像在虛無中錄製 | room-tight 或 room-natural |
| 聽起來就是「業餘」 | voice-clean,它結合了上述四種效果 |
完整目錄、每個預設包含的內容、頻段詞彙,以及有意不包含的項目(除齒音、降噪、音色匹配):references/presets.md。
先減法再加法,濾波後再調整電平,處理完關係後再調整音量,最後處理特色與天花板。每一步都會改變下一步聽到的內容 — 在高通濾波器之前設定的壓縮器,會將時間花在追蹤低頻的轟鳴聲上。
根據問題而非名稱來選取效果家族
濾波器(highpass、lowpass、peaking、lowshelf、highshelf)決定了一個音軌可以佔據哪些頻率。這是處理兩個音源衝突時的首選工具,因為衝突發生在頻段中:襯底和語音都想要 1–3 kHz,將這個頻段從襯底中移除,對襯底的影響遠小於將整個襯底音量降低對混音的影響。對語音使用高通濾波器是消除低頻噪音的標準方法;低通濾波器則用於刻意讓聲音變暗或模糊。
動態處理(gain、compressor、limiter、gate)決定了一個音軌的音量隨時間變化的方式。壓縮器縮小大聲與小聲之間的差距,讓小聲的部分可以被提升。限制器是一個天花板 — 它不塑造任何東西,只保證任何訊號都不會超過這個界限。閘門會移除低於某個閾值的聲音,這就是你如何消除短語之間環境噪音的方法。gain 是一個單純的電平調整階段,當一個音軌需要讓位時,自動化通道就會使用它。
非線性處理(saturate、bitcrush)改變了波形的形狀,這會增加原本不存在的泛音。當一個音軌需要音色特性或顆粒感而非校正時使用它 — 但要記住它是生成式的:它會讓一個單薄的音源變得更豐富,而不是更乾淨。
時間效果(delay、reverb、chorus、phaser)將一個音軌置於一個空間中或賦予它寬度。這些效果最容易破壞混音,因為殘響尾音或失諧的複製品會佔據語音所需要的相同空間。將它們用在應該位於其他東西_後面_的物件上,並且保持濕聲比例低於單獨聽起來覺得合適的程度。
效果鏈是串聯的:每個效果處理的是前一個效果的輸出。因此,校正性的濾波應放在前面,音色效果在中間,而限制器放在最後,這樣它才能真正起到天花板的作用。
旁白雕刻
它解決的問題。 音樂襯底下的語音會使語音難以聽清。直覺反應是讓整個襯底音量降低,這雖然有效,但也讓音樂失去了所有活力 — 音樂在整個旁白期間都變得軟弱無力。但語音並不需要整個頻譜,它只需要它實際佔據的那幾個頻段。雕刻只會移除這些頻段,讓襯底保留其低頻和高頻,這樣音樂仍然是音樂,同時語音也仍然清晰可辨。
這是一種關係,而非一個效果。 設定存在於_襯底_上 — 也就是被處理的音軌 — 並且它們指定了要聽取的語音來源,就像側鏈壓縮器一樣:你選擇會變安靜的音軌,並選取是什麼讓它變安靜。絕對不要將雕刻放在語音音軌上。 將語音對自身進行雕刻是一個錯誤,而不是一個微妙的混音選擇。
每個語音,而不是其中一個。 sources 是一個列表,因為一個襯底通常會運行在整個序列之下 — 一個旁白、一個採訪回答、第二個主持人。它們會在襯底自身的時鐘上被加總起來,然後再進行測量(mixCarveSources),因此一個分析就能涵蓋所有語音:頻段來自於所有存在的語音,而包絡線在任何語音發生的地方都會上升。那些從未與襯底同時播放的語音則被排除在外;它們無法遮蔽襯底。
對多個片段 ID 進行雕刻是錯誤的。請將片段分組,並對該分組進行雕刻。 這不是一個建議,而是一個不變的法則。逐個命名片段必須完全正確,並且只在下次編輯之前保持正確 — 如果之後新增了第四個旁白片段,它就會在雕刻的感知範圍之外播放,導致襯底無法在其下方正確閃避。改用命名分組則可以在分析時解析成員關係,因此稍後加入分組的片段無需修改 sources 即可被涵蓋:
<!-- 將旁白分組,然後對該分組進行襯底雕刻 -->
<audio id="vo-intro" data-audio-group="voiceover" …></audio>
<audio id="vo-middle" data-audio-group="voiceover" …></audio>
<audio id="vo-outro" data-audio-group="voiceover" …></audio>
<audio id="music" data-fx-carve='{"enabled":true,"sources":["voiceover"],"strength":0.8}' …></audio>
一個 sources 列表如果包含了兩個或多個純片段 ID 而非一個分組,會被 audio_carve_ungrouped_sources 檢查規則捕獲 — 它仍然可以運作,但這個版本會在新增一個片段時默默地失效。
保持雕刻分組為語音分組:不要包含襯底、音效或音樂。 sources 中的分組 ID 在_每次_分析時都會解析為每個_當前的_成員,因此你命名的分組就是之後獲取的分組 — 而不是當初寫入時所測量的那些音軌。有兩種情況會引發問題:
- 襯底位於其自身的來源分組中。 它被當作一個語音傳遞給自身,並根據其自身內容進行雕刻 — 這就是「永遠不要將一個音軌對其自身進行雕刻」的規則,並在下一次重新分析時生效。
- 一個 SFX 或音樂片段位於語音分組中。 它會在下次分析時進入側鏈,然後襯底會開始為了躲避一個「咻」聲而閃避,即使最初寫入屬性時的分析從未測量過它。
這兩種情況在雕刻被寫入的那一刻是不可見的:分析只對它檢測到的語音進行加總,並不會往返解析分組成員,所以第一次分析是正確的,只有下一次分析才會出錯。因此,請為每個角色建立自己的分組 — music 給襯底,voiceover 給旁白,sfx 給音效 — 並確保 sources 中命名的分組只包含語音。
carve.mjs 在遇到這兩種情況時,會拒絕寫入分組形式,而是記錄片段 ID,並顯示……