Skip to content

A music bed under the narration - #293

Merged
ralyodio merged 1 commit into
masterfrom
ads-music-bed
Sep 24, 2026
Merged

ralyodio merged 1 commit into
masterfrom
ads-music-bed

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

The spot was voice or nothing. A bed now sits under the read, looped to the length of the picture and faded at both ends, because on a five second spot an abrupt bed is most of what you hear.

  • Held at -16dB. Broadcast practice is 15-20 dB down: enough to be felt, not enough to compete with the read.
  • amix normalises by default, which would have ducked the voice along with the bed. normalize=0 keeps the read where it was; two sources at these levels cannot clip.
  • The bed comes from AD_MUSIC_BED rather than a bundled asset, because the right music is a brand decision and changing it should not need a deploy.
  • Unset, every existing path is byte for byte what it was — there is a test for that. A bed with no voice is ignored, since that is just music.

114 video tests pass, 7 of them new.

Worth knowing separately

audioMode is already "narrated" by default and has been. A silent spot is not a defaulting problem — it is synthesis failing at render time, which the worker logs as narration: none (no key or synthesis failed), rendering silent. ELEVENLABS_API_KEY has to be present wherever the render worker runs, or spots stay silent no matter what this PR does.

🤖 Generated with Claude Code

The spot was voice or nothing. A bed now sits under the read, looped to the
length of the picture and faded at both ends, because on a five second spot an
abrupt bed is most of what you hear.

Held at -16dB. Broadcast practice is 15 to 20 dB down: enough to be felt,
not enough to compete with the read. Given in dB rather than a linear figure
because that is the unit the decision is made in.

amix normalises by default, which would have ducked the voice along with the
bed; normalize=0 keeps the read where it was. Two sources at these levels
cannot clip.

The bed is a path from AD_MUSIC_BED rather than a bundled asset: the right
music is a brand decision and changing it should not need a deploy. Unset, and
with no bed passed, every existing path is byte for byte what it was, which a
test asserts. A bed with no voice is ignored, since that is just music.

Worth recording: audioMode is already "narrated" by default and has been. A
silent spot is not a defaulting problem, it is synthesis failing at render
time, which the worker logs as "no key or synthesis failed". ELEVENLABS_API_KEY
has to be present wherever the render worker runs.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

ThreatCrush Security Scan

48 finding(s)

HIGH/CRITICAL: 2 | MEDIUM: 31 | LOW: 15

Severity Rule Location
HIGH tls-verification-disabled lib/onion.ts:48
HIGH secret-generic-credential lib/sp/platforms/facebook.ts:32
MEDIUM js-unescaped-html-sink app/(app)/dashboard/admin/email-broadcast/EmailBroadcastForm.tsx:125
MEDIUM js-unescaped-html-sink app/(app)/dashboard/projects/[id]/autoblog/articles/[articleId]/page.tsx:214
MEDIUM js-unescaped-html-sink app/(marketing)/blog/[slug]/page.tsx:67
MEDIUM js-unescaped-html-sink app/(marketing)/blog/[slug]/page.tsx:97
MEDIUM js-unescaped-html-sink app/(marketing)/blog/[slug]/page.tsx:104
MEDIUM js-unescaped-html-sink app/(marketing)/blog/[slug]/page.tsx:110
MEDIUM js-unescaped-html-sink app/(marketing)/recent/page.tsx:186
MEDIUM js-unescaped-html-sink app/(marketing)/recent/page.tsx:190
MEDIUM js-unescaped-html-sink app/c/[project]/[slug]/page.tsx:77
MEDIUM js-unescaped-html-sink app/c/[project]/page.tsx:57
MEDIUM js-unescaped-html-sink app/careers.js/route.ts:228
MEDIUM js-unescaped-html-sink app/careers.js/route.ts:285
MEDIUM js-unescaped-html-sink app/layout.tsx:129
MEDIUM js-open-redirect app/login/form.tsx:39
MEDIUM js-unescaped-html-sink app/r/[token]/page.tsx:176
MEDIUM js-open-redirect app/signup/form.tsx:43
MEDIUM js-open-redirect components/billing/buy-credits-modal.tsx:98
MEDIUM js-unescaped-html-sink components/json-ld.tsx:8
MEDIUM js-unescaped-html-sink components/report/markdown-view.tsx:15
MEDIUM js-unescaped-html-sink lib/careers/page-templates.ts:198
MEDIUM js-dynamic-code-execution lib/crawl-limits.ts:67
MEDIUM redos-nested-quantifier lib/emailMarkdown.ts:41
MEDIUM redos-nested-quantifier lib/emailMarkdown.ts:324
MEDIUM redos-nested-quantifier lib/lx/articleGen.ts:99
MEDIUM redos-nested-quantifier lib/tracker/agent-gate.ts:61
MEDIUM sh-remote-script-execution prober/deploy/provision.sh:30
MEDIUM sql-template-interpolation scripts/detect-slot-themes.ts:31
MEDIUM sql-template-interpolation scripts/purge-constructed-keywords.ts:163
MEDIUM sql-template-interpolation scripts/purge-offniche-keywords.ts:124
MEDIUM js-dynamic-code-execution scripts/test-crawl-limits.mjs:14
MEDIUM js-dynamic-code-execution scripts/test-crawl-limits.mjs:24
LOW secret-generic-credential app/(marketing)/docs/autoblog-webhook/page.tsx:145
LOW secret-generic-credential lib/sp/platforms/linkedin.ts:25
LOW js-dynamic-code-execution tests/careers-page-templates.test.ts:21
LOW js-dynamic-code-execution tests/careers-widget-script.test.ts:19
LOW js-dynamic-code-execution tests/careers-widget-script.test.ts:69
LOW js-dynamic-code-execution tests/contract/ad-visitor-id.test.ts:51
LOW js-dynamic-code-execution tests/contract/ad-visitor-id.test.ts:52
LOW js-dynamic-code-execution tests/contract/ads-click-cooldown-redis.test.ts:20
LOW js-dynamic-code-execution tests/contract/ads-click-cooldown-redis.test.ts:24
LOW js-dynamic-code-execution tests/contract/ads-click-cooldown-redis.test.ts:25
LOW js-dynamic-code-execution tests/contract/ads-click-cooldown-redis.test.ts:26
LOW js-dynamic-code-execution tests/contract/ads-click-cooldown-redis.test.ts:31
LOW js-dynamic-code-execution tests/contract/ads-click-cooldown-redis.test.ts:35
LOW secret-generic-credential tests/contract/posthog-integration.test.ts:13
LOW secret-generic-credential tests/lead-campaign.test.ts:16

Snippets are redacted; ThreatCrush never prints matched credential material.

@ralyodio
ralyodio merged commit d585c34 into master Sep 24, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant