外掛安裝: 在執行設定或更新命令前,請遵循 外掛安裝規則(當此技能位於 HyperFrames 外掛內部時)。獨立安裝則保留下方的更新說明。
HyperFrames 音訊
混音是一組關係,而不是處理器的堆疊。兩個單獨聽起來都對的音軌,放在一起可能難以入耳,而解決方法幾乎從來不是「把其中一個調小聲」——而是要找出它們在爭奪什麼,然後把它交給需要的那個。這裡的每個工具都是為了表達其中一種關係。
效果存在於元素上作為 data-fx-chain,預覽和渲染使用相同的 Web Audio 圖譜——即時環境中的工作室,以及瀏覽器內離線環境的引擎。每個效果只有一種實作,因此你在時間軸上拖曳時聽到的,就是最終會寫入的結果。你無需重複調整。
片段時間軸仍由 /hyperframes-core 處理:音訊/影片的修剪和來源範圍使用 data-start、data-duration 和 data-media-start,交叉淡變則透過在不同音軌上重疊片段實現。此技能負責已放置音軌的淡入/淡出、交叉淡變包絡、音軌增益/音量、音量及效果自動化、閃避/人聲雕刻,以及效果鏈。/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/>來源 · 強度"]
chainAttr["data-fx-chain<br/>多個峰值 + 增益,標記為 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["峰值<br/>400 Hz"]
p1 --> p2["峰值<br/>1 kHz"]
p2 --> p3["峰值<br/>1.6 kHz"]
p3 --> g["增益<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 的高通濾波器 |
| 轟鳴、胸腔共鳴感過重 | 馴服轟鳴感 任務(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 程式碼檢查規則捕獲——它仍然可以運作,但這是一個會在添加片段時悄悄失效的版本。
保持雕刻群組為人聲群組:不要包含鋪底、SFX 或音樂。 sources 中的群組 ID 在 每次 分析時都會解析為所有 當前的 成員,因此你命名的群組就是你之後會得到的群組——而不是當初寫入時所測量的那些音軌。有兩種情況會讓你吃虧:
- 鋪底在其自身的來源群組中。 它會把自身當作人聲來處理,並針對自己的內容進行雕刻——「永遠不要讓一個音軌針對自身進行雕刻」這條規則在下一次重新分析時就會生效。
- 一個 SFX 或音樂片段在人聲群組中。 它會在下次分析時進入側鏈,鋪底開始針對一個呼嘯聲進行閃避,即使當初寫入屬性的那次運行從未測量過它。
這兩種情況在雕刻寫入的瞬間是不可見的:分析會加總它檢測到的人聲,並且不會透過群組解析進行往返,因此第一次通過是真正正確的,只有下一次才是錯的。因此,請為每個角色分配自己的群組——music 用於鋪底,voiceover 用於旁白,sfx 用於音效——並確保 sources 中命名的群組只包含人聲。
carve.mjs 在遇到這兩種情況時會拒絕寫入群組形式,改為記錄片段 ID,並在 stderr 上指出是哪個成員阻止了它。然後 audio_carve_ungrouped_sources 規則會指向這個安排...