Communitygithub.com

hyperframes-audio

在已有音频的 HyperFrames 合成中处理淡入/淡出、交叉淡化、音轨增益/音量、音量自动化、闪避、语音优先(voiceover carve)以及效果链(EQ、压缩器、限制器、噪声门、饱和、延迟、混响、合唱、移相器、比特率压缩)等混音操作。不适用于获取或生成音频,那是 `/media-use` 的领域。不适用于剪辑时间或音轨布局,那是 `/hyperframes-core` 的领域。

hyperframes-audio 是什么?

HyperFrames Audio 技能用于处理已放置在 HyperFrames 合成中的音频内容的混音和后期制作。它专门处理那些通过属性如 `data-fx-chain`(效果链)、`data-automation`(自动化包络)和 `data-fx-carve`(语音优先雕刻)表达的音频关系。该技能在浏览器内部运行,预览和渲染使用相同的 Web Audio 图,确保听到即所得。它支持多种效果家族,包括滤波器、动态处理器、非线性效果和时间效果,并提供了一个从症状到解决方案的预设表,帮助用户快速诊断和修复常见音频问题。语音优先雕刻(voiceover carve)是该技能的关键功能,它通过分析语音频率带并仅在这些带上降低背景音乐的音量,而不是简单地闪避整个背景音乐,从而保留音乐的完整性和语音的清晰度。该技能还提供了详细的诊断指南,用于在无法试听的情况下分析音频文件。

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

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

插件安装: 在执行设置或新鲜度命令之前,请遵循插件执行规则(当此技能在 HyperFrames 插件内时)。独立安装请保留下面的更新说明。

HyperFrames Audio

混音是一组关系,而不是一堆处理器。两个单独听起来正常的音轨,放在一起可能无法入耳,修复方法几乎从来不是“把其中一个音量调低”——而是找到它们争夺的东西,然后把它交给需要它的那一方。这里的每一个工具都是为了表达这些关系之一而存在的。

效果位于元素上,作为 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/>sources · strength"]
    chainAttr["data-fx-chain<br/>peaking xN + gain, tagged 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"] -.->|“该频带中语音电平的包络”| p1
  l4["通道 fx.n4.gain"] -.->|“背景音乐整体闪避的程度”| g

首先,找出问题所在

下表从“听起来太轰”开始——这假设有人已经听过并这么说。当你被交给一个文件并被告知“修复它”时,你没有这样的描述,你也无法听到,所以你必须测量。有一条规则支配这一切:

单个未知语音的绝对频谱无法诊断。 共振峰大约 ±10 dB,基频范围在 85–255 Hz,句子结束时下降 5–6 dB。这些单独看起来都是缺陷,而每一个都是说话者本身。

所以进行比较,并且与同一个文件内部的某些内容进行比较:如果存在原始文件,则使用干净的原始文件;否则使用停顿间隙——停顿中可听到的任何东西都是附加的,停顿的频谱是通道而不是说话者。与发布的平均频谱或合成控制语音进行比较是行不通的:两个说话者之间的差异大于大多数缺陷,而本次指导背后的评估中出现的两个错误答案正是来自这种比较。

当没有原始文件且没有可用的静音时,静态音调缺陷确实是欠定的。请说出来并提供合适的读数,而不是选择一个并在此基础上构建链。

命令、陷阱和可用的配方:references/diagnosis.md。在诊断一个没有人描述过的文件之前,请阅读它。

从症状开始

一旦你知道了频带和类型,就命名音频的问题。大多数糟糕的音频是这些中的一到两个,每个都有现成的答案:

听起来像使用
下面有嗡嗡声或重击声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
语音和音乐在打架语音优先雕刻 —— 不是对任一者的 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>

一个列出两个或多个普通剪辑 ID 而不是组的 sources 列表会被 audio_carve_ungrouped_sources 检查规则捕获——它仍然工作,但它是当添加剪辑时静默失效的版本。

保持雕刻组为语音组:不含背景音乐、不含 SFX、不含音乐。 sources 中的组 ID 在_每次_分析时会解析为每个_当前_成员,因此你命名的组就是你后来得到的组——而不是写入时测量的音轨。有两种情况会出问题:

  • 背景音乐在自己的源组中。 它作为语音被交给自身,并根据自己的内容进行雕刻——这是“绝不雕刻自身音轨”规则在一次重新分析后生效。
  • 语音组中的 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.

相关技能