HyperFrames Audio
ミックスとは、プロセッサの積み重ねではなく、関係性の集合です。単独では正しく聞こえる2つのトラックでも、一緒にすると聞くに堪えないことがあります。その修正は、ほとんどの場合「音量を下げる」ことではなく、2つのトラックが何を奪い合っているかを見つけ、それを必要とする方に与えることです。ここにあるすべてのツールは、それらの関係性の1つを表現するために存在します。
エフェクトは要素上で data-fx-chain として保持され、プレビューとレンダリングは同じWeb Audioグラフを実行します。つまり、スタジオはライブコンテキストで、エンジンはそれがすでに駆動しているブラウザ内のオフラインコンテキストで動作します。各エフェクトの実装は1つであるため、スクラブ中に聞こえる内容が書き出される内容です。2度調整する必要はありません。
クリップのタイミングは /hyperframes-core に従います。オーディオ/ビデオのトリムとソース範囲は data-start、data-duration、data-media-start を使用し、クロスフェードは異なるトラックのクリップを重ねます。このスキルは、配置されたトラックのフェードイン/フェードアウト、クロスフェードエンベロープ、トラックゲイン/トラックボリューム、ボリュームとエフェクトのオートメーション、ダッキング/ボイスオーバーカーブ、およびエフェクトチェーンを担当します。/media-use は、ソーシング、生成、および前処理を担当します。
定数 data-playback-rate(0.1..5)は、一致するオーディオ/ビデオ要素が同じタイミング、ソースオフセット、およびレートを使用する場合、ピクチャーおよびピッチ保持サウンドに対してレンダリングセーフです。レートエンベロープがないため、ソース速度ランプはサポートされていません。派生した同期アセットを前処理してください。HyperFrames は自動的な波形同期やドリフト補正を提供しません。
コピー可能なカット/クロスフェード/リタイムのレシピについては、/hyperframes-core → references/creator-editing-recipes.md を参照してください。
すべてを保持する3つの属性は、すべてオーディオ/ビデオ要素自体にあります。
| 属性 | 保持するもの |
|---|---|
data-fx-chain | エフェクト(シグナル順) |
data-automation | このトラックのボリュームまたはそのエフェクトパラメータのエンベロープ |
data-fx-carve | カーブ自体の設定(再導出可能にするため) |
出荷されているエフェクトファミリーは、ゲイン、EQ(ハイパス、ローパス、ピーキング、シェルフ)、コンプレッサー、リミッター、ゲート、サチュレート、ディレイ、リバーブ、コーラス、フェイザー、ビットクラッシュです。
各エフェクトの正確なJSON、およびレーンが満たす必要のあるルール:references/attributes.md。
すべてのエフェクトとそのパラメータ、範囲、単位:references/fx-registry.md。
聞こえないファイルの問題を解決する方法:references/diagnosis.md。
プリセット、名前付きジョブ、ワンノブプロファイル、および症状から修正へのテーブル:references/presets.md — チェーンを手動で構築する前にこれを読んでください。なぜなら、プリセットまたは名前付きジョブのいずれかが通常、すでに問題を特定しているからです。
連携の仕組み
2つのオーサリングサーフェスがそれらの属性を書き込みます。2つのランタイムが同じビルダーを通じてそれらを読み取ります。この共有された中間層が、プレビューがレンダリングを予測する理由です。
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, tagged fromCarve"]
autoAttr["data-automation<br/>カーブされたパラメータごとに1レーン"]
end
analysis --> carveAttr
analysis --> chainAttr
analysis --> autoAttr
subgraph SHARED["1つの実装、両方から読み取られる"]
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["lane fx.n1.gain"] -.->|"その帯域における<br/>音声のレベルのエンベロープ"| p1
l4["lane fx.n4.gain"] -.->|"ベッドが全体的に<br/>(ダックする量)"| g
静的カーブは、固定値を持ちレーンがまったくない同じグラフです。
まず、何が問題かを特定する
以下の表は「音がこもっている」というところから始まります。これは、誰かがすでに聞いてそう言ったことを前提としています。「これを修正して」とファイルを渡された場合、あなたにはそのような言葉はなく、聞くこともできないため、測定する必要があります。すべてを支配する1つのルールがあります。
単一の未知の音声の絶対スペクトルは診断できません。 フォルマントは±10 dB、基本周波数は85~255 Hz、文の終わりにかけて5~6 dB減衰します。これらのすべてが単独では欠陥として読み取られ、それらすべてが話者自身のものです。
したがって、比較してください。そして、同じファイル内の何かと比較してください。存在する場合はクリーンなオリジナル、そうでない場合はポーズ(沈黙のギャップ)— ギャップで聞こえるものはすべて付加的なものであり、ギャップのスペクトルは音声ではなくチャンネルのものです。公開されている平均スペクトルや合成された制御音声と比較することは機能しません。2人の話者はほとんどの欠陥よりも大きな違いがあり、このガイダンスの背後にある評価では、両方の誤った答えがまさにそれから生じました。
オリジナルも使用可能な無音もない場合、静的な音色の欠陥は本当に未確定です。そのように述べ、適合する読み取り値を提供し、1つを選んでチェーンを構築しないでください。
コマンド、トラップ、および実証済みのレシピ:references/diagnosis.md。誰も説明していないファイルを診断する前に読んでください。
症状から始める
帯域と種類がわかったら、オーディオの問題に名前を付けます。ほとんどの悪いオーディオは、これらのうちの1つか2つであり、それぞれに出荷済みの回答があります。
| このように聞こえる | これを試す |
|---|---|
| ハムやドスンという低音が下にある | rumble-cut、または80 Hzでのhighpass |
| こもっている、胸声に聞こえる | Tame Boominess ジョブ (200 Hz) |
| こもっている、段ボールの後ろから聞こえる | Reduce Mud ジョブ (250 Hz) |
| 言葉が聞き取りにくい | Add Clarity ジョブ (3 kHz)、またはベッドをカーブする |
| 耳障りで疲れる | Soften Harshness ジョブ (3.2 kHz) |
| 単語によって音量が大きく異なる | Evenness コンプレッサー、または Even Out Levels |
| 文と文の間に部屋の音がある | room-gate |
| 声と音楽がぶつかっている | Voiceover carve — どちらかにEQをかけるのではない |
| ドライで、どこにも録音されていない | room-tight または room-natural |
| ただ「アマチュアっぽい」 | voice-clean(上記の4つを順に適用したもの) |
完全なカタログ、各プリセットの内容、帯域の語彙、および意図的にカバーされていないもの(デエッシング、ノイズ除去、トーンマッチ):references/presets.md。
追加する前に減算し、フィルタリングした後にレベル調整し、レベル調整の後に関係性、キャラクターと天井を最後に。各ステップは、次のステップが聞くものを変更します。ハイパスの前に設定されたコンプレッサーは、ランブルを追いかけることに時間を費やします。
名前ではなく、問題でファミリーを選ぶ
フィルター (highpass、lowpass、peaking、lowshelf、highshelf) は、トラックが占有を許可される周波数を決定します。これは、2つのソースが衝突する場合の最初のツールです。衝突は帯域で発生するためです。ベッドと音声の両方が1~3 kHzを必要とし、それをベッドから奪うことは、ミックス全体の音量を下げるよりもはるかにベッドへの影響が少ないです。音声のハイパスは、ランブルに対する標準的な修正です。ローパスは、意図的に音を暗くしたりこもらせたりします。
ダイナミクス (gain、compressor、limiter、gate) は、トラックのレベルが時間とともにどのように動作するかを決定します。コンプレッションは、ラウドとクワイエットの間の距離を狭め、クワイエットな部分が上がってこられるようにします。リミッターは天井です。何も整形せず、何も通過させないことを保証します。ゲートは、しきい値以下のものを除去します。これにより、フレーズ間の部屋の音を無音にします。gain は単純なレベルステージであり、トラックが邪魔にならないように移動する必要がある場合にオートメーションレーンが乗るものです。
非線形 (saturate、bitcrush) は波形の形状を変更し、そこになかった高調波を追加します。トラックにキャラクターやザラツキが必要な場合に使用します。補正のためではありません。そして、それが生成的であることを忘れないでください。つまり、薄いソースをより密度の高いものにしますが、クリーンにはしません。
時間 (delay、reverb、chorus、phaser) は、トラックを空間に配置したり、幅を与えたりします。これらはミックスを最も簡単に台無しにするものです。テールやデチューンされたコピーは、音声が必要とする同じ空間を占有するからです。何か他のものの背後に配置されるべきものに使用し、ウェット量を単独で正しく聞こえる量よりも低く保ちます。
チェーンはシリアルです。各エフェクトは、その前のエフェクトが生成したものを処理します。したがって、修正フィルタリングは早い段階で、キャラクターは中間で、リミッターは最後に配置し、実際に天井として機能できるようにします。
ボイスオーバーカーブ
それが解決する問題。 音声の下にある音楽ベッドは、音声を聞き取りにくくします。反射的にはベッド全体をダッキングしますが、これは機能するものの、ベッドの存在感すべてを犠牲にします。つまり、ボイスオーバー全体で音楽が弱々しくなります。しかし、音声はスペクトル全体を必要とするわけではありません。音声が実際に占有するいくつかの帯域だけが必要です。カーブはそれらの帯域だけを取り除き、ベッドは低域と高域を保持するため、音声が明瞭でありながら、音楽は音楽として機能し続けます。
エフェクトではなく、関係性です。 設定は処理されるトラックであるベッドに存在し、リッスンする音声に名前を付けます。これはサイドチェインコンプレッサーとまったく同じです。音量が小さくなるトラックを選択し、何がそれを小さくするかを選択します。音声トラックにカーブを決して配置しないでください。 自分自身に対してカーブされた音声は、微妙なミックス選択ではなく、バグです。
1つの音声だけでなく、すべての音声。 sources はリストです。なぜなら、ベッドは通常、シーケンス全体(ナレーター、インタビューの回答、2人目のプレゼンター)の下で実行されるからです。これらは、何かが測定される前にベッド自身のクロックに合計されます(mixCarveSources)。したがって、1つの分析がそれらすべてをカバーします。帯域はそこにあるすべての音声から得られ、エンベロープはそれらのいずれかが発生している場所で上昇します。ベッドが再生されている間に決して再生されない音声は除外されます。それらはベッドをマスクできません。
1つのノブ。 strength は 0..1 で、すべてを導き出します。カットの深さ、帯域数、幅、明瞭性と生の音声エネルギーのどちらを優先するか、レベルがどれだけ下がってもよいか、音声の下をどれだけ狙うか。これら6つは、実際のミックスでは常に一緒に動きます。穏やかなカーブは、浅いカット、少ない帯域、わずかなダッキングです。ハードなカーブは、より深く、より多くの帯域で、より多くのダッキングを行います。そのため、これらは carveProfile に一度だけ書き込まれる1つの関係性です。デフォルトは 0.25 です。これは3つの帯域で6 dBのディップ、6 dBのレベル余裕があり、穴のように聞こえることなく聞こえます。0.5 ではディップは10 dBに達し、カーブが音声のためのスペースではなく、エフェクトとして聞こえ始めるしきい値です。それ以上は、ラウドなベッドの下で静かな音声を聞かせるための意図的な領域です。0 はスペクトルのみです。1つの帯域で、レベルマッチはまったくありません。
デフォルトでカーブ。 ナレーションの下で再生されるベッドはカーブを必要とします。時間があればの仕上げステップではありません。両方のトラックを配置し、以下のコマンドを実行し、聞いてください。音楽がナレーションの下に座る必要がない場合(ミュージックビデオ、タイトルカード、トラックに合わせたモンタージュカット)のみスキップしてください。
常に音声に従います。 静的モードはありません。固定の深さは、すべてのポーズ中にベッドを薄くし、両方を聞いた後はそれを望む理由はありません。すべての値は、音声自体のレベルのエンベロープになります。無音はベッドをそのままにし、ラウドな部分はカーブを最大深度に押し上げます。これらは通常のオートメーションとして書き込まれるため、レーンがタイムラインに表示され、後で編集できます。
レベルマッチングはその一部です。 スペクトルカービングは、単に音声よりもラウドなベッドを修正できません。そのため、カーブはベッドが音声よりどれだけ上にあるかも測定し、gain ステージを書き込みます。静的カーブの場合は1つの値に保持され、動的カーブの場合はエンベロープによって駆動されます。そのエンベロープは意図的にゆっくりと解放されます。単語が終わった瞬間に全音量に戻る音楽は、機械がやっているように聞こえます。
実行方法。 スタジオでは、カーブはトラックのエフェクトラックの上部にある1つのモジュールです。音声、強度、動的、およびそれが生成した分析が1つのカードに表示されます。これは、別のトラックが音声である可能性がある場合に常に存在し、正確に1つの候補が上にあるベッドは、デフォルトで動的に、デフォルトの強度でカーブされます。それがナレーションの下のベッドに必要なものであり、モジュールはそれを変更またはオフにする場所です。複数の候補がある場合、推測するのではなく、ピッカーが待機状態になります。ヘッドレスモード(コンポジションを編集するのではなくオーサリングする場合のパス)は次のとおりです。
node <SKILL_DIR>/scripts/carve.mjs --comp index.html
これがコマンド全体です。それは見つけます…
[翻訳のため省略]