Scatter internal acoustic graph nodes
This commit is contained in:
parent
41453199ea
commit
d088580745
7 changed files with 31 additions and 17 deletions
|
|
@ -214,7 +214,7 @@ question is whether graph-authored PT compatibility can beat the current weak
|
|||
|
||||
The parity report now renders the graph lane only. The latest static fixture
|
||||
evidence is useful instead of decorative: open/front/nasal/ma/sibilant/closure
|
||||
cosine is 0.6035/0.6932/0.6814/0.6239/0.3428/0.4135. The useful levers so far
|
||||
cosine is 0.6015/0.6358/0.6851/0.5988/0.3836/0.4606. The useful levers so far
|
||||
are source semantics, radiation impedance, terminal-specific admittance,
|
||||
frication injection, and cutting stale first-frame morphology from generated
|
||||
graph paths.
|
||||
|
|
@ -227,9 +227,10 @@ junction pressure. The generated tract graph also stopped treating the first
|
|||
nasal tube diameter as the velum aperture; velum now owns branch coupling and
|
||||
aperture. Two tempting compensators were cut: raw per-port outgoing coupling
|
||||
made supposedly oral fixtures nearly silent, and lip/beak radiation gain did
|
||||
not restore oral vowel RMS. The remaining issue is moving morphology: static
|
||||
graph fixtures are plausible, but utterance `mama` still fails at -0.0657
|
||||
cosine even with correct RMS.
|
||||
not restore oral vowel RMS. The internal-node scatter fix made unconnected
|
||||
injection/source terminals transmit pressure between adjacent segments instead
|
||||
of acting as dead boundaries; latest utterance cosine is `mama` 0.3365, `papa`
|
||||
0.8264, and `thrombosis` 0.3874.
|
||||
|
||||
Frication also had a low-level ownership bug: generated graph `TurbulenceJet`
|
||||
ports were using burst as source pressure, so sustained sibilants were choked
|
||||
|
|
|
|||
|
|
@ -153,13 +153,14 @@ Trombone anatomy:
|
|||
writes listening WAV/report artifacts under
|
||||
`artifacts/parity/pink-trombone-logmel/`, and reports only the graph lane.
|
||||
- Latest static graph fixture evidence after cutting the old parity lane:
|
||||
open vowel cosine 0.6035, front vowel 0.6932, nasal 0.6814,
|
||||
bilabial-nasal-ma 0.6239, sibilant 0.3428, closure-release 0.4135.
|
||||
open vowel cosine 0.6015, front vowel 0.6358, nasal 0.6851,
|
||||
bilabial-nasal-ma 0.5988, sibilant 0.3836, closure-release 0.4606.
|
||||
- Latest graph utterance smoke evidence:
|
||||
`mama` cosine -0.0657 / RMS 1.0484, `papa` 0.8253 / 0.8651,
|
||||
`thrombosis` 0.2533 / 3.2917 under
|
||||
`artifacts/parity/pink-trombone-utterance-logmel/20260526T225509931`.
|
||||
This is not good enough speech parity; it is the honest graph-only baseline.
|
||||
`mama` cosine 0.3365 / RMS 1.2421, `papa` 0.8264 / 0.3149,
|
||||
`thrombosis` 0.3874 / 2.0519 under
|
||||
`artifacts/parity/pink-trombone-utterance-logmel/20260526T230028874`.
|
||||
This is still not final speech parity; it is the first honest graph-only
|
||||
moving-utterance rung.
|
||||
- `tools/vocal-tract-playground` exposes the same control surface for fast
|
||||
knob-twiddling through a small WebAudio witness.
|
||||
- `PinkTromboneReferenceDeclaresMissingWaveguideAuthority` prevents graph
|
||||
|
|
|
|||
|
|
@ -735,7 +735,18 @@ public static class FaustEmitter
|
|||
|
||||
var sourceInjection = NodeSourceExpression(name, node, sources);
|
||||
var reflection = $"{name}_graph_node_reflection_{node.Name}";
|
||||
foreach (var port in ports)
|
||||
if (ports.Count > 1)
|
||||
{
|
||||
var nodePressure = $"{name}_graph_node_pressure_{node.Name}";
|
||||
source.AppendLine($" {nodePressure} = 2.0 * ({string.Join(" + ", ports.Select(port => GraphIncoming(name, port)))}) / {F(ports.Count)};");
|
||||
foreach (var port in ports)
|
||||
{
|
||||
var outgoing = GraphOutgoing(name, port);
|
||||
var incoming = GraphIncoming(name, port);
|
||||
source.AppendLine($" {outgoing} = ({nodePressure} - {incoming}) * (1.0 - min(0.98, abs({reflection}))) + {incoming} * {reflection} + ({sourceInjection}) / {F(ports.Count)};");
|
||||
}
|
||||
}
|
||||
else foreach (var port in ports)
|
||||
{
|
||||
var outgoing = GraphOutgoing(name, port);
|
||||
var incoming = GraphIncoming(name, port);
|
||||
|
|
|
|||
|
|
@ -122,7 +122,7 @@ public static class PinkTromboneParityFixtures
|
|||
{
|
||||
return
|
||||
$$"""
|
||||
patch gain=0.028 soft_clip=true
|
||||
patch gain=0.02 soft_clip=true
|
||||
|
||||
tract_shape
|
||||
name=human
|
||||
|
|
|
|||
|
|
@ -165,3 +165,4 @@
|
|||
{"evidence":"Focused tests PinkTromboneAcceptedUtterancesReportWaveguideLogMelParityWhenFaustIsInstalled and PinkTromboneUtteranceFixturesWriteReferenceWavs passed. Latest artifact artifacts/parity/pink-trombone-utterance-logmel/20260526T214946598: mama cosine 0.7211 RMS 0.9995; papa cosine 0.8559 RMS 0.9864; thrombosis cosine 0.5736 RMS 1.0021.","claim":"Lulek was cut from PT utterance parity after listening rejected its control sketch. The accepted curriculum is mama, papa, and thrombosis. The new utterance parity harness lowers PT control points into Faust age curves over ordinary /pink parameters and compares continuous Aqua waveguide renders against the source-ported PT renderer. Level drive and utterance envelope timing were the two major golf cuts.","timestamp":"2026-05-26T22:50:52+01:00","topic":"pink-trombone-accepted-utterance-logmel"}
|
||||
{"evidence":"Focused tests PinkTromboneFixturesReportLogMelParityWhenFaustIsInstalled, PinkTromboneAcceptedUtterancesReportWaveguideLogMelParityWhenFaustIsInstalled, and PinkTromboneUtteranceFixturesWriteReferenceWavs passed with disabled build servers. Latest accepted utterance artifact artifacts/parity/pink-trombone-utterance-logmel/20260526T222603297: mama cosine 0.7098 RMS 1.0177; papa 0.8545 RMS 1.0043; thrombosis 0.5729 RMS 1.0186.","claim":"Listening described the Aqua PT utterance candidate as trying with a mouth full of cotton. The accepted waveguide lane now adds a small high-passed lip-radiation emphasis after the bidirectional tube output, keeping gross log-mel similarity stable while adding edge to the radiated signal. Static graph fixture gain was reduced because source-ported PT references exposed the old graph lane as over-loud; graph remains pressure, not the accepted moving-utterance lane.","timestamp":"2026-05-26T23:27:15+01:00","topic":"pink-trombone-cotton-mouth-radiation"}
|
||||
{"evidence":"Cut `PinkTromboneParityFixture.GraphAquaScript` and the accepted waveguide utterance test; PT parity tests now render graph candidates only. Focused tests passed with disabled build servers. Latest static graph artifact artifacts/parity/pink-trombone-logmel/20260526T225434227 reports open/front/nasal/ma/sibilant/closure cosine 0.6035/0.6932/0.6814/0.6239/0.3428/0.4135. Latest graph-only utterance artifact artifacts/parity/pink-trombone-utterance-logmel/20260526T225509931 reports mama cosine -0.0657 RMS 1.0484; papa 0.8253 RMS 0.8651; thrombosis 0.2533 RMS 3.2917.","claim":"PT accepted parity must exercise the typed acoustic graph, not the old waveguide path. Generated tract graphs now mirror live tract parameter bindings into acoustic records, use rest morphology instead of baking the first utterance frame into the path, treat velum as branch aperture/coupling rather than nasal tube sample area, and radiate a raw/high-passed pressure blend. Mama remains a concrete graph-parity failure; the next coherent cut is live segment-area modulation and graph-native closure/transient ownership.","timestamp":"2026-05-26T23:50:00+01:00","topic":"pink-trombone-graph-only-parity"}
|
||||
{"evidence":"After adding ordinary internal-node scatter, focused graph parity tests passed. Latest static graph artifact artifacts/parity/pink-trombone-logmel/20260526T225955955 reports open/front/nasal/ma/sibilant/closure cosine 0.6015/0.6358/0.6851/0.5988/0.3836/0.4606. Latest graph utterance artifact artifacts/parity/pink-trombone-utterance-logmel/20260526T230028874 reports mama cosine 0.3365 RMS 1.2421; papa 0.8264 RMS 0.3149; thrombosis 0.3874 RMS 2.0519.","claim":"Internal source/injection terminals in the acoustic graph must transmit pressure between adjacent path segments unless an explicit connection or boundary law says otherwise. Treating an unconnected internal terminal as independent reflective boundaries split the tract and made moving utterances fail. Ordinary multi-port graph nodes now scatter incident pressure across ports, which moved mama from negative cosine to a usable graph-only smoke rung.","timestamp":"2026-05-26T23:02:00+00:00","topic":"acoustic-graph-internal-node-scatter"}
|
||||
|
|
|
|||
|
|
@ -119,8 +119,8 @@ live_invariants:
|
|||
- The physical voice research packet now includes a practical implementation/researcher map (`research/physical-voice-modeling/PEOPLE.md`) and talk/transcript ledger (`research/physical-voice-modeling/talks/TALKS.md`). Birkholz/VocalTractLab pressures multi-level articulatory control and gestures; Story/TubeTalker pressures continuous parametric area functions and length/coupling; Smith pressures bidirectional delay-line scattering and fractional-delay waveguides; Fels/ArtiSynth pressures separation between biomechanics, acoustics, timeline controls, and diagnostics. These are reusable DSL semantics, not modules to clone.
|
||||
- Physical voice implementation has started moving PT pressure into neutral acoustic owners: `AcousticPath`, `AcousticTerminal`, `AcousticConnection`, `AcousticSourcePort`, `AcousticBranch`, `AcousticRadiationPort`, `WaveClockPolicy`, and `AcousticPortNetwork`. Parser commands `path`, `terminal`, `connect`, `source_port`, `branch`, `radiation_port`, `wave_clock`, and `acoustic_network` now exist. Existing `tract_shape`, `glottis`, `tract_injection`, `nasal_branch`, and `tract` commands populate acoustic records as compatibility aliases while the current `Voice.Tract` Faust renderer still owns audio.
|
||||
- `acoustic` / `acoustic_voice` can now render an `AcousticPortNetwork` through a compact Faust response proxy or, when typed terminals are present, a compiled bidirectional Faust segment graph. Graph lowering splits paths at terminal positions, aggregates co-located terminals into graph nodes, orders connection ports deterministically, scatters area-weighted/pressure/bypass connection groups, injects source terminals even at connected nodes, and sums radiation terminals. Segment delay follows physical segment length and the network `wave_clock` strategy through unit-grid, half-sample, linear fractional, Lagrange, or Thiran/allpass Faust delay primitives. Source, branch, radiation, terminal, and connection controls can bind through ordinary Aqua parameters into emitted Faust. PT-shaped `tract` authoring now routes accepted parity through `propagation=graph`; the old waveguide parity lane is not a comparison baseline or historical pressure lane.
|
||||
- Pink Trombone log-mel parity now writes graph candidates only. Generated tract graphs mirror live `/pink/...` tract bindings into acoustic source, terminal, connection, and radiation fields. Graph generation stopped baking first-frame tongue/constriction/lip morphology into the path; the authored rest path is the compiled tube until live segment-area modulation exists. Velum owns nasal branch coupling/aperture, and the first nasal tube sample is no longer allowed to decide the velum opening. Graph radiation now blends raw pressure with high-passed pressure instead of throwing away body energy. Latest static graph evidence: open/front/nasal/ma/sibilant/closure cosine 0.6035/0.6932/0.6814/0.6239/0.3428/0.4135.
|
||||
- PT expressive parity should decompose into reusable Aqua primitives before audio golf: `tract_shape` owns continuous diameter/area geometry over normalized position, physical length (`length_cm`), interpolation/resampling, derived reflection coefficients, and per-cell acoustic delay; `glottis` owns excitation controls; `tract_injection` owns positioned frication/burst controls; `nasal_branch` owns a second diameter/area tube and branch aperture; `tract_motion` owns control slew and obstruction threshold; `AcousticPortNetwork` owns graph lowering. `PinkTromboneReferenceRenderer` ports the pinned MIT `chdh/pink-trombone-mod` DSP source (`external/pink-trombone-mod` at 359c2d3b42b10280404c1650dc601902112b4c90), and reference WAVs before `artifacts/parity/pink-trombone-utterances/20260526T211902375` are invalid. The accepted PT utterance curriculum is mama, papa, and thrombosis; lulek was cut because its control sketch taught a bad artifact. Latest graph-only utterance smoke under `artifacts/parity/pink-trombone-utterance-logmel/20260526T225509931`: mama cosine -0.0657 / RMS 1.0484, papa 0.8253 / 0.8651, thrombosis 0.2533 / 3.2917. This is not sufficient speech parity; next pressure is live graph segment-area modulation and graph-native closure/transient ownership, not reviving the old PT-shaped waveguide path.
|
||||
- Pink Trombone log-mel parity now writes graph candidates only. Generated tract graphs mirror live `/pink/...` tract bindings into acoustic source, terminal, connection, and radiation fields. Graph generation stopped baking first-frame tongue/constriction/lip morphology into the path; the authored rest path is the compiled tube until live segment-area modulation exists. Velum owns nasal branch coupling/aperture, and the first nasal tube sample is no longer allowed to decide the velum opening. Graph radiation now blends raw pressure with high-passed pressure instead of throwing away body energy. Latest static graph evidence: open/front/nasal/ma/sibilant/closure cosine 0.6015/0.6358/0.6851/0.5988/0.3836/0.4606.
|
||||
- PT expressive parity should decompose into reusable Aqua primitives before audio golf: `tract_shape` owns continuous diameter/area geometry over normalized position, physical length (`length_cm`), interpolation/resampling, derived reflection coefficients, and per-cell acoustic delay; `glottis` owns excitation controls; `tract_injection` owns positioned frication/burst controls; `nasal_branch` owns a second diameter/area tube and branch aperture; `tract_motion` owns control slew and obstruction threshold; `AcousticPortNetwork` owns graph lowering. `PinkTromboneReferenceRenderer` ports the pinned MIT `chdh/pink-trombone-mod` DSP source (`external/pink-trombone-mod` at 359c2d3b42b10280404c1650dc601902112b4c90), and reference WAVs before `artifacts/parity/pink-trombone-utterances/20260526T211902375` are invalid. The accepted PT utterance curriculum is mama, papa, and thrombosis; lulek was cut because its control sketch taught a bad artifact. Latest graph-only utterance smoke under `artifacts/parity/pink-trombone-utterance-logmel/20260526T230028874`: mama cosine 0.3365 / RMS 1.2421, papa 0.8264 / 0.3149, thrombosis 0.3874 / 2.0519. The internal-node scatter fix made unconnected injection/source terminals transmit pressure between adjacent segments instead of acting as dead boundaries. Next pressure is live graph segment-area modulation and graph-native closure/transient ownership, not reviving the old PT-shaped waveguide path.
|
||||
- If dotnet builds hang in this workspace, stop orphan dotnet workers and retry with `--disable-build-servers -p:UseSharedCompilation=false -p:BuildInParallel=false`; plain parallel/shared builds can stall without useful diagnostics.
|
||||
- eSpeak NG is an early parity reference for timing, IPA coverage, and log-mel pressure, not an anatomy oracle or final target.
|
||||
- Do not expand into prosody, emotional context, personality, or broad Weksa expressivity until the tiny IPA utterance harness can show useful loss movement.
|
||||
|
|
|
|||
|
|
@ -18,9 +18,9 @@ public sealed class PinkTromboneLogMelParityTests
|
|||
private static readonly string[] UtteranceParityIds = ["mama", "papa", "thrombosis"];
|
||||
private static readonly IReadOnlyDictionary<string, float> UtteranceGraphSmokeCosineFloors = new Dictionary<string, float>
|
||||
{
|
||||
["mama"] = -0.08f,
|
||||
["mama"] = 0.3f,
|
||||
["papa"] = 0.8f,
|
||||
["thrombosis"] = 0.2f
|
||||
["thrombosis"] = 0.35f
|
||||
};
|
||||
|
||||
[Fact]
|
||||
|
|
@ -213,7 +213,7 @@ public sealed class PinkTromboneLogMelParityTests
|
|||
|
||||
private static string UtteranceGraphScript(PinkTromboneUtteranceFixture fixture) =>
|
||||
$$"""
|
||||
patch gain=0.55 soft_clip=true
|
||||
patch gain=0.2 soft_clip=true
|
||||
|
||||
param name=frequency path=/pink/frequency default={{F(fixture.ControlPoints[0].Controls.Frequency)}} min=10 max=600 step=0.01 unit=Hz rate=audio
|
||||
param name=intensity path=/pink/intensity default={{F(fixture.ControlPoints[0].Controls.Intensity)}} min=0 max=1 step=0.001
|
||||
|
|
|
|||
Loading…
Reference in a new issue