Communitygithub.com

HyperFrames-Audio

Verwende dieses Skill, wenn Audio, das bereits in einer HyperFrames-Komposition platziert ist, gemischt werden muss: Ein-/Ausblendungen, Überblendungen, Spurverstärkung/-lautstärke, Lautstärkeautomatisierung, Ducking, ein Musikbett, das mit einer Sprachaufnahme konkurriert (Voiceover-Carve), Effekte auf einer Spur (EQ, Kompressor, Limiter, Gate, Sättigung, Delay, Hall, Chorus, Phaser, Bitcrush), Automatisierungshüllkurven auf der Lautstärke einer Spur oder einem beliebigen Effektparameter oder ein einziger Submix-Bus, der eine Effektkette, einen Fader und eine Automatisierungsuhr für mehrere Spuren gleichzeitig trägt (`<hf-audio-group>`). Nicht verwenden für die Beschaffung oder Erzeugung von Audio – das Finden von Hintergrundmusik, Soundeffekten oder das Erstellen einer Sprachaufnahme ist `/media-use`. Nicht verwenden für Clip-Timing oder Spurlayout, das ist `/hyperframes-core`.

Was ist HyperFrames-Audio?

HyperFrames-Audio ist ein spezialisierter AI-Agenten-Skill für das Mischen von Audio in HyperFrames-Kompositionen. Er basiert auf der Prämisse, dass ein Mix ein Geflecht von Beziehungen ist – nicht nur eine Ansammlung von Prozessoren. Der Skill legt Effekte als `data-fx-chain` auf dem Element ab; Vorschau und Render nutzen denselben Web-Audio-Graphen, sodass das Gehörte beim Scrubbing exakt dem Geschriebenen entspricht. Er deckt Spurautomatisierung, Ducking, Voiceover-Carve und alle gängigen Effektfamilien (Gain, EQ, Dynamik, nichtlineare und Zeit-Effekte) ab. Clip-Timing und Quellenbereiche sind Teil von `/hyperframes-core`. Der Skill funktioniert mit HyperFrames-Plugins und eigenständigen Installationen und stützt sich auf eine Reihe von Referenzdokumenten (`attributes.md`, `fx-registry.md`, `presets.md`), um Abhilfe bei Audio-Problemen zu schaffen. Entwickler können damit Mischungen zerstörungsfrei definieren und genau das hören, was im endgültigen Rendering herauskommt.

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

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Plugin-Installationen: Bevor du Setup- oder Freshness-Befehle ausführst, befolge die Plugin-Ausführungsregeln, wenn dieser Skill Teil eines HyperFrames-Plugins ist. Bei eigenständigen Installationen behältst du die unten stehenden Update-Anweisungen bei.

HyperFrames Audio

Ein Mix ist eine Reihe von Beziehungen, kein Stapel von Prozessoren. Zwei Spuren, die für sich genommen richtig klingen, können zusammen unerträglich sein – und die Lösung ist fast nie „eine leiser drehen“, sondern herauszufinden, worüber sie streiten, und es dem zu geben, der es braucht. Jedes Werkzeug hier dient dazu, eine dieser Beziehungen auszudrücken.

Effekte leben auf dem Element als data-fx-chain, und Vorschau und Render nutzen denselben Web-Audio-Graphen – das Studio in einem Live-Kontext, die Engine in einem Offline-Kontext innerhalb des Browsers, den es bereits steuert. Es gibt eine Implementierung jedes Effekts, sodass das, was du beim Scrubbing hörst, auch das ist, was geschrieben wird. Du stimmst nie zweimal ab.

Clip-Timing bleibt /hyperframes-core: Audio-/Video-Trimms und Quellenbereiche verwenden data-start, data-duration und data-media-start, und Überblendungen überlappen Clips auf verschiedenen Spuren. Dieser Skill verwaltet Ein-/Ausblendungen auf platzierten Spuren, Überblendungshüllkurven, Spurlautstärke/-gain, Automatisierung von Lautstärke und Effekten, Ducking/Voiceover-Carve und die Effektkette. /media-use verwaltet Beschaffung, Generierung und Vorverarbeitung.

