Skip to content

VOICE_V12 spike evaluation worksheet (T-118)

Status: complete — GO, recipe locked (2026-07-03). Round 1 passed class identity and pacing but heard the markers as a separate percussive pre-beat and preferred the conservative ambiguity policy; the recipe was retuned (fused attack ramps, softer mixes, FallBackToOther). Round 2 confirmed by ear: the mark now fuses into the word and the softened gain sounds right. The locked recipe below is what the ship tasks (T-119…T-127) implement.

Locked recipe (the T-118 output — target constants for the ship tasks)

  • Marking scope: word-initial content nouns/verbs only; continuations and function words never marked.
  • Ambiguity policy: conservative — noun/verb-ambiguous lemmas fall back to Other (by-ear A/B winner). Closed-class words are simply absent from the table.
  • Noun marker: broadband click/pop splash + 620 Hz thud; partials {1670, 2390, 3110, 3970, 4830, 5660, 6420} Hz; window 30 ms; quadratic attack ramp 8 ms (fuses with the body's 15 ms bloom); mix 0.10.
  • Verb marker: dual-sine up-swept chirp, 1400→3600 Hz and 2050→5150 Hz; window 50 ms; attack fraction 0.25; mix 0.09.
  • Compound silhouette: uniform stem → resolution (2 syllables), target max(subword_count, 2) capped at 3; per-syllable compound duration scale 0.62.
  • Noun settle transform: pitch −0.28; vowel ×0.35 + 0.65 (toward oo); contour ×0.15; warble ×0.5.
  • Verb push transform: pitch +0.18; vowel ×0.35 − 0.65 (toward ee); contour 0.70 + 0.30×stem; warble 0.6×stem + 0.25.
  • POS source & storage: sidecar baked class table (research §9.1), entries ranked by a pinned coding-domain corpus snapshot, keyed by lemma with an explicit inflection rule (the spike's surface-form-only matching is a known gap); source + corpus pinned in assets/source_manifest.toml (T-120).

Round-1 outcomes (by ear, 2026-07-03)

#QuestionVerdictAction taken
1FusionFail — read as a separate pre-beatMarkers now bloom with the tonal body: noun gets an 8 ms quadratic attack ramp + wider 30 ms window; verb attack fraction 0.12 → 0.25.
2Class identityPass — noun vs verb tellable
3PacePass — still breathesCOMPOUND_SYLLABLE_DURATION_SCALE stays 0.62.
4Ambiguity A/BConservative preferredSPIKE_AMBIGUITY_POLICY locked to FallBackToOther; build/fix/run/update/sync/… stay unmarked blips.
5Marker severityToo percussive/severe (though marked = easier to parse)Mixes dialed back: noun 0.16 → 0.10, verb 0.14 → 0.09 (still ≳2× the 0.04 soft transient).

Round-2 renders (*-v2.wav in target/spike-v12/): a-bug-marked-v2, a-run-marked-v2, b-fix-the-bug-marked-v2 (note: fix is now unmarked under the conservative policy — only bug carries a mark), and d-content-heavy-v2 ("verify the release and deploy the server", two unambiguous verbs + one unambiguous noun). Taxonomy still separates the retuned pair: bug = flat tonal blip, run = rising chirp (+9.2 st).

How to reproduce the renders

Historical note: the commands below date from the spike, when the class behavior sat behind the spike-noun-verb cargo feature. The T-127 freeze removed the gate — VOICE_V12 is now the active voice, so a plain cargo run -p dootdoot renders marked audio and the --features flags no longer exist.

The spike was behind the default-off spike-noun-verb cargo feature (a local compile-time gate, not a user-facing voice). Evaluation WAVs land in target/spike-v12/:

bash
# Marked legs (gate on)
cargo run -p dootdoot --features spike-noun-verb -- "bug" -o target/spike-v12/a-bug-marked.wav
cargo run -p dootdoot --features spike-noun-verb -- "run" -o target/spike-v12/a-run-marked.wav
cargo run -p dootdoot --features spike-noun-verb -- "fix the bug" -o target/spike-v12/b-fix-the-bug-marked.wav
cargo run -p dootdoot --features spike-noun-verb -- "sync the build and run the update" -o target/spike-v12/c-ambiguous-dominant.wav

# VOICE_V11 baselines (gate off): same commands without --features.
# Conservative-ambiguity leg: flip SPIKE_AMBIGUITY_POLICY in
# dootdoot-core/src/pos_class.rs to FallBackToOther, rebuild, re-render leg c.

The research doc's canonical pairs (dog vs run, the cat sits) are swapped for coding-domain pairs (bug vs run, fix the bug) because the spike lexicon is domain-weighted per research §5.1; dog/cat/sits are not in it. Note the spike matches surface forms only (no lemmatization): fails, bugs, running classify Other unless WordPiece happens to split them onto a lexicon stem. The baked table (T-120) should rank lemmas and decide inflection handling explicitly.

Automated results (2026-07-03)

Minimal pair separates on category, not just pitch

scripts/sound_taxonomy.py on the marked minimal pair:

renderlabelcontourtonalityrangeonsets
bug (noun)blipflattonal1.2 st0
run (verb)rising-whistlewide-sweepmixed34.9 st2

The two classes land in different gesture categories on onset count, contour class, and tonality — exactly the P6 cross-category separation the recipe targets. In fix the bug, the verb-initial word reads as a 2-onset rising chirp and the noun-final word as a chirp-down → settled blip pair (the stem→settle silhouette).

Pacing guardrail held

scripts/acoustic_metrics.py, fix the bug marked vs VOICE_V11 baseline: identical island structure (3 islands, median 174 ms, max gap 35 ms), duration +7% (0.71 s → 0.76 s), onset rate 8.4 → 9.2 Hz, crest 19.0 → 23.7 dB. The compound scale (0.62) keeps the phrase pace; the markers add attack energy rather than length. A marked single word runs ~1.25× its VOICE_V11 length (stem + resolution at 0.62 each). Against the BB-8 reference clip the marked render stays in-family on harmonicity (0.81 vs 0.85) and active fraction (0.77 vs 0.63).

Ambiguity policy: the conservative rule unmarks the whole phrase

On sync the build and run the update — all four content words are ambiguous lemmas — the conservative leg renders byte-identical to the VOICE_V11 baseline (nothing marked at all), while the dominant leg carries 11 gesture events vs the baseline's 7. This confirms research §5.1 finding 3 at full strength: fall-back-to-Other silences the marking system on exactly the register it was built for. Unless the by-ear session finds dominant-class marking actively misleading, dominant-class is the presumptive policy.

By-ear checklist (the human half of T-118)

  1. Fusion — in a-*-marked.wav, does the mark fuse into the word's attack (one object) or read as a separate pre-beat? (T-116 acceptance.)
  2. Class identity — with eyes closed, can you tell bug from run by onset flavor (click/pop vs up-chirp) and silhouette (settle vs push)?
  3. Pace — does b-fix-the-bug-marked.wav still breathe like VOICE_V11, or do compound words drag? (T-117 acceptance; tune COMPOUND_SYLLABLE_DURATION_SCALE.)
  4. Ambiguity A/Bc-ambiguous-dominant.wav vs c-ambiguous-conservative.wav: is consistently-marked-but-sometimes-wrong more learnable than mostly-unmarked?
  5. Marker gain — are NOUN_MARKER_MIX (0.16) / VERB_MARKER_MIX (0.14) bold enough to cue class without reading as percussion? (Research §9.3: start bold, dial back.)

Decisions to lock before T-119 (research §9)

#DecisionSpike setting (starting point)Locked value
1POS source & storagehard-coded lexicon; ship = sidecar baked table, coding-domain-rankedtbd at T-119/T-120
2Marker aggressivenessword-initial content nouns/verbs onlylocked: word-initial content only (round 1 #2 passed)
3Foley boldnessmixes 0.16 / 0.14 (vs 0.04 soft transient)locked: 0.10 / 0.09 + fused attack ramps (round 2 passed)
4Syllable count & pacinguniform 2 syllables, cap 3; compound scale 0.62locked: uniform 2, cap 3, scale 0.62 (round 1 #3 passed)
5Aspect markingout of scope (VOICE_V13)
6Ambiguity policydominant-class (A/B'd; conservative leg = silent on coding text)locked: conservative / fall-back-to-Other (round 1 #4)

Go/no-go: GO — round 1: classes tellable, pace holds, marked renders easier to parse; round 2: the mark fuses into the word and the softened gain sounds right.

Independent open-source droid acoustics. Not affiliated with Lucasfilm or Disney.