Communitygithub.com

hyperframes-audio

HyperFrames コンポジション内に配置されたオーディオのミキシング(フェードイン/アウト、クロスフェード、トラックゲイン/ボリューム、ボリュームオートメーション、ダッキング、ボイスオーバーカーブ、EQ/コンプレッサー/リミッターなどのエフェクトチェーン、オートメーションエンベロープ、サブミックスバス)を行うスキル。オーディオのソーシングや生成は `/media-use` が担当。

hyperframes-audio とは?

`hyperframes-audio` は、HyperFrames フレームワーク内で既に配置されたオーディオトラックのミキシングに特化したスキルです。このスキルは、単なるプロセッサのスタックではなく、トラック間の「関係性」を定義することに重点を置いています。具体的には、トラックゲイン/ボリューム調整、フェードイン/アウト、クロスフェード、ボリュームオートメーション、ダッキング(ボイスオーバーカーブ)、そしてEQ、コンプレッサー、リミッター、ゲート、サチュレーション、ディレイ、リバーブ、コーラス、フェイザー、ビットクラッシュといったエフェクトチェーンを扱います。これらの設定は `data-fx-chain` や `data-automation` といった属性を通じてHTML要素に直接付与され、プレビューとレンダリングは同じWeb Audioグラフ上で実行されるため、「擦りながら聞こえる音」がそのまま最終出力に反映され、調整作業を二度行う必要がありません。このスキルは、オーディオのミキシングにおける「問題の診断」から始まり、症状に応じたエフェクトファミリー(フィルター、ダイナミクス、非線形、タイムベース)の選択、そしてボイスオーバーと音楽ベッドの周波数帯域の競合を解決する「Voiceover carve」機能まで、体系的かつ強力なミキシングワークフローを提供します。クリップのタイミング調整やレイアウトは `/hyperframes-core` が、オーディオのソーシングや生成は `/media-use` が担当するため、このスキルはミキシング固有の処理に集中できます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/maddysjarvisv1/claude-code-video-skills/tree/main/skills/hyperframes-audio

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

プラグインインストール: セットアップまたはフレッシュネスコマンドを実行する前に、このスキルが HyperFrames プラグイン内にある場合は プラグイン実行ルール に従ってください。スタンドアロンインストールの場合は、以下のアップデート手順をそのまま使用します。

HyperFrames Audio

ミックスとは、プロセッサのスタックではなく、関係性のセットです。単独で正しく聞こえる2つのトラックが、一緒になると聴くに堪えないことがあり、その修正はほとんどの場合「片方を下げる」ことではありません。問題は、それらが何を奪い合っているかを見つけ出し、それを必要とする方に与えることです。ここにあるすべてのツールは、それらの関係性の1つを表現するために存在します。

エフェクトは要素上に data-fx-chain として存在し、プレビューとレンダリングは同じ Web Audio グラフを実行します。ライブコンテキストでのスタジオ、オフラインコンテキストでのエンジン、どちらもブラウザ内で動作します。各エフェクトの実装は1つだけなので、スクラブ中に聞こえるものがそのまま書き出されます。二度調整する必要はありません。

クリップタイミングは /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 を使用してください。

3つの属性がすべてを保持します。これらはオーディオ/ビデオ要素自体に、または最初の2つについては <hf-audio-group> バスに(「複数トラックのための1つのバス」を参照)適用されます。

属性保持する内容
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/>sources · strength"]
    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/>level match"]
  g --> hand["あなた自身のエフェクト<br/>例: limiter"]
  hand --> dest["track gain, then out"]

  l1["lane fx.n1.gain"] -.->|"その帯域における<br/>ボイスのレベル<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)はトラックを空間に配置するか、幅を与えます。これらはミックスを最も簡単に台無しにするものです。テールやデチューンされたコピーが、ボイスが必要とする同じ部屋を占有するからです。他の何かの背後に置かれるべきものに使用し、ウェット量を単独で正しく聞こえる量よりも低く保ちます。

