Lesson 273: Audacity Playtest VOD Loudness Spot Whisper Receipt on BUILD_RECEIPT (2026)
Direct answer: After merged playtest WAV exists with concat_ok: true but before Whisper batch scripts run, promote playtest_vod_loudness_spot_receipt_v1.json with A1–A6 gates—ffprobe duration + audio stream, Audacity −14 LUFS ±2 on a speech minute, peak < −1 dBFS, fail-closed batch jq, and BUILD_RECEIPT loudness_spot_ok: true. Pair Audacity loudness preflight (Guide #35), Audacity loudness evening tutorial, and cousin Lesson 266 (GitHub tags run after transcript exists).

Why this matters now (November Whisper batch nights)
November 2026 facilitators merge twelve OBS fragments, launch Whisper, and get [inaudible] or three-word hallucinations while Discord claims an hour of speech. concat_ok is true—merge integrity passed—but the merged WAV is clipped, silent on the wrong track, or menu-music-only on the spot minute. Teams blame ASR and open empty GitHub tag issues—scenario E in Whisper tags strategy.
Lesson 272 wired Ren'Py upload wall-clock; 273 wires acoustic spot before Whisper so Thursday row review diffs loudness_spot_ok beside concat_ok—not founder memory of “sounds fine in VLC.”
Promotion order on BUILD_RECEIPT: concat_ok → loudness_spot_ok → Whisper batch → whisper_issue_tag_ok.
Beginner path (merged WAV → spot → receipt)
| Step | Action | Success check |
|---|---|---|
| 1 | Confirm merged WAV + concat_ok |
A1 path exists |
| 2 | Run ffprobe duration + stream | A2 > 60 s, pcm stream |
| 3 | Audacity LUFS on speech minute | A3 −12 to −16 LUFS |
| 4 | Check peak headroom | A4 < −1 dBFS |
| 5 | Block batch without receipt | A5 jq exit 0 |
| 6 | File receipt + BUILD_RECEIPT | loudness_spot_ok: true |
Time: ~45 minutes first wiring; ~8 minutes when Guide #35 preflight template exists.
Developer path (gates A1–A6)
| Gate | Check | Fail when |
|---|---|---|
| A1 | Merged WAV beside session_id |
Missing file; concat_ok false |
| A2 | ffprobe duration + audio stream | N/A duration; no audio |
| A3 | Integrated LUFS −14 ±2 | Speech minute outside −12…−16 |
| A4 | True peak < −1 dBFS | Brickwall clip on speech |
| A5 | Fail-closed batch jq | Whisper runs without receipt |
| A6 | Receipt + BUILD_RECEIPT | Promote before A5 passes |
Align with Guide #35—guide = ninety-second gate; 273 = BUILD_RECEIPT milestone with jq promotion.
Cousin receipt crosswalk
| Field | Cousin (concat Lesson 200) | Cousin (VO consent Lesson 250) | This lesson (273) |
|---|---|---|---|
| Schema | playtest_vod_triage_receipt_v1 |
vo_consent_metadata_receipt_v1 |
playtest_vod_loudness_spot_receipt_v1 |
| Scope | concat_ok merge |
Highlight-reel legal | Acoustic spot before ASR |
| BUILD_RECEIPT | concat_ok |
vo_consent_ok |
loudness_spot_ok |
Do not merge JSON schemas—reference paths in cousin_receipts only.
A1 — Merged WAV + concat cousin
WAV="playtest-vod/merged/session_2026-11-12_merged.wav"
test -f "$WAV"
jq -e '.concat_ok == true' playtest-vod/receipts/CONCAT_RECEIPT.json
Red flag: Whisper batch on per-clip MKVs when evening concat was skipped—fix MKV concat help first.
A2 — ffprobe duration and stream
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$WAV"
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name,sample_rate,channels -of csv=p=0 "$WAV"
Pass example: 3724.512000 and pcm_s16le,48000,2. Fail: duration N/A or < 60 s when session should be longer.
A3–A4 — Audacity spot minute
- Open merged WAV in Audacity 3.x.
- Select a representative minute with player speech (not menu-only).
- Analyze → Loudness and Peak… — record integrated LUFS (target −14 ±2).
- Confirm true peak below −1 dBFS on same selection.
- Screenshot →
playtest-vod/loudness-spot/lufs_spot_<session_id>.png.
Pair 14 free LUFS meter tools when Audacity meter unavailable.
A5 — Fail-closed batch guard
#!/usr/bin/env bash
set -euo pipefail
REC="${1:-playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json}"
jq -e '.loudness_spot_ok == true' "$REC" || {
echo "Whisper batch blocked: loudness_spot_ok false (A5)" >&2
exit 1
}
Wire into nightly batch script before faster-whisper or local Whisper CLI—pair January batch strategy W3 loudness requirement and February same-day Whisper W3 cousin.
A6 — playtest_vod_loudness_spot_receipt_v1.json
{
"schema": "playtest_vod_loudness_spot_receipt_v1",
"build_label": "november-closeout-2026-rc2",
"session_id": "session_2026-11-12",
"merged_wav_path": "playtest-vod/merged/session_2026-11-12_merged.wav",
"ffprobe_duration_sec": 3724.512,
"ffprobe_audio_stream": "pcm_s16le,48000,2",
"spot_minute_start_sec": 840,
"integrated_lufs": -13.8,
"true_peak_dbtp": -2.1,
"lufs_screenshot": "playtest-vod/loudness-spot/lufs_spot_session_2026-11-12.png",
"cousin_receipts": {
"concat_ok": "playtest-vod/receipts/CONCAT_RECEIPT.json",
"vo_consent": "release-evidence/vo/VO_CONSENT_METADATA_RECEIPT.json"
},
"gates": {
"A1_merged_wav": "pass",
"A2_ffprobe": "pass",
"A3_integrated_lufs": "pass",
"A4_peak_headroom": "pass",
"A5_fail_closed": "pass",
"A6_receipt": "pass"
},
"loudness_spot_ok": true,
"whisper_batch_allowed": true
}
Pin under playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json.
BUILD_RECEIPT promotion jq
jq -e '
.concat_ok == true and
.loudness_spot_ok == true
' BUILD_RECEIPT.json
jq -e '
.schema == "playtest_vod_loudness_spot_receipt_v1" and
.loudness_spot_ok == true and
(.integrated_lufs >= -16 and .integrated_lufs <= -12)
' playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json
Append BUILD_RECEIPT row:
{
"loudness_spot_ok": true,
"playtest_vod_loudness_spot_receipt": "playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json",
"whisper_batch_allowed": true
}
Rule: Do not set whisper_issue_tag_ok until Whisper produces non-empty transcripts—273 gates batch start, not GitHub.
Proof table (facilitator audit)
| Row | Evidence | GREEN when |
|---|---|---|
| P1 | concat_ok receipt path |
jq true before A1 |
| P2 | ffprobe log in receipt | A2 duration + stream |
| P3 | LUFS screenshot | A3 in band |
| P4 | Peak readout | A4 pass |
| P5 | Batch script dry-run | A5 blocks when receipt missing |
| P6 | BUILD_RECEIPT column | loudness_spot_ok matches receipt |
Key takeaways
concat_okthen loudness—never reverse BUILD_RECEIPT order.- ffprobe proves stream exists; Audacity proves speech is intelligible.
- −14 LUFS ±2 is the November batch spot target for merged playtest voice.
- Evening tutorial owns blocks A–D; 273 owns BUILD_RECEIPT promotion.
- Lesson 266 runs after transcripts exist—fix audio here first.
- VO consent Lesson 250 cousin—legal metadata ≠ loudness spot.
Common mistakes
- Running Whisper when
concat_okis false—fix merge first. - Spot-checking game-music-only minute—A3 reads wrong lane.
- Ignoring ffprobe
N/Aduration—A2 fail, not ASR bug. - Boosting Discord capture to “hear better”—A4 clip kills transcripts.
- Filing GitHub issues from empty Whisper output—stop at 273, not 266.
- Merging loudness receipt into VO consent schema—separate JSON blobs.
Troubleshooting
| Symptom | Lane |
|---|---|
| Blank Whisper lines | Re-run A3/A4; audition 30 s in Audacity |
Duration N/A |
OBS concat evening |
| LUFS −22 on speech minute | Re-capture or normalize—document in notes[] |
| LUFS −6 with clipping | Lower Discord gain; A4 fail |
| Tags blocked scenario E | This lesson before 266 |
| GitHub 422 invented repro | Fix transcript first—cousin 422 help |
Mini exercise (45 minutes)
- Merge two OBS fragments with
concat_ok: trueon receipt. - Run A2 ffprobe; log duration + stream in scratch notes.
- Audacity spot minute—capture LUFS screenshot (A3–A4).
- File
playtest_vod_loudness_spot_receipt_v1.json. - Run A5 batch guard with receipt removed—confirm exit 1.
- Promote BUILD_RECEIPT
loudness_spot_okfor Thursday review.
Continuity — November 2026 fest close-out + playtest triage (266–276)
| Lesson | Receipt focus |
|---|---|
| 272 | Ren'Py upload wall-clock |
| 273 (this) | Loudness spot before Whisper batch |
| 274 forward | Unreal OTLP diligence |
Previous: Lesson 272 — Ren'Py SteamPipe wall-clock receipt
Next: Lesson 274 — Unreal OTLP corporate proxy diligence receipt (forward)
FAQ
Same as Guide #35?
Guide = ninety-second A1–A6 preflight; 273 = BUILD_RECEIPT loudness_spot_ok column + batch jq promotion.
Same as loudness evening blog?
Blog owns blocks A–D worksheet; 273 owns receipt culture on BUILD_RECEIPT.
Can we skip spot if per-clip Whisper works?
Batch merged path still needs A3–A4—per-clip does not excuse silent merge track.
February live week same-day triage?
Pair February same-day Whisper W3—same acoustic gate before P0 transcripts.
Does loudness_spot_ok replace concat_ok?
No—both required; different schemas and gates.
Related GamineAI reads
- Audacity loudness preflight (Guide #35)
- Audacity loudness spot evening tutorial
- Local Whisper VOD pipeline
- VO consent preflight
- Lesson 266 — Whisper issue tag receipt
Sign-off: Prove duration with ffprobe, prove speech with Audacity LUFS spot, promote loudness_spot_ok on BUILD_RECEIPT, then run Whisper—not the other way around.