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

2026-11-09

Aqua
Nasal path carries its damping (loss .997 to .975 per cell, about 380 Hz bandwidth): murmur /m/ -4.2 to -11.8 dB, /n/ -2.2 to -9.6 dB re the flanking vowels
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>
2026-11-09 14:30:02 +00:00
Aqua
Nasal junction scatters on its own interface (cells 10 and 11, not 11 and 12): back-vowel F1 12-26% high becomes 1.5-9% high; five skipped tests run
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>
2026-11-09 13:40:42 +00:00
Aqua
Closed-mouth nose tests read above 600 Hz: the tract wall now radiates a voice bar below 300 Hz with the mouth and the velum shut
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>
2026-11-09 13:40:42 +00:00
Aqua
Tract wall radiation: the first-cell pressure, band-limited to 90-300 Hz, radiates through the wall; a voiced closure carries a voice bar
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>
2026-11-09 13:27:49 +00:00
Aqua
Stress amplitude cue 1.26 to 1.30 (secondary 1.14): rendered primary stress +1.7 to +2.0 dB mean over five vowels, /i/ in /nibu/ +0.99 to +1.64 dB
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>
2026-11-09 12:58:59 +00:00
Aqua
Nasal stops hold their oral closure to 0.8 of the gesture: /n/ murmur -3.8 to -8.8 dB re the flanking vowels (/m/ -12.8)
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>
2026-11-09 12:50:59 +00:00

2026-11-08

Aqua
Stress carries duration, amplitude and f0 (source pitch_ratio surface); plosive release burst from contact release_flow; vowels open the contact
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>
2026-11-08 19:25:02 +00:00
Aqua
Research note: the missing F2 of rounded back vowels is damped, not absent (Burg finds the pole the harmonic-line reading misses)
Unheard measurements.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-08 17:42:33 +00:00
Aqua
Vowels are Story 2008 measured area functions blended in log-area, not Gaussian tongue deformations from a grid-searched table
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>
2026-11-08 17:37:14 +00:00
Aqua
ProbeTimelineReport takes the sample rate instead of hardcoding 48000: block times and delay_samples follow the rate the caller renders at
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>
2026-11-08 17:35:18 +00:00
Aqua
Articulatory tract sources, Story 2008 vowel area functions as data, independent formant estimators
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>
2026-11-08 16:13:29 +00:00