Das konstante data-playback-rate (0.1..10) ist render-sicher für Bild und tonhöhenerhaltenen Sound, wenn übereinstimmende Audio-/Video-Elemente dieselbe Zeitsteuerung, Quellenversatz und Rate verwenden. Ein Geschwindigkeitsrampe ist eine rate-Spur in data-automation (siehe docs/reference/speed-ramps); sie überschreibt die Konstante und erhält die Tonhöhe in Vorschau und Render. HyperFrames bietet keine automatische Wellenformsynchronisation oder Driftkorrektur. Für kopierbare Schnitt-/Überblend-/Neuzeit-Rezepte verwende /hyperframes-core → references/creator-editing-recipes.md.

Drei Attribute tragen alles, auf dem Audio-/Video-Element selbst – oder, für die ersten beiden, auf einem <hf-audio-group>-Bus (siehe „Ein Bus für viele Spuren“):

AttributEnthält
data-fx-chaindie Effekte, in Signalreihenfolge
data-automationHüllkurven auf der Lautstärke dieser Spur oder ihren Effektparametern
data-fx-carvedie eigenen Einstellungen des Carves, sodass er neu abgeleitet werden kann

Die mitgelieferten Effektfamilien sind Gain, EQ (Hochpass, Tiefpass, Spitzenfilter, Regale), Kompressor, Limiter, Gate, Sättigung, Delay, Hall, Chorus, Phaser und Bitcrush.

Exaktes JSON für jeden und die Regeln, die eine Spur erfüllen muss: references/attributes.md. Jeder Effekt mit seinen Parametern, Bereichen und Einheiten: references/fx-registry.md. Wie man herausfindet, was mit einer Datei nicht stimmt, die man nicht hören kann: references/diagnosis.md. Presets, benannte Jobs und Ein-Knopf-Profile sowie eine Symptom-zu-Lösung-Tabelle: references/presets.md – lies das, bevor du eine Kette von Hand baust, denn eines der Presets oder benannten Jobs benennt das Problem meist bereits.

Wie es zusammenhängt

Zwei Authoring-Oberflächen schreiben diese Attribute; zwei Laufzeitumgebungen lesen sie durch dieselben Builder. Diese gemeinsame Mitte ist der Grund, warum die Vorschau das Rendering vorhersagt.

flowchart TB
  voice["Sprachspur<br/>Mediendatei"]
  bett["Musikbett<br/>Mediendatei"]

  subgraph AUTHOR["Authoring – die einzigen Dinge, die Attribute schreiben"]
    pult["Studio<br/>Voiceover-Carve-Steuerung"]
    script["scripts/carve.mjs<br/>erkennt das Paar"]
    analyse["core/audioCarve.ts<br/>carveProfile · analyseCarveBands<br/>analyseCarveDuck · analyseCarveDynamics"]
    pult --> analyse
    script --> analyse
  end

  voice --> analyse
  bett --> analyse

  subgraph ATTR["Geschrieben auf das Bettelement"]
    carveAttr["data-fx-carve<br/>quellen · stärke"]
    chainAttr["data-fx-chain<br/>Peaking xN + Gain, getaggt von fromCarve"]
    autoAttr["data-automation<br/>eine Spur pro gecarvtem Parameter"]
  end

  analyse --> carveAttr
  analyse --> chainAttr
  analyse --> autoAttr

  subgraph GEMEINSAM["Eine Implementierung, von beiden gelesen"]
    bauen["audioFxGraph.ts · buildFxChain"]
    planen["audioFxAutomation.ts · scheduleChainAutomation"]
  end

  chainAttr --> bauen
  autoAttr --> planen

  bauen --> vorschau["Vorschau<br/>Live AudioContext<br/>attachElementFxChain"]
  planen --> vorschau
  bauen --> render["Render<br/>OfflineAudioContext im Headless-Browser<br/>applyAudioFxChain"]
  planen --> render

  vorschau --> gehoert["was du beim Scrubbing hörst"]
  render --> wav["verarbeitetes WAV<br/>+ chainTailSeconds, damit der Mix den Ausklang durchlässt"]
  wav --> mix["Engine · audioMixer<br/>Lautstärkespur hier in das PCM eingebacken, nicht im Graph"]
  mix --> ausgabe["der gerenderte Mix"]

  bearbeiten["Bearbeiten des Attributs während der Wiedergabe"] -.->|MutationObserver| vorschau

