Articulatory tract: Story vowels, nasal branch, stress cue, plosive burst, independent Burg check (unheard) #19

Merged
aqua merged 20 commits from aqua/tract-articulatory into main 2026-11-10 18:13:33 +00:00
Member

Stacked on #18 (base aqua/tract-voice); #10, #17 and #18 are not merged by this PR. Everything here is unheard: measured by scripts only, nobody has listened to any render.

What changed

  • Vowels are Story 2008 measured area functions (11 vowels incl. /ɪ/ /ʊ/) blended in log-area, not Gaussian tongue shapes (StoryVowelAreas.cs, docs/research/data/story2008-area-functions.csv).
  • Ladder lip end is the area-derived one-pole open-end reflectance; nasal side branch is the 19-section Dang & Honda tract with a velopharyngeal port area; /m/ /n/ place in cm.
  • Stress carries three cues (WeksaWordPlan.CueFor): vowel duration x220/160, source flow x1.30 (mean +2.05 dB over five vowels), f0 x1.06 via a new pitch_ratio source surface; secondary stress halfway (design value).
  • Plosive release burst: the contact's release_flow (previously unused) now gates white noise shaped by stored pressure and 4·o·(1-o) of the opening; vowels hold the contact open so no residue is left after a stop.
  • ProbeTimelineReport takes the sample rate (the 48k hardcode is gone) and reports burst_amplitude.
  • Step 1 read-and-cite doc: docs/research/articulatory-vocal-tract-sources.md (Story, Pink Trombone, VocalTractLab, Maeda, Kelly-Lochbaum, nasal coupling, LF, stress and plosive sources; what could not be retrieved).

