Your First Audacity Playtest VOD Loudness Spot Before Whisper Batch in One Evening - 2026
You merged twelve OBS clips into session_2026-12-03_merged.wav. concat_ok is true. You launched the local Whisper batch and got blank lines, [inaudible] everywhere, or three-word hallucinations. The facilitator swears players talked for an hour.
November–December 2026 playtest nights produce merged WAV that is technically valid but acoustically wrong: clipped Discord voice, silent menu tours, or merged files with zero audible speech. Whisper tag extraction assumes transcripts exist—this Tutorials & Beginner-First guide closes the loudness spot gap in one evening: ffprobe duration sanity, Audacity −14 ±2 LUFS spot, clip peak check, file playtest_vod_loudness_spot_receipt_v1.json, and set loudness_spot_ok on BUILD_RECEIPT before Whisper batch and GitHub issue tags.
Non-repetition note: OBS concat evening owns merge discipline; LUFS tools listicle owns tool roundup; VO consent metadata owns highlight-reel consent; Loudness spot preflight (Guide) owns ninety-second A1–A6; Lesson 273 forward owns BUILD_RECEIPT milestone. This URL is the beginner evening path between concat_ok and Whisper.
Why this matters now (November–December 2026)
- Whisper batch volume — Facilitators run ASR on whole sessions, not per-clip QA.
- Silent merges —
concat_oktrue but wrong track selected (game audio only). - Clipped Discord voice — Boosted mics distort; ASR returns garbage without throwing errors.
- GitHub tag discipline — Whisper→issue workflow scenario E blocks tags when transcript is empty—fix audio before blame ASR.
- Receipt chain —
concat_ok→loudness_spot_ok→whisper_issue_tag_okmust be ordered on BUILD_RECEIPT.
Direct answer: ffprobe proves duration and audio stream exist; Audacity loudness meter proves integrated level near −14 LUFS ±2 on a representative minute; peak below −1 dBFS on speech; file playtest_vod_loudness_spot_receipt_v1.json with A1–A6 pass; only then run Whisper batch.
Who this is for and what you get
| Audience | You will be able to… |
|---|---|
| Beginner facilitator | Spot-check one merged WAV in Audacity |
| Solo dev | Stop empty Whisper output on bad merges |
| Producer | Gate triage stand-up on loudness_spot_ok |
| Working dev | Wire ffprobe + jq before batch script |
Time: ~60–90 minutes first evening; 10 minutes per session after template exists.
Prerequisites: Merged WAV from OBS concat evening with concat_ok: true; Audacity 3.x; ffprobe on PATH.
What you will have after one evening
playtest-vod/loudness-spot/folder conventionplaytest_vod_loudness_spot_receipt_v1.jsonpassing A1–A6- BUILD_RECEIPT column
loudness_spot_ok - ffprobe duration + stream proof in receipt
- Audacity screenshot or exported LUFS readout for facilitator README
- Batch script guard: exit non-zero if receipt false
Beginner checkbox (before Audacity depth)
| # | Bad habit | Fix tonight |
|---|---|---|
| 1 | Run Whisper on every merge without listening | 30-second Audacity audition |
| 2 | Ignore ffprobe duration N/A |
A2 fail—re-merge |
| 3 | Boost Discord to “hear better” | Clip kills ASR—re-capture |
| 4 | Tag GitHub issues from empty transcript | Scenario E stop |
| 5 | Skip receipt | File A6 before batch |
Success check: You can hear intelligible speech in Audacity and integrated loudness reads −12 to −16 LUFS on the spot minute.
Evening overview (four blocks)
| Block | Minutes | Output |
|---|---|---|
| A — ffprobe duration | 15–20 | Stream + duration log |
| B — Audacity spot | 20–30 | LUFS screenshot |
| C — Peak + silence scan | 15–20 | Clip / dead-air notes |
| D — Receipt + BUILD_RECEIPT | 20–30 | JSON + loudness_spot_ok |
Run after concat evening, before local Whisper pipeline batch step.
Gates A1–A6 (promotion discipline)
Align with Loudness spot preflight (Guide). Blog = evening path; guide = ninety-second gate.
| Gate | Check | Fail when |
|---|---|---|
| A1 | Merged WAV path exists | Missing file after concat |
| A2 | ffprobe duration > 60 s and audio stream |
N/A duration or no audio |
| A3 | Integrated LUFS −14 ±2 on spot minute | Below −20 or above −8 on speech |
| A4 | Peak < −1 dBFS on speech spot | Clipping / brickwall |
| A5 | Fail-closed batch jq | Whisper runs without loudness_spot_ok |
| A6 | playtest_vod_loudness_spot_receipt_v1.json filed |
Missing before batch |
Promotion rule: whisper_batch_allowed is true only when A1–A6 pass and cousin concat_ok is true on the same build_label and session_id.
Block A — ffprobe duration and stream proof
On the merged WAV:
WAV="playtest-vod/merged/session_2026-12-03_merged.wav"
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"
A2 pass examples:
3724.512000
pcm_s16le,48000,2
A2 fail: duration N/A, zero audio streams, or duration < 60 s when session should be longer—revisit MKV concat help and concat evening.
Log outputs into receipt ffprobe_duration_sec and ffprobe_audio_stream fields.
Block B — Audacity integrated loudness spot
- Open merged WAV in Audacity.
- Select one representative minute with speech (not menu silence).
- Effect → Loudness Normalization (analysis only) or Analyze → Contrast / built-in meter per your Audacity build—record integrated LUFS readout.
- Target band: −14 LUFS ±2 (−12 to −16) for Discord-heavy playtest voice.
- Export screenshot to
playtest-vod/loudness-spot/audacity_lufs_spot_2026-12-03.png.
Pair 14-free LUFS meter tools for alternatives—this tutorial standardizes on Audacity spot for facilitator consistency.
Menu-only minute warning: If the only loud section is game SFX, pick a different timestamp—ASR needs speech.
Block C — Peak and silence scan
| Check | How | Fail signal |
|---|---|---|
| Clip | Audacity waveform flat tops | A4 fail |
| Silence | Waveform flatline > 30 s mid-session | Re-merge wrong track |
| Stereo phantom | One channel empty | Fix OBS source map |
Optional ffmpeg volumedetect on spot minute:
ffmpeg -i "$WAV" -ss 120 -t 60 -af volumedetect -f null - 2>&1 | tee volumedetect_spot.log
Use as secondary evidence—not a replacement for Audacity LUFS spot (A3).
Block D — playtest_vod_loudness_spot_receipt_v1.json
Pin under playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json:
{
"schema": "playtest_vod_loudness_spot_receipt_v1",
"build_label": "december-playtest-2026-rc1",
"session_id": "session_2026-12-03",
"merged_wav_path": "playtest-vod/merged/session_2026-12-03_merged.wav",
"concat_ok_cousin": "release-evidence/playtest-vod/PLAYTEST_VOD_TRIAGE_RECEIPT.json",
"ffprobe_duration_sec": 3724.512,
"ffprobe_audio_stream": "pcm_s16le,48000,2",
"spot_start_sec": 120,
"spot_duration_sec": 60,
"integrated_lufs": -13.8,
"peak_dbfs": -3.2,
"audacity_screenshot": "playtest-vod/loudness-spot/audacity_lufs_spot_2026-12-03.png",
"gates": {
"A1_merged_wav": "pass",
"A2_ffprobe_duration": "pass",
"A3_lufs_band": "pass",
"A4_peak_headroom": "pass",
"A5_fail_closed": "pass",
"A6_receipt": "pass"
},
"loudness_spot_ok": true,
"whisper_batch_allowed": true
}
BUILD_RECEIPT columns
| Column | Example |
|---|---|
loudness_spot_ok |
true |
playtest_vod_loudness_spot_receipt_path |
playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json |
concat_ok |
true (cousin—must match session) |
Lesson 273 forward wires promotion gates; Lesson 250 is VO consent for highlight reels—not playtest merge spot.
A5 — Fail-closed jq (batch script head)
jq -e '.loudness_spot_ok == true' playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json
jq -e '.gates.A3_lufs_band == "pass"' playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json
Abort Whisper batch on non-zero exit—pair Whisper tag extraction scenario E.
Developer path — Tuesday playtest night order
| Step | Artifact | Owner |
|---|---|---|
| 1 | OBS capture + concat | Concat evening |
| 2 | concat_ok receipt |
Facilitator |
| 3 | This loudness spot | Facilitator |
| 4 | Whisper batch | Engineering |
| 5 | Tag map + GitHub issues | Whisper tags blog |
| 6 | Wednesday smoke | Producer |
Do not open GitHub issues from empty transcripts—fix A2–A4 first.
Relationship to concat vs Whisper vs tags
| Artifact | Role |
|---|---|
| This tutorial | One-evening LUFS + duration spot |
| Concat evening | concat_ok merge |
| Local Whisper pipeline | Batch ASR strategy |
| Whisper tags blog | GitHub issue discipline |
| Whisper tag map guide | W1–W6 preflight |
| Help #5 | MKV concat fix |
Common mistakes
- Skipping listen test — LUFS alone misses wrong-language track.
- Spot on menu silence — A3 passes on hum; Whisper still empty on speech sections.
- Running batch on clipped audio — ASR hallucinates; tags invent repro.
concat_okfalse but loudness run anyway — fix merge first.- Confusing VO consent receipt — Lesson 250 is store/highlight lane.
- One global LUFS for whole file — use spot minute representative of speech.
- Filing receipt before ffprobe — A2 values must be observed.
Troubleshooting
| Symptom | Lane |
|---|---|
| Whisper blank, LUFS OK | Wrong audio track—check OBS source |
| LUFS −22, quiet speech | Normalize lightly or re-capture; do not max boost |
| LUFS −6, clipped | A4 fail—re-record Discord |
| ffprobe no audio | Re-merge; concat help |
concat_ok false |
Concat evening—not this receipt |
| CUDA silent, CPU works | Whisper CUDA help |
Worked example — Tuesday merge to Wednesday batch
Scenario: session_2026-12-03_merged.wav has concat_ok: true. Whisper returns empty.
| Step | Action | Result |
|---|---|---|
| 1 | ffprobe duration | 62 min—A2 pass |
| 2 | Audacity spot minute 8:00 | Speech audible |
| 3 | LUFS readout | −13.4—A3 pass |
| 4 | Peak check | −2.8 dBFS—A4 pass |
| 5 | File receipt | loudness_spot_ok: true |
| 6 | Re-run Whisper batch | Transcript populated |
| 7 | Tag extraction | Scenario E cleared |
Lesson learned: Previous batch used game audio bus only—merge was valid, speech was not in the file.
Discord stand-up one-liner (copy/paste)
Merged WAV spot −13.4 LUFS, peak −2.8 dBFS,
loudness_spot_ok=true—Whisper batch cleared forsession_2026-12-03.
Proof table (producer audit)
| Row | Evidence | Pass |
|---|---|---|
| Merged path | A1 | File on disk |
| ffprobe | A2 log | Duration + stream |
| LUFS screenshot | A3 | −14 ±2 |
| Peak | A4 | < −1 dBFS |
| jq gate | A5 | Exit 0 |
| Receipt | A6 | loudness_spot_ok: true |
Seven scenarios (A–G)
| ID | Situation | Correct response |
|---|---|---|
| A | First Whisper batch | Run this spot before ASR |
| B | Empty transcript | Check A2–A4 before CUDA/CPU debug |
| C | concat_ok false |
Concat lane first |
| D | Quiet but not clipped | Accept if A3 band OK; optional light normalize |
| E | Clipped Discord | Re-capture; do not Whisper |
| F | Receipt true, ASR still empty | Model/path lane—not loudness |
| G | Tags from empty transcript | Stop—scenario E in tags blog |
Folder layout
playtest-vod/
merged/
session_2026-12-03_merged.wav
loudness-spot/
PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json
audacity_lufs_spot_2026-12-03.png
volumedetect_spot.log
Batch script guard (sketch)
#!/usr/bin/env bash
set -euo pipefail
RECEIPT="playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json"
jq -e '.loudness_spot_ok == true' "$RECEIPT"
# then invoke whisper batch per local pipeline blog
Pair 15-free Whisper/ffmpeg tools for script templates.
Facilitator README row (copy into playtest pack)
Add beside concat_ok instructions in your facilitator README:
## Loudness spot (before Whisper batch)
1. Confirm `concat_ok: true` on PLAYTEST_VOD_TRIAGE_RECEIPT.json for this session_id.
2. Run ffprobe duration + audio stream (Block A commands).
3. Audacity: spot minute with speech; target −14 LUFS ±2; peak < −1 dBFS.
4. File PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json with loudness_spot_ok: true.
5. Only then run whisper_batch.sh — script exits if receipt false.
This row prevents “Whisper is broken” stand-ups when the merge never contained facilitator voice.
BUILD_RECEIPT row diff (Thursday pairing)
When Thursday row review diffs promotion receipts, include:
| Column | Prior night | Current night | Action if drift |
|---|---|---|---|
concat_ok |
true | false | Re-run concat evening |
loudness_spot_ok |
true | false | Re-spot before batch |
whisper_issue_tag_ok |
true | false | Check scenario E—likely skipped loudness |
build_label |
rc1 |
rc1 |
OK—same label |
Drift on loudness_spot_ok without build_label bump usually means a new merge was batched without re-spotting.
Extended troubleshooting — ASR vs audio vs merge
| Layer | Symptom | First check | Second check |
|---|---|---|---|
| Merge | ffprobe duration N/A |
Concat help | OBS source map |
| Loudness | Whisper empty, waveform visible | A3 LUFS band | Wrong bus (game vs voice) |
| Clip | Whisper garbage words | A4 peak | Discord auto-gain |
| ASR | One clip OK, batch fails | Batch script paths | CUDA fallback help |
| Tags | GitHub 422 invented repro | Tags blog | Scenario E loudness |
Do not tune Whisper model size until A1–A6 are GREEN—model swaps hide bad input.
Tuesday async + Wednesday smoke alignment
Tuesday CSV ingest scopes which bugs to fix before Wednesday smoke. Loudness spot scopes which sessions enter Whisper batch that week. Producer rule:
- P0/P1 rows from CSV ingest → engineering fixes before smoke.
- Sessions with
loudness_spot_ok: false→ excluded from Whisper batch until re-capture or re-merge. - Do not tag GitHub issues from excluded sessions—no transcript, no tags.
Optional CI spot job (GitHub Actions sketch)
Teams storing merges in repo artifacts can automate A2 + jq gate (A3/A4 still benefit from human Audacity spot until you trust volumedetect thresholds):
loudness-spot-gate:
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v4
with:
name: playtest-merged-wav
- name: ffprobe duration gate (A2)
run: |
WAV="playtest-vod/merged/session_merged.wav"
DUR=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$WAV")
awk -v d="$DUR" 'BEGIN { exit !(d+0 > 60) }'
- name: jq receipt gate (A5)
run: jq -e '.loudness_spot_ok == true' playtest-vod/loudness-spot/PLAYTEST_VOD_LOUDNESS_SPOT_RECEIPT.json
Human Audacity screenshot remains A3 evidence for facilitator audits—CI jq is fail-closed backstop only.
Cousin receipt chain (one session_id)
playtest_vod_triage_receipt_v1.json → concat_ok
playtest_vod_loudness_spot_receipt_v1.json → loudness_spot_ok (this evening)
whisper_issue_tag_receipt_v1.json → whisper_issue_tag_ok (after batch)
Lesson 200 documents concat_ok; Lesson 273 forward documents loudness_spot_ok; Lesson 266 forward documents tag receipt—keep session_id aligned across all three paths.
Tools and sibling reads
- OBS concat evening
- Local Whisper pipeline
- Whisper tag extraction
- 14-free LUFS tools
- Tuesday CSV ingest — parallel async lane
- BUILD_RECEIPT beginner
- Official: Audacity manual, ffmpeg ffprobe
Key takeaways
concat_okis not enough—prove speech level before Whisper.- One evening wires ffprobe, Audacity LUFS spot, receipt, and BUILD_RECEIPT column.
- −14 LUFS ±2 on a speech minute is the spot band for Discord playtest voice.
- Fail-closed batch jq prevents empty-transcript tag accidents.
- Whisper tags scenario E depends on this spot.
- Guide preflight holds ninety-second A1–A6; this post holds beginner evening blocks.
- Concat evening must pass first.
- Lesson 250 VO consent is a different lane from playtest merge spot.
- Thursday row review can diff
loudness_spot_okacross nights. - Forward blog #3 GameMaker setlive dry-run when Steam upload is next.
FAQ
Can we use ffmpeg loudnorm instead of Audacity?
Yes for automation—still file receipt with observed LUFS; Audacity remains the beginner spot UI.
Does this replace concat_ok?
No—cousin receipt must be true for the same session_id.
What about cloud Whisper API?
Same spot gate—API cost does not fix silent merges.
How does this relate to Lesson 273?
Lesson 273 promotes playtest_vod_loudness_spot_receipt into BUILD_RECEIPT—run this evening first.
Is −14 LUFS mandatory for fest trailers?
Store trailers use LUFS listicle—playtest spot uses ±2 band around −14 for ASR clarity.
Whisper works on one clip but not merge?
Merge lane—concat + loudness spot before batch.
Conclusion
November playtest merges fail Whisper quietly when speech is clipped, silent, or on the wrong bus. One evening: ffprobe duration, Audacity LUFS spot, peak check, file the receipt, set loudness_spot_ok—then run ASR and tag issues honestly.
Next reads: Loudness spot preflight (Guide), Concat evening, Local Whisper pipeline, Whisper tag extraction, Lesson 273 forward.
Pin the ffprobe + Audacity spot checklist beside your batch script before December playtest volume—not after facilitators blame Whisper.