チェーンはシリアルです。各エフェクトは、前のエフェクトが生成したものを処理します。したがって、補正フィルタリングは早い段階で、キャラクターは中間で、リミッターは実際に天井として機能できる最後に配置します。

Voiceover carve

解決する問題。 ボイスの下にある音楽ベッドは、ボイスを聞き取りにくくします。反射的にベッド全体をダックすることがありますが、これは機能し、ベッドの存在感すべてを犠牲にします。音楽はボイスオーバーの間中、力なく聞こえます。しかし、ボイスはスペクトル全体を必要としません。ボイスが実際に占有するいくつかの帯域だけが必要です。カーブはそれらの帯域だけを取り、ベッドは低域と高域を保持するため、ボイスが聞き取りやすい間も、音楽は音楽であり続けます。

それはエフェクトではなく関係性です。 設定はベッド(処理されるトラック)に存在し、サイドチェインコンプレッサーが行うのとまったく同じように、聞くべきボイスを指定します。つまり、小さくなるトラックを選択し、何がそれを小さくするかを選択します。決してボイストラックにカーブを配置しないでください。 それ自体に対してカーブされたボイスは、微妙なミックスの選択ではなく、バグです。

すべてのボイスに対して、1つだけではありません。 sources はリストです。なぜなら、ベッドは通常、一連のシーケンス(ナレーター、インタビューの回答、2人目のプレゼンター)の下で実行されるからです。それらは、何かが測定される前にベッド自身のクロックに合計されます(mixCarveSources)。したがって、1つの分析がそれらのすべてをカバーします。バンドはそこにあるすべてのスピーチから得られ、エンベロープはそのいずれかが発生している場所で上昇します。ベッドが再生されている間に決して再生されないボイスは除外されます。それらはベッドをマスクできません。

複数のクリップIDに対するカーブは間違っています。クリップをグループ化し、グループに対してカーブしてください。 これはヒントではなく、不変条件です。クリップを1つずつ指定することは、徹底的に正しくなければならず、次の編集までしか正しくありません。後で追加された4番目のナレーションクリップは、カーブの認識範囲外で再生され、ベッドは静かにその下でダックしなくなります。代わりにグループを指定すると、分析時にメンバーシップが解決されるため、後でグループに追加されたクリップは 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>

グループの代わりに2つ以上のプレーンなクリップIDを指定する sources リストは、audio_carve_ungrouped_sources リントルールによってキャッチされます。それでも機能しますが、クリップが追加されたときに静かに壊れるバージョンです。

カーブグループはボイスグループにしておいてください。ベッド、SFX、音楽は含めないでください。 sources 内のグループIDは、すべての分析時に現在のメンバーに解決されます。したがって、指定したグループは、それが書かれたときに測定されたトラックではなく、後で取得するグループです。これが問題を引き起こす2つの方法です。

  • 独自のソースグループ内のベッド。 ベッドはそれ自体にボイスとして渡され、それ自身のコンテンツに対してカーブされます。これは、再分析のたびに「トラックをそれ自体に対して決してカーブしない」ルールに違反します。
  • ボイスグループ内のSFXまたは音楽クリップ。 次の分析でサイドチェインに入り、ベッドはウィッシュ音の下でダックし始めます。属性を書き込んだ実行ではそれを測定したことがないにもかかわらずです。

どちらもカーブが書かれた瞬間には見えません。分析は検出したボイスを合計し、グループ解決を経由してラウンドトリップすることはありません。したがって、最初のパスは真に正しく、次のパスだけが間違っています。したがって、各ロールに独自のグループ(ベッドには music、ナレーションには voiceover、ヒットには sfx)を与え、sources で指定されたグループにはボイスだけが含まれるようにしてください。

carve.mjs はいずれかのケースを見るとグループ形式の書き込みを拒否し、クリップIDを記録し、どのメンバーがブロックしたかをstderrに表示します。audio_carve_ungrouped_sources ルールは、配置されているものを指し示します。

…(以降の内容は翻訳対象外と判断されたため、ここでスキルマークダウンを終了します。)

Individual skills in this repo

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

関連スキル