Die eigenen Einstellungen des Carves werden nie zur Wiedergabe gelesen – die Kette und Spuren, die er erzeugt hat, werden abgespielt. data-fx-carve existiert, damit die Stärke an einem vorhandenen Carve geändert werden kann, anstatt sie aus den Filtern zurückzuraten.

Innerhalb eines gecarvten Betts durchläuft das Signal zuerst die Absenkungen, dann den Pegelausgleich und dann alles, was du selbst gebaut hast – weshalb ein von dir hinzugefügter Limiter immer noch als letzte Decke fungiert:

flowchart LR
  src["dekodiertes Bett"] --> p1["Peaking<br/>400 Hz"]
  p1 --> p2["Peaking<br/>1 kHz"]
  p2 --> p3["Peaking<br/>1,6 kHz"]
  p3 --> g["Gain<br/>Pegelausgleich"]
  g --> hand["deine eigenen Effekte<br/>z. B. Limiter"]
  hand --> ziel["Spurgain, dann raus"]

  l1["Spur fx.n1.gain"] -.->|"Hüllkurve des<br/>Sprachpegels in diesem Band"| p1
  l4["Spur fx.n4.gain"] -.->|"wie stark das Bett<br/>insgesamt duckt"| g

Zuerst: Herausfinden, was falsch ist

Die folgende Tabelle beginnt mit „es klingt dröhnend“ – was voraussetzt, dass schon jemand zugehört und das gesagt hat. Wenn du eine Datei erhältst mit der Anweisung „behebe das“, hast du diesen Satz nicht und kannst nicht zuhören, also musst du messen. Eine Regel beherrscht alles:

Das absolute Spektrum einer einzelnen unbekannten Stimme kann nicht diagnostiziert werden. Formanten liegen bei ±10 dB, Grundfrequenzen zwischen 85 und 255 Hz, und Sätze fallen zum Ende hin um 5–6 dB ab. Jeder dieser Werte liest sich für sich genommen als Defekt, und jeder einzelne davon ist der Sprecher.

Also vergleiche, und vergleiche mit etwas in derselben Datei: dem sauberen Original, falls vorhanden, ansonsten den Pausen – was immer in einer Lücke hörbar ist, ist additiv, und das Spektrum der Lücke ist der Kanal und nicht die Stimme. Der Vergleich mit einem veröffentlichten Durchschnittsspektrum oder einer synthetisierten Kontrollstimme funktioniert nicht: Zwei Sprecher unterscheiden sich mehr als die meisten Defekte, und beide falschen Antworten in der Bewertung, die dieser Anleitung zugrunde liegt, stammen genau daher.

Wenn es kein Original und keine nutzbare Stille gibt, ist ein statischer tonaler Defekt wirklich unterbestimmt. Sage das und biete die passenden Messwerte an, anstatt einen auszuwählen und eine Kette darauf aufzubauen.

Befehle, Fallstricke und durchgearbeitete Rezepte: references/diagnosis.md. Lies es, bevor du eine Datei diagnostizierst, die niemand beschrieben hat.

Beginne mit dem Symptom

Sobald du das Band und die Art kennst, benenne, was mit dem Audio nicht stimmt. Die meisten schlechten Audios sind ein oder zwei dieser Punkte, und jeder hat eine mitgelieferte Antwort:

Es klingt wieGreife zu
Brummen oder dumpfes Dröhnenrumble-cut oder ein highpass bei 80 Hz
Dröhnend, brummigTame Boominess-Job (200 Hz)
Gedämpft, wie hinter PappeReduce Mud-Job (250 Hz)
Wörter schwer zu verstehenAdd Clarity-Job (3 kHz) oder Carve das Bett
Scharf und ermüdendSoften Harshness-Job (3,2 kHz)
Manche Wörter viel lauter als andereEvenness auf einem Kompressor oder Even Out Levels
Raumton zwischen den Sätzenroom-gate
Stimme und Musik kämpfenVoiceover-Carve – kein EQ auf einem von beiden
Trocken, klingt nach nirgendworoom-tight oder room-natural
Einfach „Amateur“voice-clean, das vier der obigen in der richtigen Reihenfolge ist

Vollständiger Katalog, was jedes Preset enthält, das Band-Vokabular und was bewusst NICHT abgedeckt wird (De-Essing, Rauschentfernung, Ton-Matching): references/presets.md.

Subtrahiere, bevor du hinzufügst, pegel nach dem Filtern, Beziehungen nach dem Pegel, Charakter und Deckel zuletzt. Jeder Schritt ändert, was der nächste hört – ein Kompressor, der vor einem Hochpass eingestellt wird, verbringt seine Zeit damit, Brummen zu jagen.

Greife nach einer Familie je nach Problem, nicht nach dem Namen

Filter (highpass, lowpass, peaking, lowshelf, highshelf) entscheiden, welche Frequenzen eine Spur belegen darf. Dies ist das erste Werkzeug für Kollisionen zwischen zwei Quellen, weil Kollisionen in Bändern passieren: Ein Bett und eine Stimme wollen beide 1–3 kHz, und dem Bett diesen Bereich wegzunehmen, kostet das Bett viel weniger, als die gesamte Spur leiser zu drehen den Mix kostet. Ein Hochpass auf einer Stimme ist die Standardlösung für Brummen; ein Tiefpass verdunkelt oder dämpft absichtlich.

Dynamikeffekte (gain, compressor, limiter, gate) entscheiden, wie sich der Pegel einer Spur im Laufe der Zeit verhält. Kompression verringert den Abstand zwischen laut und leise, sodass die leisen Teile angehoben werden können. Ein Limiter ist eine Obergrenze – er formt nichts, er stellt sicher, dass nichts darüber hinausgeht. Ein Gate entfernt, was unter einem Schwellwert liegt, wodurch Raumton zwischen Phrasen zum Schweigen gebracht wird. gain ist eine einfache Pegelstufe, die von einer Automatisierungsspur geritten wird, wenn eine Spur aus dem Weg gehen muss.

Nichtlineare Effekte (saturate, bitcrush) verändern die Wellenform, was Oberschwingungen hinzufügt, die vorher nicht da waren. Greife danach, wenn eine Spur Charakter oder Biss statt Korrektur braucht – und denke daran, sie ist generativ: Sie macht eine dünne Quelle dichter, nicht sauberer.

Zeiteffekte (delay, reverb, chorus, phaser) versetzen eine Spur in einen Raum oder verleihen ihr Breite. Diese ruinieren am leichtesten einen Mix, weil ein Ausklang oder eine verstimmte Kopie denselben Raum einnimmt, den eine Stimme braucht. Verwende sie auf dem, was hinter etwas anderem sitzen soll, und halte den Nassanteil niedriger, als es in Isolation richtig klingt.

Die Kette ist seriell: Jeder Effekt verarbeitet das, was der vorherige produziert hat. Korrigierende Filter gehören also an den Anfang, Charakter in die Mitte und ein Limiter ans Ende, wo er tatsächlich als Obergrenze wirken kann.

Voiceover-Carve

Das Problem, das es löst. Ein Musikbett unter einer Stimme macht die Stimme schwer verständlich. Der Reflex ist, das ganze Bett zu ducken, was funktioniert, aber dem Bett seine gesamte Präsenz raubt – die Musik wird für den gesamten Voiceover schlaff. Aber die Stimme braucht nicht das gesamte Spektrum. Sie braucht nur die wenigen Bänder, die sie tatsächlich belegt. Carve nimmt nur diese, und das Bett behält seinen Tiefton und seine Höhen, sodass es immer noch Musik ist, während die Stimme immer noch verständlich ist.