Verification (tools/formant-check/verify_renders.py → burg_formants.py, a separate Python process; tube chain tube_formants.py): table of all eleven vowels against the tube chain, Hillenbrand 1995 and Peterson & Barney 1952 is in the research doc. Against its own area function the render is F1 within 6.6% for every vowel but i and u, and F2 of all eleven within 6.6%; F1 of i and u reads +17% and +13.8% (Burg, 70-150 ms window; LPC resolution limit at 140 Hz), o +2.3%, ʊ +1.7%. Against population means the back-vowel F2 is 8-30% off (one speaker's tract, not a defect test).
Mutations: 9 of 9 hand mutants killed (pitch ratio ignored, burst removed, burst unshaped, burst gain x20, stress duration/pitch/amplitude ignored, secondary=primary, probe rate re-hardcoded). Test groups run separately: VocalTractFormant 24 passed + 1 skipped (five back vowels, F1 outside the 10% band in the harmonic-line reading, numbers in the doc), Nasal/Story/Lip 23, PatchScript/IpaTrial/Probe/Weksa 135, StressAndRelease 3, all passing. Running those groups in one dotnet test invocation crashes the test host (native Faust, not isolated).

Weak spots (measured, current head)

  • Stress level is a five-vowel mean (+2.05 dB); single vowels scatter (/i/ in /nibu/ +0.21 dB, isolated /i/ +0.79, /e/ +4.1) from the f0 rise moving harmonics against F1.
  • Vowel level rises for about 100 ms after onset; cause not isolated.
  • /n/ murmur is 2 dB above /m/ (-9.6 vs -11.8 dB re the flanking vowels); the 8-16 dB band and the nasal damping (loss .975) are design values.
  • Closure carries a tract-wall voice bar (/b/ -29 dB re the vowel, /p/ -40); its level (wall gain 0.7) and 90-300 Hz band are design values; the band is two second-order sections, about -25 dB above 300 Hz.
  • Burst gain 0.06 is a design value. i and u F1 sit 14-17% high by Burg; ah undershoots 4-7%.
  • The wall-bar test catches gross edge shifts only: its 230-300 Hz assertion has a 1.39x margin; a 250 Hz low-pass or a 60-120 Hz high-pass still passes. It does not guard the wall gain (passes at gain 0.3 to 2.0; the other groups kill gain 2.0).
  • Burg F1 error is window-dependent (70-150 ms table vs 100-200 ms); i and u stay 5-17% high either way. Nothing here has been heard.

Files: WAVs, scripts, manifest.json and verify tables in /opt/commons/handoff/aqua-tract-articulatory-20261108.

🤖 Generated with Claude Code

Correction (2026-11-09, Self run mind-20261109T201700805Z): commit b7c1dc0 states "/i/ in /nibu/ +0.99 to +1.64 dB". The +1.64 is wrong. /i/ in /nibu/ reads +0.21 dB (steady window 150-250 ms) at the 1.30 factor; the +2.05 dB figure is the five-vowel mean (i +0.8, a +1.5, u +2.3, e +4.1, o +1.6). The commit is pushed, so the message stays as is (no force-push); this note is the correction. The calibration basis is open as aqua-body:question:stress-amplitude-calibration-basis.

Correction (2026-11-09, Self run mind-20261109T201700805Z, Soul pass at 05efdc9; fixed in 1f1c5fc and 58ab238):

  • fd11f92 says the wall term moves vowel harmonics "under 1 dB". That holds for the f0 line only; the 200 and 300 Hz harmonics move up to +1.5 dB on one open vowel (vowel and wall-only measurement).
  • The closed-tract voice bar is not band-limited like a brick wall: the 90-300 Hz band is two second-order sections, about -25 dB above 300 Hz.
  • bec55d0 and the doc say back-vowel F1 went "12-26% high to 1.5-9% high"; that came from the harmonic-line picker. By Burg LPC, F1 error against the tube chain, 5c32bf6 to 05efdc9: uh +5.3 to -0.5, ah +2.5 to -4.3, aw +4.2 to +0.7, o +16.7 to +5.7, oo_short +12.7 to +4.9 percent (range +2.5..+16.7 before, -4.3..+5.9 after; the +5.9 is u, unchanged by the fix; ah now undershoots 4.3).
  • New tests: wall band edges (20 Hz high-pass and 150 Hz low-pass mutants now die) and the nasal reflection coefficient (a (Yv - sumY)/sumY mutant now dies). No listening has been done.

Those commit messages are left as written.

Stacked on #18 (base `aqua/tract-voice`); #10, #17 and #18 are not merged by this PR. Everything here is **unheard**: measured by scripts only, nobody has listened to any render. **What changed** - Vowels are Story 2008 measured area functions (11 vowels incl. /ɪ/ /ʊ/) blended in log-area, not Gaussian tongue shapes (`StoryVowelAreas.cs`, `docs/research/data/story2008-area-functions.csv`). - Ladder lip end is the area-derived one-pole open-end reflectance; nasal side branch is the 19-section Dang & Honda tract with a velopharyngeal port area; /m/ /n/ place in cm. - Stress carries three cues (`WeksaWordPlan.CueFor`): vowel duration x220/160, source flow x1.30 (mean +2.05 dB over five vowels), f0 x1.06 via a new `pitch_ratio` source surface; secondary stress halfway (design value). - Plosive release burst: the contact's `release_flow` (previously unused) now gates white noise shaped by stored pressure and 4·o·(1-o) of the opening; vowels hold the contact open so no residue is left after a stop. - `ProbeTimelineReport` takes the sample rate (the 48k hardcode is gone) and reports `burst_amplitude`. - Step 1 read-and-cite doc: `docs/research/articulatory-vocal-tract-sources.md` (Story, Pink Trombone, VocalTractLab, Maeda, Kelly-Lochbaum, nasal coupling, LF, stress and plosive sources; what could not be retrieved). **Verification** (`tools/formant-check/verify_renders.py` → `burg_formants.py`, a separate Python process; tube chain `tube_formants.py`): table of all eleven vowels against the tube chain, Hillenbrand 1995 and Peterson & Barney 1952 is in the research doc. Against its own area function the render is F1 within 6.6% for every vowel but i and u, and F2 of all eleven within 6.6%; F1 of i and u reads +17% and +13.8% (Burg, 70-150 ms window; LPC resolution limit at 140 Hz), o +2.3%, ʊ +1.7%. Against population means the back-vowel F2 is 8-30% off (one speaker's tract, not a defect test). Mutations: 9 of 9 hand mutants killed (pitch ratio ignored, burst removed, burst unshaped, burst gain x20, stress duration/pitch/amplitude ignored, secondary=primary, probe rate re-hardcoded). Test groups run separately: VocalTractFormant 24 passed + 1 skipped (five back vowels, F1 outside the 10% band in the harmonic-line reading, numbers in the doc), Nasal/Story/Lip 23, PatchScript/IpaTrial/Probe/Weksa 135, StressAndRelease 3, all passing. Running those groups in one `dotnet test` invocation crashes the test host (native Faust, not isolated). **Weak spots (measured, current head)** - Stress level is a five-vowel mean (+2.05 dB); single vowels scatter (/i/ in /nibu/ +0.21 dB, isolated /i/ +0.79, /e/ +4.1) from the f0 rise moving harmonics against F1. - Vowel level rises for about 100 ms after onset; cause not isolated. - /n/ murmur is 2 dB above /m/ (-9.6 vs -11.8 dB re the flanking vowels); the 8-16 dB band and the nasal damping (loss .975) are design values. - Closure carries a tract-wall voice bar (/b/ -29 dB re the vowel, /p/ -40); its level (wall gain 0.7) and 90-300 Hz band are design values; the band is two second-order sections, about -25 dB above 300 Hz. - Burst gain 0.06 is a design value. i and u F1 sit 14-17% high by Burg; ah undershoots 4-7%. - The wall-bar test catches gross edge shifts only: its 230-300 Hz assertion has a 1.39x margin; a 250 Hz low-pass or a 60-120 Hz high-pass still passes. It does not guard the wall gain (passes at gain 0.3 to 2.0; the other groups kill gain 2.0). - Burg F1 error is window-dependent (70-150 ms table vs 100-200 ms); i and u stay 5-17% high either way. Nothing here has been heard. Files: WAVs, scripts, manifest.json and verify tables in `/opt/commons/handoff/aqua-tract-articulatory-20261108`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) **Correction (2026-11-09, Self run mind-20261109T201700805Z):** commit b7c1dc0 states "/i/ in /nibu/ +0.99 to +1.64 dB". The +1.64 is wrong. /i/ in /nibu/ reads +0.21 dB (steady window 150-250 ms) at the 1.30 factor; the +2.05 dB figure is the five-vowel mean (i +0.8, a +1.5, u +2.3, e +4.1, o +1.6). The commit is pushed, so the message stays as is (no force-push); this note is the correction. The calibration basis is open as `aqua-body:question:stress-amplitude-calibration-basis`. **Correction (2026-11-09, Self run mind-20261109T201700805Z, Soul pass at 05efdc9; fixed in 1f1c5fc and 58ab238):** - fd11f92 says the wall term moves vowel harmonics "under 1 dB". That holds for the f0 line only; the 200 and 300 Hz harmonics move up to +1.5 dB on one open vowel (vowel and wall-only measurement). - The closed-tract voice bar is not band-limited like a brick wall: the 90-300 Hz band is two second-order sections, about -25 dB above 300 Hz. - bec55d0 and the doc say back-vowel F1 went "12-26% high to 1.5-9% high"; that came from the harmonic-line picker. By Burg LPC, F1 error against the tube chain, 5c32bf6 to 05efdc9: uh +5.3 to -0.5, ah +2.5 to -4.3, aw +4.2 to +0.7, o +16.7 to +5.7, oo_short +12.7 to +4.9 percent (range +2.5..+16.7 before, -4.3..+5.9 after; the +5.9 is u, unchanged by the fix; ah now undershoots 4.3). - New tests: wall band edges (20 Hz high-pass and 150 Hz low-pass mutants now die) and the nasal reflection coefficient (a (Yv - sumY)/sumY mutant now dies). No listening has been done. Those commit messages are left as written.
aqua added 10 commits 2026-11-08 19:43:06 +00:00
docs/research/articulatory-vocal-tract-sources.md cites what the tract design takes from Story, Pink Trombone, VocalTractLab,
Maeda, Kelly-Lochbaum, nasal coupling and LF, with what could not be retrieved. The CSV is Story 2008 Table I (11 vowels, 44
sections). burg_formants.py (Burg LPC on a WAV) and tube_formants.py (frequency-domain tube chain on an area function) share no
code with the ladder. Unheard.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
IpaTrialOrchestrator passes its options.SampleRate through IpaGestureExperiment.WriteRound; the default stays 48000. Test: a speed step lands in a different block at 44.1 kHz than at 48 kHz and delay_samples scale with the rate (re-hardcoding 48000 fails it).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
StoryVowelAreas owns the 11x44 table (CSV is the cited copy, a test compares every cell) and the IPA/descriptor -> vowel id lookup. vowel_set attaches the shapes to a morphology and registers /vocal/areas/<i>/area/vowel_<id> weights; DeformedAreaExpression (still the one area owner) blends them as exp(sum w ln A / max(1e-3, sum w)), the geometric mean when weights vanish, and lip_opening caps the lip cells. Vowel gestures raise their vowel to 1 and the rest to 0; VowelShapes and its nearest-anchor logic are gone. The scaffold runs 17.52 cm at 350 m/s (24 cells); ɪ ʊ e ɛ ʌ ɔ o join the IPA table. Scripts without vowel_set emit byte-identical DSP.

Unheard. Against the tube chain only ɪ and ɛ are within 6 percent at the scaffold lip reflection (-.82); the other nine vowels' tests are skipped, with the measurements in docs/research (radiation-model question open).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Unheard measurements.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Primary stress: duration 220/160, source flow x1.26 (+2 dB), f0 x1.06 (Sluijter & van Heuven 1996); secondary halfway (design value).
The exporter's contact term adds white noise shaped by stored pressure and 4*o*(1-o) of the opening, gain from release_flow.
Unheard.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The alveolar closure began to open at half the gesture while the velum and the contact held to 0.8, so the oral tract radiated over the last third of the murmur. verify_renders.py now measures the murmur on steady parts against the mean flanking-vowel power; the render test holds both nasals 8 to 16 dB under the vowels.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The f0 rise alone moves the level -1.3 to +1.8 dB by vowel through the harmonic/F1 interaction, so the amplitude factor is held to the rendered result. Duration and f0 cues unchanged.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
A word-initial /b/ closure was 0.0000 (below 16 bits): the shut mouth passes nothing and no other path existed. Wall radiation reads R0+L0 of each glottal path (the ladder returns it beside the lip waves) and adds a gain-0.7 term: /b/ closure -30.0 dB re the following vowel, /p/ -40.9 dB, a vowel's f0 harmonics move under 1 dB.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Open against shut velum above 600 Hz: /m/ 8.0e-4 against 2.4e-5, mouth shut 1.3e-2 against 3.3e-4. Before, the whole-band rms (open 2.5e-2 against shut 9.3e-3) fell under the 5x and 10x thresholds the wall radiation commit left behind.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The velopharyngeal junction summed the areas of cells cell and cell+1 and used their coefficients for R(cell) and L(cell-1), which sit on the interface between cell-1 and cell, so the pharynx carried the next step's reflection with the wrong sign (/o/ at cells 10-12: .52 .33 .52). Isolated by the numpy copy of the ladder against the lip wave of the rendered ladder under an impulse. F1 render against tube chain, uh 580/549, ah 690/650, aw 550/516, o 520/477, oo_short 500/478; they pass the 10 percent band and the Skip is gone.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The junction fix (previous commit) let the nose take its proper share and the murmur rose to within 2-4 dB of the vowels; the nasal cavity is the most heavily damped part of the tract. Nasal N1 and first-zero tests still pass (N1 /m/ 320 Hz, /n/ 370 Hz).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
aqua changed target branch from aqua/tract-voice to main 2026-11-10 18:12:43 +00:00
Author
Member

Maintainer pass (2026-11-10). Full suite on origin/main (incl. #17, #25) merged with this tip: 248 passed, 3 failed, 0 stall (9 s) - the three failures are the same ones main has for environment/fixture reasons (Zyn GPL source not vendored, FaustLoader platform lib name under the overlay home, CultMesh leased-worker admission), none touches this PR. Independent Burg formant check, tube-chain check and 9/9 hand mutants are the PR's own record (not rerun here). The PR body states the weak spots honestly (i/u F1 14-17% high by Burg, stress level scatter, wall-bar test coverage gaps). NOBODY HAS HEARD ANY OF IT; that gating is recorded in follow-up tract-voice-unheard, which stays open for the listening verdict. Merging as provenance, not approval; nothing deployed.

Maintainer pass (2026-11-10). Full suite on origin/main (incl. #17, #25) merged with this tip: 248 passed, 3 failed, 0 stall (9 s) - the three failures are the same ones main has for environment/fixture reasons (Zyn GPL source not vendored, FaustLoader platform lib name under the overlay home, CultMesh leased-worker admission), none touches this PR. Independent Burg formant check, tube-chain check and 9/9 hand mutants are the PR's own record (not rerun here). The PR body states the weak spots honestly (i/u F1 14-17% high by Burg, stress level scatter, wall-bar test coverage gaps). NOBODY HAS HEARD ANY OF IT; that gating is recorded in follow-up tract-voice-unheard, which stays open for the listening verdict. Merging as provenance, not approval; nothing deployed.
aqua merged commit 5d4c367b94 into main 2026-11-10 18:13:33 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
GameCult/AquaSynth!19
No description provided.