VO Waveform Consent Metadata Proof in WAV LIST and iXML - Audacity ffprobe and Mux Survival 2026
Your OBS highlight concat passed. Lesson 243 clip consent is GREEN. Legal still blocked the July playtest reel because the facilitator VO WAV had no consent_record_id embedded in the waveform file—only a spreadsheet row your mux step never read.
June–July 2026 teams scale playtest highlight reels after local Whisper triage and ffmpeg concat decision trees. The July 2026 waveform consent trend playbook explains why post-mux proof became a default gate. The failure mode is video consent without WAV consent: automation can join MKV manifests but cannot join voice lines to the same UUID unless metadata lives inside the WAV (RIFF LIST or iXML chunk) and survives your ffmpeg or DaVinci handoff.
This Tutorials & Beginner-First article is the evening between Audacity export and reel mux: pin export settings, embed four contract fields, ffprobe duration, dry-run mux, file vo_consent_metadata_receipt_v1.json, then promote BUILD_RECEIPT vo_consent_metadata_ok. Pair the ninety-second Audacity VO consent preflight and Lesson 250 BUILD_RECEIPT milestone—this URL is the step-by-step beginner path, not a second checklist with different gates.
Non-repetition note: Lesson 243 owns video clip concat consent; OBS highlight preflight is C1–C6 on MKV manifests. This post owns VO WAV embedded metadata only. Backlog #15 (metadata survives mux challenge) and #23 (ten-minute ritual) are cousins—do not duplicate their primary keywords here.
Who this is for and what you get
| Audience | You will be able to… |
|---|---|
| First-time VO editor on playtest reels | Export WAV with consent fields that legal automation can read |
| Audio lead | Prove LIST/iXML survival after ffmpeg mux |
| Producer | Require wav_consent_metadata_ok before public reel promotion |
Time: one evening (~75 minutes first VO line; ~20 minutes per line after preset pinned).
Prerequisites: Audacity 3.7+, ffprobe on PATH, consent_log.csv from playtest intake, cousin playtest clip consent filed or in progress.
Why this matters now (June–July 2026)
- Highlight reel volume — Teams ship face-cam + facilitator VO cuts weekly; legal reviews moved from “do we have a form?” to “does each waveform file carry scope and expiry?”
- Automation — BUILD_RECEIPT rows now include
vo_consent_metadatabesideplaytest_clip_consent; spreadsheets alone fail CI. - Mux strip incidents — “Small” ffmpeg
-c copyor wrong sample-rate conversion drops custom chunks; teams discover at upload, not in Audacity. - Cousin 243 GREEN, reel RED — Discord threads repeat this pattern; fixing video manifest without WAV metadata wastes a sprint.
- July scaling — Multi-channel facilitator contracts already require evidence folders—VO metadata is the next column auditors ask for.
Direct answer: Export VO as WAV with consent_record_id, consent_scope, consent_expires, opt_out embedded → verify with RIFF/iXML inspector → ffprobe duration spot → dry-run mux → re-verify fields → file receipt → BUILD_RECEIPT GREEN.
Two-lane mental model (do not merge schemas)
| Lane | Artifact | Proves |
|---|---|---|
| Video clips | playtest_clip_consent_receipt_v1 |
Which MKV fragments may appear in public reel |
| VO waveform | vo_consent_metadata_receipt_v1 |
Which WAV lines carry consent linkage inside the file |
Whisper triage (concat evening tutorial) and marketing reels share tools but not receipts. Never paste Whisper merged_playtest.wav paths into highlight reel manifests.
Evening overview (five blocks)
| Block | Minutes | Output |
|---|---|---|
| 1 — Consent log row lock | 15 | One CSV row per VO line |
| 2 — Audacity export V1–V2 | 20 | vo_line_01.wav with metadata preset |
| 3 — Field proof V2–V3 | 15 | Screenshot or script output |
| 4 — ffprobe duration V4 | 10 | Duration matches clip plan |
| 5 — Mux survival V5 + receipt V6 | 15 | Post-mux proof + JSON receipt |
Block 1 — Consent log row lock (beginner)
Create or open release-evidence/playtest/consent_log.csv:
| column | example | notes |
|---|---|---|
consent_record_id |
a1b2c3d4-0001-4000-8000-000000000001 |
UUID v4 |
character_id |
facilitator_vo_07 |
matches asset folder |
consent_scope |
highlight_reel |
or internal_only |
consent_expires |
2027-12-31 |
ISO date |
opt_out |
false |
true = exclude from public reel |
build_label |
playtest-july-2027-rc1 |
matches BUILD_RECEIPT |
Common mistake: copying a video consent row UUID into VO without a dedicated VO row—V3 will fail when fields differ.
Developer note: Pin consent_log_version in receipt JSON when legal updates terms mid-wave (facilitator contract references form version).
Block 2 — Audacity export discipline (gate V1)
Document once in art/voice/README-vo-export.md:
| Setting | Value | Why |
|---|---|---|
| Format | WAV (PCM) | MP3/AAC strips custom chunks in most pipelines |
| Channels | Mono or stereo per source | Document choice in receipt |
| Sample rate | 48000 Hz (team standard) | Matches 14 free LUFS tools fest trailer lane |
| Metadata | Write custom tags enabled | Team macro must not strip LIST/iXML |
Export steps (beginner path)
- Open only the VO track (mute music beds and SFX buses).
- Select the line region aligned to highlight script timing.
- File → Export Audio → WAV.
- Apply pinned metadata preset (your team names it
PlaytestVOConsent2026). - Save to
art/voice/facilitator/vo_line_01.wav—path must match receiptvo_asset_path.
Red flags for V1 fail:
- “Export as MP3 for Slack preview” then promote MP3 to reel pipeline.
- Batch macro that normalizes loudness and removes non-standard chunks.
- Exporting full session mix instead of isolated VO.
Outbound reference: Audacity manual — Metadata for tag editor basics.
Block 3 — LIST vs iXML (gate V2)
WAV files store custom data in RIFF chunks. Teams pick one convention and document chunk_type in the receipt:
| Chunk style | When teams pick it | Inspector hint |
|---|---|---|
| LIST/INFO | Legacy pipelines, simpler tooling | ffprobe or mediainfo shows INFO tags |
| iXML | Broadcast-style metadata, DaVinci handoffs | XML block inside WAV |
Required fields inside the waveform file (not only in JSON sidecar):
consent_record_idconsent_scopeconsent_expiresopt_out
Manual verification (beginner)
- Open Metadata Editor on exported WAV (or team RIFF viewer).
- Confirm all four keys exist.
- Screenshot to
release-evidence/audio/proof/vo_line_01_metadata.png.
Scripted spot check (developer path)
ffprobe -hide_banner -show_format -show_streams vo_line_01.wav 2>&1 | tee vo_line_01_ffprobe.txt
Your team may add a small Python script using wave + chunk walk—document the script path in wav_metadata_proof.verification_tool inside the receipt. Pass V2 when all four fields are readable from the file bytes, not from a parallel .txt sidecar only.
Block 4 — Values match consent log (gate V3)
| Check | Pass when |
|---|---|
| UUID | consent_record_id in WAV equals CSV row |
| Scope | highlight_reel in WAV equals CSV unless deliberately internal_only |
| Expiry | Date string matches CSV (timezone policy documented) |
| Opt-out | opt_out: true in CSV → WAV must not ship in public reel |
If opt_out is true: stop. Do not mux into public MP4—even if audio sounds fine. Tag Lesson 239 vod_consent for routing.
Block 5 — ffprobe duration spot (gate V4)
Highlight scripts assume timing. Drift breaks concat with OBS MKV gap preflight. When the reel ships more than one VO line, graduate to the ffprobe duration and sample-rate verification matrix—this block is the single-line spot check, not batch QA.
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 vo_line_01.wav
Compare output to clip_plan.csv vo_duration_expected_sec for that line.
| Tolerance | Team policy example |
|---|---|
| ±0.05 s | Single VO line |
| ±0.15 s | Line with intentional tail silence |
Record duration_seconds and ffprobe_match: true in receipt.
PowerShell variant
$dur = ffprobe -v error -show_entries format=duration -of csv=p=0 vo_line_01.wav
[pscustomobject]@{ file='vo_line_01.wav'; duration_sec=$dur; pass=([double]$dur -gt 0) } | Export-Csv duration_spot.csv -NoTypeInformation
Attach duration_spot.csv to evidence folder for Thursday BUILD_RECEIPT row review.
Block 6 — Mux survival dry run (gate V5)
Most “legal blocked” tickets are V5 failures: metadata present pre-mux, gone post-mux.
Minimal ffmpeg dry run
ffmpeg -y -i highlight_video.mp4 -i vo_line_01.wav -c:v copy -c:a aac -b:a 192k -shortest highlight_with_vo_dryrun.mp4
Then re-extract audio or inspect intermediate WAV your pipeline actually uses:
ffmpeg -y -i highlight_with_vo_dryrun.mp4 -vn -acodec pcm_s16le -ar 48000 post_mux_audio.wav
Re-run V2 checks on post_mux_audio.wav or on the WAV your legal tooling reads—document which path you certify in conversion_survival.mux_step.
| mux_step value | Meaning |
|---|---|
ffmpeg_highlight_mp4 |
VO burned into H.264/AAC deliverable |
wav_pcm_handoff |
VO stays WAV; video separate until DaVinci |
audacity_roundtrip |
Team normalizes in Audacity again—must re-run full V1–V5 |
Pass V5 only when consent fields survive your real mux chain—not a hypothetical “we usually don’t strip.”
vo_consent_metadata_receipt_v1.json (gate V6)
Pin under release-evidence/audio/VO_CONSENT_METADATA_RECEIPT.json:
{
"schema": "vo_consent_metadata_receipt_v1",
"build_label": "playtest-july-2027-rc1",
"character_id": "facilitator_vo_07",
"vo_asset_path": "art/voice/facilitator/vo_line_01.wav",
"consent_fields": {
"consent_record_id": "a1b2c3d4-0001-4000-8000-000000000001",
"consent_scope": "highlight_reel",
"consent_expires": "2027-12-31",
"opt_out": false
},
"wav_metadata_proof": {
"chunk_type": "WAV_LIST_OR_IXML",
"fields_present": true,
"verification_tool": "manual_metadata_editor_v1"
},
"duration": {
"duration_seconds": 3.21,
"ffprobe_match": true
},
"cousin_receipts": {
"playtest_clip_consent": "release-evidence/playtest/vod/PLAYTEST_CLIP_CONSENT_RECEIPT.json"
},
"conversion_survival": {
"mux_step": "ffmpeg_highlight_mp4",
"metadata_survives": true
},
"gates": {
"V1_export_settings": "pass",
"V2_fields_present": "pass",
"V3_values_match_consent_log": "pass",
"V4_duration_stable": "pass",
"V5_conversion_survives": "pass",
"V6_build_receipt": "pass"
},
"wav_consent_metadata_ok": true,
"playtest_promotion_allowed": true
}
Promote on BUILD_RECEIPT:
| Column | Pass when |
|---|---|
vo_consent_metadata |
wav_consent_metadata_ok: true |
playtest_clip_consent |
Cousin Lesson 243 independent |
See BUILD_RECEIPT beginner pipeline for build_id alignment.
Gates V1–V6 summary table (developer ramp)
| Gate | Beginner question | Fail when |
|---|---|---|
| V1 | Did I export WAV with metadata preset? | MP3 or stripped export |
| V2 | Are four fields inside the file? | Sidecar-only metadata |
| V3 | Do values match consent log? | UUID typo |
| V4 | Does duration match plan? | ffprobe drift |
| V5 | Did mux strip tags? | Post-mux empty LIST/iXML |
| V6 | Is receipt filed + BUILD_RECEIPT updated? | JSON only in chat |
Scenario A — OBS GREEN, legal RED on VO
Context: Wednesday reel review. Video manifest passes C1–C6. Legal: “VO line 3 has no consent linkage.”
Steps:
- Open
vo_line_03.wav—V2 fail (missingconsent_record_id). - Re-export from Audacity with preset; re-run V2–V3.
- Dry-run mux; confirm V5.
- File receipt; update BUILD_RECEIPT before re-upload.
Standup sentence: “Video consent was GREEN; VO WAV lacked embedded UUID—re-exported with PlaytestVOConsent2026 preset, mux survival verified.”
Scenario B — Metadata stripped after ffmpeg
Context: V2 pass pre-mux, V2 fail post-mux.
Fix paths:
- Change ffmpeg audio codec path to preserve handoff WAV (separate lane).
- Or embed metadata after mux in team-approved tool (document in receipt—auditors will ask).
- Never mark V5 pass on faith.
After first export, run the Metadata Survives Mux Challenge (45 minutes)—this tutorial establishes the first evening habit; the challenge proves post-mux survival (Lesson 250 V5).
Scenario C — opt_out true but line in timeline
Context: Playtester revoked marketing use mid-wave.
Actions:
- Set CSV
opt_outtrue. - Remove WAV from DaVinci timeline and delete or quarantine file from
art/voice/. - Set
wav_consent_metadata_ok: falseon BUILD_RECEIPT for that build until replaced.
Consent log + OBS clip crosswalk
| Receipt | Path | Join key |
|---|---|---|
| Clip consent | PLAYTEST_CLIP_CONSENT_RECEIPT.json |
clip_id → consent_record_id |
| VO metadata | VO_CONSENT_METADATA_RECEIPT.json |
character_id + shared consent_record_id |
Same UUID may appear in both when facilitator speaks on camera and supplies isolated VO—both receipts still required.
Folder layout (evidence discipline)
release-evidence/
playtest/
consent_log.csv
vod/
PLAYTEST_CLIP_CONSENT_RECEIPT.json
audio/
VO_CONSENT_METADATA_RECEIPT.json
proof/
vo_line_01_metadata.png
vo_line_01_ffprobe.txt
duration_spot.csv
art/voice/facilitator/
vo_line_01.wav
README-vo-export.md
Friday Block 5 maintenance: verify proof/ not empty before fest branch promotion.
Audacity preset checklist (copy into README)
- [ ] WAV PCM export only
- [ ] Metadata macro named and versioned
- [ ] Music beds muted on export
- [ ]
build_labelin project notes matches BUILD_RECEIPT - [ ] Cousin 243 receipt path recorded before reel upload
- [ ] V5 dry-run logged in
conversion_survival
ffprobe format dump (debug metadata loss)
When V2 fails unexpectedly:
ffprobe -hide_banner -show_format -show_entries format_tags:all vo_line_01.wav
Save output beside vo_line_01_ffprobe.txt. Compare pre- and post-mux dumps—diff is your strip point for case study #16 later.
Relationship to store stereo (Lesson 234)
Lesson 234 — micro-trailer stereo embed is Steam store master loudness and embed—not playtest VO consent. BUILD_RECEIPT keeps separate columns. Do not merge receipts.
Relationship to AI voice pipelines
Model-generated VO may ship WAVs with wrong tags. Governance for reason-codes lives in backlog #22—this tutorial still applies: human-verified fields in LIST/iXML before public mux, regardless of generator.
Internal links map (cluster spine)
| Sibling | Role |
|---|---|
| Audacity VO preflight | Ninety-second V1–V6 |
| Lesson 250 | BUILD_RECEIPT milestone |
| Lesson 243 | Video clip cousin |
| OBS highlight preflight | C1–C6 on MKV |
| 16 OBS/ffmpeg tools | Capture stack |
| Playtest isolation | Surface discipline |
| Top 20 evidence receipts hub | Receipt #5 in full index |
| Metadata survives mux challenge | 45-minute M1–M6 post-mux proof |
| Missing iXML recovery case study | When legal blocks reel despite export proof |
Forward: backlog #23 ten-minute ritual—distinct URLs, same cluster.
Producer spreadsheet columns (optional dashboard)
| column | example |
|---|---|
| vo_asset | vo_line_01.wav |
| V2_fields | pass |
| V5_mux | pass |
| wav_consent_metadata_ok | true |
| cousin_243 | pass |
| blocker | none |
JSON remains source of truth; spreadsheet is standup-facing.
Anti-patterns (July 2026)
- Spreadsheet-only consent — legal automation cannot read Excel inside AAC.
- Trusting Audacity screenshot without post-mux re-check — V5 exists for a reason.
- Filing VO receipt while 243 fails — cousin gate first.
- Using Whisper concat receipt for marketing reel — wrong lane (Lesson 220).
- Merging
playtest_clip_consent_receiptinto VO JSON — separate schemas.
Mini exercise (75 minutes)
- Export one line without metadata—confirm V2 fail.
- Add four fields; match consent log—V3 pass.
- Run ffprobe duration—V4 pass.
- Mux dry-run; re-verify—V5 pass.
- File
VO_CONSENT_METADATA_RECEIPT.json; BUILD_RECEIPT GREEN.
Extended troubleshooting
| Symptom | Likely gate | Next doc |
|---|---|---|
| Legal blocks reel, video OK | V2–V3 | This article Block 3–4 |
| Duration mismatch in reel | V4 | MKV gap preflight |
| Fields visible in Audacity, gone in MP4 | V5 | Metadata survives mux challenge |
| Clip in reel, no consent row | 243 C3 | OBS highlight preflight |
| Whisper batch blocked | 220 | Concat decision tree blog |
Waveform vs video consent audit script (developer)
Run before #reel-upload in CI or locally:
#!/usr/bin/env bash
set -euo pipefail
VO="art/voice/facilitator/vo_line_01.wav"
test -f "$VO" || { echo "missing VO"; exit 1; }
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 "$VO" | tee /tmp/vo_dur.txt
test -f release-evidence/audio/VO_CONSENT_METADATA_RECEIPT.json || { echo "missing receipt"; exit 1; }
test -f release-evidence/playtest/vod/PLAYTEST_CLIP_CONSENT_RECEIPT.json || { echo "cousin 243 missing"; exit 1; }
echo "manual V2/V3/V5 still required"
Document in README-vo-export.md that V2/V3/V5 remain human or custom RIFF tooling—the script only guards file existence and duration probe hook.
LIST INFO tag naming conventions (team policy)
Teams disagree on exact key spellings. Pick one table and never mix:
| Policy A (snake_case) | Policy B (PascalCase) |
|---|---|
consent_record_id |
ConsentRecordId |
consent_scope |
ConsentScope |
consent_expires |
ConsentExpires |
opt_out |
OptOut |
Record metadata_key_policy: snake_case_v1 inside receipt wav_metadata_proof so migrations in consent scope and expiry governance (#20) have a baseline.
DaVinci Resolve handoff notes (V5 variant)
Many teams mux in Resolve instead of ffmpeg:
- Import WAV with metadata intact (check Media Pool metadata panel).
- Deliver ProRes + separate WAV if legal reads WAV lane.
- If delivering single MP4 only, re-run V2 on extracted audio after deliverable.
- Log
mux_step: davinci_deliverable_v1in receipt.
Resolve version upgrades have stripped custom metadata in past studio incidents—treat version bumps as V5 regression tests.
Batch export for five VO lines (same evening)
| Line | consent_record_id suffix | Expected duration |
|---|---|---|
| vo_line_01 | …0001 | 3.2 s |
| vo_line_02 | …0002 | 2.8 s |
| vo_line_03 | …0003 | 4.1 s |
| vo_line_04 | …0004 | 1.9 s |
| vo_line_05 | …0005 | 5.0 s |
One receipt per line or one receipt with lines[] array—pick one schema and document in release-evidence/audio/README.md. Do not mix styles in one sprint.
Legal review packet (what producers send)
Zip release-evidence/audio/proof/ containing:
VO_CONSENT_METADATA_RECEIPT.json- Pre-mux metadata screenshot
- Post-mux metadata screenshot or ffprobe dump
duration_spot.csv- Cousin
PLAYTEST_CLIP_CONSENT_RECEIPT.jsonpath reference
Subject line template: [build_label] VO consent metadata GREEN — 5 lines, V5 ffmpeg_highlight_mp4.
Comparison to Whisper playtest triage receipts
| Field | Whisper triage | VO consent (this article) |
|---|---|---|
| Primary file | merged_playtest.wav |
vo_line_XX.wav |
| Key boolean | concat_ok |
wav_consent_metadata_ok |
| Cousin | concat decision tree | Lesson 243 clip consent |
| Public use | Internal triage default | Marketing reel |
When ffmpeg concat fails solves merge failures; this article solves legal WAV linkage—orthogonal problems.
July readiness checklist (producer)
- [ ] Consent form version pinned in facilitator contract
- [ ] Audacity preset
PlaytestVOConsent2026on all editors - [ ]
consent_log.csvrow per VO line - [ ] V5 tested on production mux command, not lab-only
- [ ] BUILD_RECEIPT row shows both
playtest_clip_consentandvo_consent_metadata - [ ] Thursday row review includes VO metadata line
Engine and tool boundaries
Godot, Unity, and FMOD do not write playtest consent LIST chunks—Audacity export owns V1. Engine code may read receipt JSON for gating cutscenes, but do not duplicate consent fields only in User:// saves without WAV embed if legal requires waveform proof.
Outbound references
- Audacity Metadata Editor
- RIFF WAVE specification (LIST chunk overview)
- ffmpeg documentation for mux dry-run commands
Standup one-liners (copy-paste)
GREEN: “VO line 01–05: V1–V6 pass, VO_CONSENT_METADATA_RECEIPT.json filed, cousin 243 linked, BUILD_RECEIPT vo_consent_metadata promoted for playtest-july-2027-rc1.”
BLOCKED: “Reel hold: VO WAV missing embedded consent_record_id on line 03—re-export with PlaytestVOConsent2026, V5 pending after ffmpeg mux.”
MISROUTED: “This is not Whisper concat—route to VO metadata tutorial, not concat decision tree.”
Version pin for facilitators
Add to BUILD_RECEIPT.json optional block:
"vo_consent_metadata_preset": "PlaytestVOConsent2026",
"audacity_min_version": "3.7.0"
When Audacity upgrades, re-run V5 on one sample line before batch exports—metadata macros break silently more often than audio engines.
FAQ addendum — search phrasing
Why do highlight reels fail when OBS clip consent passed
Because video fragment consent and VO waveform consent are separate BUILD_RECEIPT columns. Legal automation reads embedded WAV tags; a GREEN clip manifest does not imply GREEN VO metadata.
Where do I store vo_consent_metadata_receipt_v1.json
Default path: release-evidence/audio/VO_CONSENT_METADATA_RECEIPT.json, referenced from BUILD_RECEIPT and cousin PLAYTEST_CLIP_CONSENT_RECEIPT.json under release-evidence/playtest/vod/.
Key takeaways
- Video clip consent (243) ≠ VO waveform metadata (250)—public reels need both.
- Embed
consent_record_idin WAV LIST or iXML, not spreadsheet alone. - V5 mux survival is mandatory—re-check after ffmpeg or DaVinci.
opt_out: trueexcludes line from public reel regardless of audio quality.- Audacity preflight is ninety seconds; this blog is the first evening walkthrough.
- File
vo_consent_metadata_receipt_v1.jsonunderrelease-evidence/audio/. - ffprobe duration spot catches clip-plan drift before upload.
- Cousin
PLAYTEST_CLIP_CONSENT_RECEIPT.jsonmust reference same UUID when applicable. - BUILD_RECEIPT
vo_consent_metadatais independent from store stereo Lesson 234. - Forward cluster rows #15–#16–#23 for challenge, case study, and ritual angles.
FAQ
What is WAV LIST or iXML consent metadata for playtest reels
It is embedded RIFF data carrying consent_record_id, scope, expiry, and opt_out inside the VO WAV so legal automation can verify voice lines without relying on sidecar spreadsheets alone.
How is this different from OBS playtest clip consent
Lesson 243 proves which video fragments may concat into a reel. This tutorial proves which VO WAV lines carry waveform-level consent fields.
Does ffprobe show LIST and iXML tags
ffprobe proves duration and format (V4). Use your team RIFF/iXML inspector for V2 field presence—document the tool in the receipt.
When should I file vo_consent_metadata_receipt_v1.json
After V1–V5 pass, before public highlight reel upload and before promoting BUILD_RECEIPT vo_consent_metadata_ok.
Can I use MP3 for facilitator VO in July reels
No for this pipeline—export WAV with metadata writing enabled (gate V1). MP3 is preview-only outside the consent lane.
What if ffmpeg strips metadata on mux
V5 fails—change handoff strategy or re-embed per team policy; do not mark GREEN without post-mux proof.
July highlight reels need waveform-level consent proof—export WAV with embedded fields, ffprobe duration, mux survival, cousin 243, then vo_consent_metadata_ok on BUILD_RECEIPT.