Es ist eine Beziehung, kein Effekt. Die Einstellungen leben auf dem Bett – der Spur, die verarbeitet wird – und sie benennen die Stimmen, auf die gehört werden soll, genau wie ein Sidechain-Kompressor: Du wählst die Spur aus, die leiser wird, und bestimmst, was sie leiser macht. Setze niemals ein Carve auf eine Sprachspur. Eine gegen sich selbst gecarvte Stimme ist ein Fehler, keine subtile Mix-Entscheidung.

Jede Stimme, nicht nur eine von ihnen. sources ist eine Liste, weil ein Bett normalerweise unter einer ganzen Sequenz läuft – einem Erzähler, einer Interviewantwort, einer zweiten Moderatorin. Sie werden vor der Messung auf die eigene Uhr des Betts summiert (mixCarveSources), sodass eine Analyse alle abdeckt: Die Bänder stammen von der gesamten Sprache dort, und die Hüllkurven steigen, wo immer etwas davon passiert. Stimmen, die niemals spielen, während das Bett läuft, werden weggelassen; sie können es nicht überdecken.

Ein Carve gegen mehr als eine Clip-ID ist falsch. Gruppiere die Clips und carve gegen die Gruppe. Dies ist eine Invariante, kein Tipp. Das Aufzählen von Clips einzeln muss erschöpfend richtig sein und bleibt nur bis zum nächsten Schnitt richtig – ein vierter, später hinzugefügter Erzähl-Clip spielt außerhalb des Bewusstseins des Carves, und das Bett duckt nicht still unter ihm. Stattdessen benenne die Gruppe, die Mitgliedschaft wird zum Analysezeitpunkt aufgelöst, sodass ein später zur Gruppe hinzugefügter Clip abgedeckt ist, ohne sources zu berühren:

<!-- Gruppiere die Erzählung, dann carve das Bett gegen die Gruppe -->
<audio id="vo-intro" data-audio-group="voiceover" …></audio>
<audio id="vo-mitte" data-audio-group="voiceover" …></audio>
<audio id="vo-outro" data-audio-group="voiceover" …></audio>

<audio id="musik" data-fx-carve='{"enabled":true,"sources":["voiceover"],"strength":0.8}' …></audio>

Eine sources-Liste, die zwei oder mehr einfache Clip-IDs anstelle einer Gruppe nennt, wird von der Lint-Regel audio_carve_ungrouped_sources abgefangen – sie funktioniert trotzdem, aber es ist die Version, die still verrottet, wenn ein Clip hinzugefügt wird.

Halte die Carve-Gruppe eine Sprachgruppe: kein Bett, kein SFX, keine Musik. Eine Gruppen-ID in sources wird zu jedem aktuellen Mitglied bei jeder Analyse aufgelöst, sodass die Gruppe, die du nennst, auch die Gruppe ist, die du später bekommst – nicht die Spuren, die gemessen wurden, als sie geschrieben wurde. Zwei Arten, wie das beißt:

  • Das Bett in seiner eigenen Quellengruppe. Es wird sich selbst als Stimme übergeben und gegen seinen eigenen Inhalt gecarvt – die Regel „carve niemals eine Spur gegen sich selbst“ kommt bei der nächsten Neu-Analyse.
  • Ein SFX- oder Musik-Clip in der Sprachgruppe. Er gelangt bei der nächsten Analyse in die Sidechain und das Bett beginnt unter einem Whoosch zu ducken, obwohl der Lauf, der das Attribut geschrieben hat, ihn nie gemessen hat.

Beide sind im Moment des Schreibens des Carves unsichtbar: Die Analyse summiert die erkannten Stimmen und durchläuft nie die Gruppenauflösung, sodass der erste Durchgang wirklich korrekt ist und erst der nächste falsch ist. Gib also jeder Rolle ihre eigene Gruppe – music für das Bett, voiceover für die Erzählung, sfx für die Effekte – und halte die in sources genannte Gruppe nur mit Stimmen besetzt.

carve.mjs weigert sich, die Gruppenform zu schreiben, wenn einer der beiden Fälle auftritt, zeichnet Clip-IDs auf und gibt auf stderr aus, welches Mitglied sie blockiert hat. Die Regel audio_carve_ungrouped_sources zeigt dann auf das Arrangement.

Individual skills in this repo

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

Verwandte Skills