diff --git a/README.md b/README.md index 7f71103..c5d4040 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,12 @@ See [Flavored English Lowering](./docs/flavored-english-lowering.md) for the first lowering target: interlingua projected through agent state into English dialogue. +For the first AquaSynth speech-training handoff, see +[Tiny PanPhon v0.1 Speech Curriculum](./examples/speech-training/tiny-panphon-v0.1/README.md). +Those packets are emitted by `tools/emit_tiny_panphon_handoffs.py` and provide +the crawl-stage artifact for simple IPA sounds before Weksa grows broader +pronunciation coverage. + ## Implementation Status No runtime language has been selected yet. The first committed artifact is the diff --git a/docs/utterance-embedding.md b/docs/utterance-embedding.md index 08f6cf1..15d86ce 100644 --- a/docs/utterance-embedding.md +++ b/docs/utterance-embedding.md @@ -81,6 +81,15 @@ semantics and phonetic realization are separate witnesses. For pure IPA or alien phonetic fixtures, the text embedding may be zero or point to the source meaning packet while `panphon_sequence` carries the sound-shape evidence. +The first emitted training artifact is +`examples/speech-training/tiny-panphon-v0.1/batch.json`. It contains six pure +IPA seed packets (`a`, `pa`, `ta`, `ka`, `sa`, and `ma`) with zeroed semantic +text embeddings, inline PanPhon-style feature frames, deterministic +prosody/emphasis hints, and the Epiphany-compatible neutral 64-slot character +state vector. The AquaSynth-owned learned fields are present but marked +pending, so training can begin from a real Weksa artifact without pretending +Weksa owns the optimizer. + ```yaml schema_version: weksa.utterance_embedding_handoff.v0.1 source_output_ref: @@ -98,11 +107,6 @@ inputs: source: ipa: frames_ref: -phonetic_realization_embedding: - owner: AquaSynth - model_id: aquasynth.panphon_sequence_encoder.v0.1 - dimensionality: 256 - values_ref: prosody_emphasis_hints: dimensionality: 32 values: @@ -110,6 +114,11 @@ phonetic_realization_embedding: source: dimensionality: 64 values_ref: +phonetic_realization_embedding: + owner: AquaSynth + model_id: aquasynth.panphon_sequence_encoder.v0.1 + dimensionality: 256 + values_ref: utterance_embedding: owner: AquaSynth model_id: @@ -213,12 +222,15 @@ First loop: 2. Project Ghostlight/Epiphany-shaped character context. 3. Lower to English. 4. Generate or attach a speech text embedding when the line has text semantics. -5. Emit or attach a phonetic realization vector from pronunciation/IPA evidence. +5. Emit PanPhon sequence evidence from pronunciation/IPA material. 6. Emit prosody/emphasis hints and a projected character state vector. -7. Human-review whether the line preserves meaning, pronunciation, and voice. -8. AquaSynth trains the utterance embedding encoder. -9. AquaSynth feeds the utterance embedding to the synth driver. -10. Compare rendered speech against human notes and reference takes when present. +7. AquaSynth trains or applies the phonetic sequence encoder to produce the + 256-float phonetic realization embedding. +8. Human-review whether the line preserves meaning, pronunciation, and voice. +9. AquaSynth trains the utterance embedding encoder. +10. AquaSynth feeds the utterance embedding to the synth driver. +11. Compare rendered speech against human notes and reference takes when + present. The same fixture can carry accepted lines, rejected lines, audit projections, input vectors, downstream AquaSynth evaluation pointers, and notes about why a diff --git a/examples/speech-training/tiny-panphon-v0.1/README.md b/examples/speech-training/tiny-panphon-v0.1/README.md new file mode 100644 index 0000000..5f1c772 --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/README.md @@ -0,0 +1,30 @@ +# Tiny PanPhon v0.1 Speech Curriculum + +This directory is the first executable Weksa-to-AquaSynth speech handoff +artifact. + +It is intentionally small: six pure IPA packets for `a`, `pa`, `ta`, `ka`, +`sa`, and `ma`. Each packet uses +`weksa.utterance_embedding_handoff.v0.1` and carries: + +- a 1024-float semantic text embedding reference, zeroed because these are pure + IPA fixtures; +- an inline variable-length PanPhon-style feature sequence; +- 32 Weksa-owned prosody/emphasis hints; +- a 64-float Epiphany-compatible neutral character-state vector reference; +- pending AquaSynth-owned 256-float phonetic realization and 64-float + utterance embedding lanes. + +The emitter is [tools/emit_tiny_panphon_handoffs.py](../../../tools/emit_tiny_panphon_handoffs.py). +It uses only the Python standard library and does not define a Weksa runtime. + +Run it from the Weksa repo root: + +```powershell +& 'C:\Users\Meta\.cache\codex-runtimes\codex-primary-runtime\dependencies\python\python.exe' tools\emit_tiny_panphon_handoffs.py +``` + +`batch.json` is the training entrypoint for AquaSynth. The individual packet +files are stable seed fixtures; the PanPhon feature values are hand-authored +for this six-phone crawl stage and should be regenerated from the canonical +PanPhon library before Weksa expands coverage. diff --git a/examples/speech-training/tiny-panphon-v0.1/alveolar-ta.json b/examples/speech-training/tiny-panphon-v0.1/alveolar-ta.json new file mode 100644 index 0000000..56223ab --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/alveolar-ta.json @@ -0,0 +1,249 @@ +{ + "schema_version": "weksa.utterance_embedding_handoff.v0.1", + "packet_id": "tiny-panphon-v0.1/alveolar-ta", + "source_output_ref": "examples/speech-training/tiny-panphon-v0.1/README.md", + "speaker_agent_id": "neutral-human-baseline", + "text": { + "spoken_text": "ta", + "normalized_text": "ta", + "channel_note": "Pure IPA curriculum seed; semantic text embedding is intentionally zero." + }, + "inputs": { + "speech_text_embedding": { + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values_ref": "vectors/zero-semantic-1024.json" + }, + "panphon_sequence": { + "model_id": "panphon-style.v0.1.seed", + "source": "hand-authored seed phones for AquaSynth crawl-stage parity tests", + "ipa": "ta", + "feature_order": [ + "syl", + "son", + "cons", + "cont", + "delrel", + "lat", + "nas", + "strid", + "voi", + "sg", + "cg", + "ant", + "cor", + "distr", + "lab", + "hi", + "lo", + "back", + "round", + "velaric", + "tense", + "long" + ], + "frames": [ + { + "index": 0, + "phone": "t", + "features": [ + -1.0, + -1.0, + 1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "markers": { + "stress": 0.0, + "length": 0.0, + "tone": 0.0, + "boundary": 0.0, + "duration_ms": 95 + } + }, + { + "index": 1, + "phone": "a", + "features": [ + 1.0, + 1.0, + -1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -1.0, + 0.0, + -1.0, + 0.0 + ], + "markers": { + "stress": 1.0, + "length": 0.0, + "tone": 0.0, + "boundary": 1.0, + "duration_ms": 180 + } + } + ] + }, + "prosody_emphasis_hints": { + "dimensionality": 32, + "labels": [ + "mean_pitch_pressure", + "pitch_rise", + "pitch_fall", + "pitch_range", + "loudness_pressure", + "loudness_attack", + "loudness_release", + "speaking_rate", + "articulation_precision", + "pause_pressure", + "phrase_final_lengthening", + "stress_contrast", + "clippedness", + "breathiness", + "creak_pressure", + "smoothness", + "warmth", + "threat", + "urgency", + "hesitation", + "irony_dryness", + "tenderness", + "contempt", + "command_force", + "question_contour", + "exclamation_pressure", + "secrecy_low_projection", + "ritual_formality_pressure", + "playful_pressure", + "fatigue", + "emotional_containment", + "reserved" + ], + "values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.15, + 0.35, + 0.0, + 0.0, + 0.2, + 0.0, + 0.0, + 0.0, + 0.25, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "character_state_vector": { + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "schema_ref": "E:/Projects/EpiphanyAgent/schemas/agent-utterance-state-schema.md", + "dimensionality": 64, + "values_ref": "vectors/neutral-character-64.json" + } + }, + "phonetic_realization_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.panphon_sequence_encoder.v0.1", + "dimensionality": 256, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "utterance_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.utterance_embedding_encoder.v0.1", + "version": null, + "training_set": "tiny-panphon-v0.1", + "dimensionality": 64, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "audit_projection": { + "semantic_preservation": "No lexical semantics; preserve the requested IPA sound shape.", + "emphasis": "Single syllable baseline stress where a vowel exists.", + "prosody": "Neutral, slow, precise, no expressive contour.", + "character_pressure": "Neutral speaker baseline.", + "delivery_shape": "voiceless alveolar stop into open vowel" + }, + "training_refs": { + "positive_examples": [ + { + "kind": "reference_synth_prompt", + "engine": "eSpeak NG or equivalent baseline speech oracle", + "text": "ta" + } + ], + "negative_examples": [] + }, + "trace": { + "pipeline_receipts": [ + { + "stage": "weksa_emit_tiny_panphon_handoff", + "decided_at_utc": "2026-05-20T00:00:00Z", + "latency_budget_ms": 10, + "observed_latency_ms": 0, + "confidence": 0.72 + } + ], + "notes": [ + "This fixture is a crawl-stage training seed, not a full English lowering artifact.", + "PanPhon-style features are hand-authored for the six seed phones until Weksa wires a canonical PanPhon dependency.", + "AquaSynth owns the learned 256-float phonetic realization embedding and 64-float utterance embedding." + ], + "uncertainties": [ + "Feature values should be regenerated from the canonical PanPhon library before broad phoneme coverage.", + "Durations are seed timing hints, not measured reference audio." + ] + } +} diff --git a/examples/speech-training/tiny-panphon-v0.1/batch.json b/examples/speech-training/tiny-panphon-v0.1/batch.json new file mode 100644 index 0000000..165e330 --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/batch.json @@ -0,0 +1,14 @@ +{ + "schema_version": "weksa.utterance_handoff_batch.v0.1", + "batch_id": "tiny-panphon-v0.1", + "packet_schema_version": "weksa.utterance_embedding_handoff.v0.1", + "packet_refs": [ + "open-vowel-a.json", + "bilabial-pa.json", + "alveolar-ta.json", + "velar-ka.json", + "sibilant-sa.json", + "nasal-ma.json" + ], + "purpose": "Initial AquaSynth parity curriculum for simple IPA sounds." +} diff --git a/examples/speech-training/tiny-panphon-v0.1/bilabial-pa.json b/examples/speech-training/tiny-panphon-v0.1/bilabial-pa.json new file mode 100644 index 0000000..3927a0f --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/bilabial-pa.json @@ -0,0 +1,249 @@ +{ + "schema_version": "weksa.utterance_embedding_handoff.v0.1", + "packet_id": "tiny-panphon-v0.1/bilabial-pa", + "source_output_ref": "examples/speech-training/tiny-panphon-v0.1/README.md", + "speaker_agent_id": "neutral-human-baseline", + "text": { + "spoken_text": "pa", + "normalized_text": "pa", + "channel_note": "Pure IPA curriculum seed; semantic text embedding is intentionally zero." + }, + "inputs": { + "speech_text_embedding": { + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values_ref": "vectors/zero-semantic-1024.json" + }, + "panphon_sequence": { + "model_id": "panphon-style.v0.1.seed", + "source": "hand-authored seed phones for AquaSynth crawl-stage parity tests", + "ipa": "pa", + "feature_order": [ + "syl", + "son", + "cons", + "cont", + "delrel", + "lat", + "nas", + "strid", + "voi", + "sg", + "cg", + "ant", + "cor", + "distr", + "lab", + "hi", + "lo", + "back", + "round", + "velaric", + "tense", + "long" + ], + "frames": [ + { + "index": 0, + "phone": "p", + "features": [ + -1.0, + -1.0, + 1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "markers": { + "stress": 0.0, + "length": 0.0, + "tone": 0.0, + "boundary": 0.0, + "duration_ms": 95 + } + }, + { + "index": 1, + "phone": "a", + "features": [ + 1.0, + 1.0, + -1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -1.0, + 0.0, + -1.0, + 0.0 + ], + "markers": { + "stress": 1.0, + "length": 0.0, + "tone": 0.0, + "boundary": 1.0, + "duration_ms": 180 + } + } + ] + }, + "prosody_emphasis_hints": { + "dimensionality": 32, + "labels": [ + "mean_pitch_pressure", + "pitch_rise", + "pitch_fall", + "pitch_range", + "loudness_pressure", + "loudness_attack", + "loudness_release", + "speaking_rate", + "articulation_precision", + "pause_pressure", + "phrase_final_lengthening", + "stress_contrast", + "clippedness", + "breathiness", + "creak_pressure", + "smoothness", + "warmth", + "threat", + "urgency", + "hesitation", + "irony_dryness", + "tenderness", + "contempt", + "command_force", + "question_contour", + "exclamation_pressure", + "secrecy_low_projection", + "ritual_formality_pressure", + "playful_pressure", + "fatigue", + "emotional_containment", + "reserved" + ], + "values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.15, + 0.35, + 0.0, + 0.0, + 0.2, + 0.0, + 0.0, + 0.0, + 0.25, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "character_state_vector": { + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "schema_ref": "E:/Projects/EpiphanyAgent/schemas/agent-utterance-state-schema.md", + "dimensionality": 64, + "values_ref": "vectors/neutral-character-64.json" + } + }, + "phonetic_realization_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.panphon_sequence_encoder.v0.1", + "dimensionality": 256, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "utterance_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.utterance_embedding_encoder.v0.1", + "version": null, + "training_set": "tiny-panphon-v0.1", + "dimensionality": 64, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "audit_projection": { + "semantic_preservation": "No lexical semantics; preserve the requested IPA sound shape.", + "emphasis": "Single syllable baseline stress where a vowel exists.", + "prosody": "Neutral, slow, precise, no expressive contour.", + "character_pressure": "Neutral speaker baseline.", + "delivery_shape": "voiceless bilabial stop into open vowel" + }, + "training_refs": { + "positive_examples": [ + { + "kind": "reference_synth_prompt", + "engine": "eSpeak NG or equivalent baseline speech oracle", + "text": "pa" + } + ], + "negative_examples": [] + }, + "trace": { + "pipeline_receipts": [ + { + "stage": "weksa_emit_tiny_panphon_handoff", + "decided_at_utc": "2026-05-20T00:00:00Z", + "latency_budget_ms": 10, + "observed_latency_ms": 0, + "confidence": 0.72 + } + ], + "notes": [ + "This fixture is a crawl-stage training seed, not a full English lowering artifact.", + "PanPhon-style features are hand-authored for the six seed phones until Weksa wires a canonical PanPhon dependency.", + "AquaSynth owns the learned 256-float phonetic realization embedding and 64-float utterance embedding." + ], + "uncertainties": [ + "Feature values should be regenerated from the canonical PanPhon library before broad phoneme coverage.", + "Durations are seed timing hints, not measured reference audio." + ] + } +} diff --git a/examples/speech-training/tiny-panphon-v0.1/nasal-ma.json b/examples/speech-training/tiny-panphon-v0.1/nasal-ma.json new file mode 100644 index 0000000..f17908c --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/nasal-ma.json @@ -0,0 +1,249 @@ +{ + "schema_version": "weksa.utterance_embedding_handoff.v0.1", + "packet_id": "tiny-panphon-v0.1/nasal-ma", + "source_output_ref": "examples/speech-training/tiny-panphon-v0.1/README.md", + "speaker_agent_id": "neutral-human-baseline", + "text": { + "spoken_text": "ma", + "normalized_text": "ma", + "channel_note": "Pure IPA curriculum seed; semantic text embedding is intentionally zero." + }, + "inputs": { + "speech_text_embedding": { + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values_ref": "vectors/zero-semantic-1024.json" + }, + "panphon_sequence": { + "model_id": "panphon-style.v0.1.seed", + "source": "hand-authored seed phones for AquaSynth crawl-stage parity tests", + "ipa": "ma", + "feature_order": [ + "syl", + "son", + "cons", + "cont", + "delrel", + "lat", + "nas", + "strid", + "voi", + "sg", + "cg", + "ant", + "cor", + "distr", + "lab", + "hi", + "lo", + "back", + "round", + "velaric", + "tense", + "long" + ], + "frames": [ + { + "index": 0, + "phone": "m", + "features": [ + -1.0, + 1.0, + 1.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "markers": { + "stress": 0.0, + "length": 0.0, + "tone": 0.0, + "boundary": 0.0, + "duration_ms": 95 + } + }, + { + "index": 1, + "phone": "a", + "features": [ + 1.0, + 1.0, + -1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -1.0, + 0.0, + -1.0, + 0.0 + ], + "markers": { + "stress": 1.0, + "length": 0.0, + "tone": 0.0, + "boundary": 1.0, + "duration_ms": 180 + } + } + ] + }, + "prosody_emphasis_hints": { + "dimensionality": 32, + "labels": [ + "mean_pitch_pressure", + "pitch_rise", + "pitch_fall", + "pitch_range", + "loudness_pressure", + "loudness_attack", + "loudness_release", + "speaking_rate", + "articulation_precision", + "pause_pressure", + "phrase_final_lengthening", + "stress_contrast", + "clippedness", + "breathiness", + "creak_pressure", + "smoothness", + "warmth", + "threat", + "urgency", + "hesitation", + "irony_dryness", + "tenderness", + "contempt", + "command_force", + "question_contour", + "exclamation_pressure", + "secrecy_low_projection", + "ritual_formality_pressure", + "playful_pressure", + "fatigue", + "emotional_containment", + "reserved" + ], + "values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.15, + 0.35, + 0.0, + 0.0, + 0.2, + 0.0, + 0.0, + 0.0, + 0.25, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "character_state_vector": { + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "schema_ref": "E:/Projects/EpiphanyAgent/schemas/agent-utterance-state-schema.md", + "dimensionality": 64, + "values_ref": "vectors/neutral-character-64.json" + } + }, + "phonetic_realization_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.panphon_sequence_encoder.v0.1", + "dimensionality": 256, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "utterance_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.utterance_embedding_encoder.v0.1", + "version": null, + "training_set": "tiny-panphon-v0.1", + "dimensionality": 64, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "audit_projection": { + "semantic_preservation": "No lexical semantics; preserve the requested IPA sound shape.", + "emphasis": "Single syllable baseline stress where a vowel exists.", + "prosody": "Neutral, slow, precise, no expressive contour.", + "character_pressure": "Neutral speaker baseline.", + "delivery_shape": "voiced bilabial nasal into open vowel" + }, + "training_refs": { + "positive_examples": [ + { + "kind": "reference_synth_prompt", + "engine": "eSpeak NG or equivalent baseline speech oracle", + "text": "ma" + } + ], + "negative_examples": [] + }, + "trace": { + "pipeline_receipts": [ + { + "stage": "weksa_emit_tiny_panphon_handoff", + "decided_at_utc": "2026-05-20T00:00:00Z", + "latency_budget_ms": 10, + "observed_latency_ms": 0, + "confidence": 0.72 + } + ], + "notes": [ + "This fixture is a crawl-stage training seed, not a full English lowering artifact.", + "PanPhon-style features are hand-authored for the six seed phones until Weksa wires a canonical PanPhon dependency.", + "AquaSynth owns the learned 256-float phonetic realization embedding and 64-float utterance embedding." + ], + "uncertainties": [ + "Feature values should be regenerated from the canonical PanPhon library before broad phoneme coverage.", + "Durations are seed timing hints, not measured reference audio." + ] + } +} diff --git a/examples/speech-training/tiny-panphon-v0.1/open-vowel-a.json b/examples/speech-training/tiny-panphon-v0.1/open-vowel-a.json new file mode 100644 index 0000000..51b8a13 --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/open-vowel-a.json @@ -0,0 +1,214 @@ +{ + "schema_version": "weksa.utterance_embedding_handoff.v0.1", + "packet_id": "tiny-panphon-v0.1/open-vowel-a", + "source_output_ref": "examples/speech-training/tiny-panphon-v0.1/README.md", + "speaker_agent_id": "neutral-human-baseline", + "text": { + "spoken_text": "a", + "normalized_text": "a", + "channel_note": "Pure IPA curriculum seed; semantic text embedding is intentionally zero." + }, + "inputs": { + "speech_text_embedding": { + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values_ref": "vectors/zero-semantic-1024.json" + }, + "panphon_sequence": { + "model_id": "panphon-style.v0.1.seed", + "source": "hand-authored seed phones for AquaSynth crawl-stage parity tests", + "ipa": "a", + "feature_order": [ + "syl", + "son", + "cons", + "cont", + "delrel", + "lat", + "nas", + "strid", + "voi", + "sg", + "cg", + "ant", + "cor", + "distr", + "lab", + "hi", + "lo", + "back", + "round", + "velaric", + "tense", + "long" + ], + "frames": [ + { + "index": 0, + "phone": "a", + "features": [ + 1.0, + 1.0, + -1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -1.0, + 0.0, + -1.0, + 0.0 + ], + "markers": { + "stress": 1.0, + "length": 0.0, + "tone": 0.0, + "boundary": 1.0, + "duration_ms": 180 + } + } + ] + }, + "prosody_emphasis_hints": { + "dimensionality": 32, + "labels": [ + "mean_pitch_pressure", + "pitch_rise", + "pitch_fall", + "pitch_range", + "loudness_pressure", + "loudness_attack", + "loudness_release", + "speaking_rate", + "articulation_precision", + "pause_pressure", + "phrase_final_lengthening", + "stress_contrast", + "clippedness", + "breathiness", + "creak_pressure", + "smoothness", + "warmth", + "threat", + "urgency", + "hesitation", + "irony_dryness", + "tenderness", + "contempt", + "command_force", + "question_contour", + "exclamation_pressure", + "secrecy_low_projection", + "ritual_formality_pressure", + "playful_pressure", + "fatigue", + "emotional_containment", + "reserved" + ], + "values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.15, + 0.35, + 0.0, + 0.0, + 0.2, + 0.0, + 0.0, + 0.0, + 0.25, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "character_state_vector": { + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "schema_ref": "E:/Projects/EpiphanyAgent/schemas/agent-utterance-state-schema.md", + "dimensionality": 64, + "values_ref": "vectors/neutral-character-64.json" + } + }, + "phonetic_realization_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.panphon_sequence_encoder.v0.1", + "dimensionality": 256, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "utterance_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.utterance_embedding_encoder.v0.1", + "version": null, + "training_set": "tiny-panphon-v0.1", + "dimensionality": 64, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "audit_projection": { + "semantic_preservation": "No lexical semantics; preserve the requested IPA sound shape.", + "emphasis": "Single syllable baseline stress where a vowel exists.", + "prosody": "Neutral, slow, precise, no expressive contour.", + "character_pressure": "Neutral speaker baseline.", + "delivery_shape": "open low vowel baseline" + }, + "training_refs": { + "positive_examples": [ + { + "kind": "reference_synth_prompt", + "engine": "eSpeak NG or equivalent baseline speech oracle", + "text": "a" + } + ], + "negative_examples": [] + }, + "trace": { + "pipeline_receipts": [ + { + "stage": "weksa_emit_tiny_panphon_handoff", + "decided_at_utc": "2026-05-20T00:00:00Z", + "latency_budget_ms": 10, + "observed_latency_ms": 0, + "confidence": 0.72 + } + ], + "notes": [ + "This fixture is a crawl-stage training seed, not a full English lowering artifact.", + "PanPhon-style features are hand-authored for the six seed phones until Weksa wires a canonical PanPhon dependency.", + "AquaSynth owns the learned 256-float phonetic realization embedding and 64-float utterance embedding." + ], + "uncertainties": [ + "Feature values should be regenerated from the canonical PanPhon library before broad phoneme coverage.", + "Durations are seed timing hints, not measured reference audio." + ] + } +} diff --git a/examples/speech-training/tiny-panphon-v0.1/sibilant-sa.json b/examples/speech-training/tiny-panphon-v0.1/sibilant-sa.json new file mode 100644 index 0000000..20cfe2d --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/sibilant-sa.json @@ -0,0 +1,249 @@ +{ + "schema_version": "weksa.utterance_embedding_handoff.v0.1", + "packet_id": "tiny-panphon-v0.1/sibilant-sa", + "source_output_ref": "examples/speech-training/tiny-panphon-v0.1/README.md", + "speaker_agent_id": "neutral-human-baseline", + "text": { + "spoken_text": "sa", + "normalized_text": "sa", + "channel_note": "Pure IPA curriculum seed; semantic text embedding is intentionally zero." + }, + "inputs": { + "speech_text_embedding": { + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values_ref": "vectors/zero-semantic-1024.json" + }, + "panphon_sequence": { + "model_id": "panphon-style.v0.1.seed", + "source": "hand-authored seed phones for AquaSynth crawl-stage parity tests", + "ipa": "sa", + "feature_order": [ + "syl", + "son", + "cons", + "cont", + "delrel", + "lat", + "nas", + "strid", + "voi", + "sg", + "cg", + "ant", + "cor", + "distr", + "lab", + "hi", + "lo", + "back", + "round", + "velaric", + "tense", + "long" + ], + "frames": [ + { + "index": 0, + "phone": "s", + "features": [ + -1.0, + -1.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 1.0, + -1.0, + 0.0, + 0.0, + 1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "markers": { + "stress": 0.0, + "length": 0.0, + "tone": 0.0, + "boundary": 0.0, + "duration_ms": 95 + } + }, + { + "index": 1, + "phone": "a", + "features": [ + 1.0, + 1.0, + -1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -1.0, + 0.0, + -1.0, + 0.0 + ], + "markers": { + "stress": 1.0, + "length": 0.0, + "tone": 0.0, + "boundary": 1.0, + "duration_ms": 180 + } + } + ] + }, + "prosody_emphasis_hints": { + "dimensionality": 32, + "labels": [ + "mean_pitch_pressure", + "pitch_rise", + "pitch_fall", + "pitch_range", + "loudness_pressure", + "loudness_attack", + "loudness_release", + "speaking_rate", + "articulation_precision", + "pause_pressure", + "phrase_final_lengthening", + "stress_contrast", + "clippedness", + "breathiness", + "creak_pressure", + "smoothness", + "warmth", + "threat", + "urgency", + "hesitation", + "irony_dryness", + "tenderness", + "contempt", + "command_force", + "question_contour", + "exclamation_pressure", + "secrecy_low_projection", + "ritual_formality_pressure", + "playful_pressure", + "fatigue", + "emotional_containment", + "reserved" + ], + "values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.15, + 0.35, + 0.0, + 0.0, + 0.2, + 0.0, + 0.0, + 0.0, + 0.25, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "character_state_vector": { + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "schema_ref": "E:/Projects/EpiphanyAgent/schemas/agent-utterance-state-schema.md", + "dimensionality": 64, + "values_ref": "vectors/neutral-character-64.json" + } + }, + "phonetic_realization_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.panphon_sequence_encoder.v0.1", + "dimensionality": 256, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "utterance_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.utterance_embedding_encoder.v0.1", + "version": null, + "training_set": "tiny-panphon-v0.1", + "dimensionality": 64, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "audit_projection": { + "semantic_preservation": "No lexical semantics; preserve the requested IPA sound shape.", + "emphasis": "Single syllable baseline stress where a vowel exists.", + "prosody": "Neutral, slow, precise, no expressive contour.", + "character_pressure": "Neutral speaker baseline.", + "delivery_shape": "voiceless alveolar sibilant into open vowel" + }, + "training_refs": { + "positive_examples": [ + { + "kind": "reference_synth_prompt", + "engine": "eSpeak NG or equivalent baseline speech oracle", + "text": "sa" + } + ], + "negative_examples": [] + }, + "trace": { + "pipeline_receipts": [ + { + "stage": "weksa_emit_tiny_panphon_handoff", + "decided_at_utc": "2026-05-20T00:00:00Z", + "latency_budget_ms": 10, + "observed_latency_ms": 0, + "confidence": 0.72 + } + ], + "notes": [ + "This fixture is a crawl-stage training seed, not a full English lowering artifact.", + "PanPhon-style features are hand-authored for the six seed phones until Weksa wires a canonical PanPhon dependency.", + "AquaSynth owns the learned 256-float phonetic realization embedding and 64-float utterance embedding." + ], + "uncertainties": [ + "Feature values should be regenerated from the canonical PanPhon library before broad phoneme coverage.", + "Durations are seed timing hints, not measured reference audio." + ] + } +} diff --git a/examples/speech-training/tiny-panphon-v0.1/vectors/neutral-character-64.json b/examples/speech-training/tiny-panphon-v0.1/vectors/neutral-character-64.json new file mode 100644 index 0000000..45a0f1a --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/vectors/neutral-character-64.json @@ -0,0 +1,136 @@ +{ + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "dimensionality": 64, + "labels": [ + "valence", + "arousal", + "dominance", + "urgency", + "anger", + "despair", + "sadness", + "fear", + "anxiety", + "disgust", + "contempt", + "annoyance", + "dismissal", + "flippancy", + "playfulness", + "irony", + "tenderness", + "warmth", + "joy", + "excitement", + "fatigue", + "guardedness", + "confidence", + "shame", + "pride", + "threat", + "secrecy", + "hesitation", + "emotionalContainment", + "thoughtPressure", + "reactionIntensity", + "commandForce", + "currentLoad", + "initiativeHeat", + "pendingTurn", + "cooldownPressure", + "reactionBias", + "interruptThreshold", + "initiativeSpeed", + "voiceBubbly", + "voiceDryness", + "voiceFormality", + "voiceDirectness", + "voiceIntensity", + "voiceWarmth", + "voicePrecision", + "voiceRitualRegister", + "presentationPushiness", + "presentationSelfFocus", + "presentationPlay", + "presentationCareDemand", + "behaviorWorkDrive", + "behaviorBoundaryDefense", + "behaviorPurityDrive", + "behaviorPatience", + "stableAgreeableness", + "stableConscientiousness", + "stableNeuroticism", + "stableOpenness", + "organizationCoherence", + "organizationRigidity", + "slowTraitReserved62", + "slowTraitReserved63", + "slowTraitReserved64" + ], + "values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] +} diff --git a/examples/speech-training/tiny-panphon-v0.1/vectors/zero-semantic-1024.json b/examples/speech-training/tiny-panphon-v0.1/vectors/zero-semantic-1024.json new file mode 100644 index 0000000..fac6cc0 --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/vectors/zero-semantic-1024.json @@ -0,0 +1,1031 @@ +{ + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "reason": "Pure IPA fixture; semantic text channel is intentionally silent." +} diff --git a/examples/speech-training/tiny-panphon-v0.1/velar-ka.json b/examples/speech-training/tiny-panphon-v0.1/velar-ka.json new file mode 100644 index 0000000..2446a6c --- /dev/null +++ b/examples/speech-training/tiny-panphon-v0.1/velar-ka.json @@ -0,0 +1,249 @@ +{ + "schema_version": "weksa.utterance_embedding_handoff.v0.1", + "packet_id": "tiny-panphon-v0.1/velar-ka", + "source_output_ref": "examples/speech-training/tiny-panphon-v0.1/README.md", + "speaker_agent_id": "neutral-human-baseline", + "text": { + "spoken_text": "ka", + "normalized_text": "ka", + "channel_note": "Pure IPA curriculum seed; semantic text embedding is intentionally zero." + }, + "inputs": { + "speech_text_embedding": { + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values_ref": "vectors/zero-semantic-1024.json" + }, + "panphon_sequence": { + "model_id": "panphon-style.v0.1.seed", + "source": "hand-authored seed phones for AquaSynth crawl-stage parity tests", + "ipa": "ka", + "feature_order": [ + "syl", + "son", + "cons", + "cont", + "delrel", + "lat", + "nas", + "strid", + "voi", + "sg", + "cg", + "ant", + "cor", + "distr", + "lab", + "hi", + "lo", + "back", + "round", + "velaric", + "tense", + "long" + ], + "frames": [ + { + "index": 0, + "phone": "k", + "features": [ + -1.0, + -1.0, + 1.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "markers": { + "stress": 0.0, + "length": 0.0, + "tone": 0.0, + "boundary": 0.0, + "duration_ms": 95 + } + }, + { + "index": 1, + "phone": "a", + "features": [ + 1.0, + 1.0, + -1.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.0, + -1.0, + 0.0, + -1.0, + 0.0 + ], + "markers": { + "stress": 1.0, + "length": 0.0, + "tone": 0.0, + "boundary": 1.0, + "duration_ms": 180 + } + } + ] + }, + "prosody_emphasis_hints": { + "dimensionality": 32, + "labels": [ + "mean_pitch_pressure", + "pitch_rise", + "pitch_fall", + "pitch_range", + "loudness_pressure", + "loudness_attack", + "loudness_release", + "speaking_rate", + "articulation_precision", + "pause_pressure", + "phrase_final_lengthening", + "stress_contrast", + "clippedness", + "breathiness", + "creak_pressure", + "smoothness", + "warmth", + "threat", + "urgency", + "hesitation", + "irony_dryness", + "tenderness", + "contempt", + "command_force", + "question_contour", + "exclamation_pressure", + "secrecy_low_projection", + "ritual_formality_pressure", + "playful_pressure", + "fatigue", + "emotional_containment", + "reserved" + ], + "values": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -0.15, + 0.35, + 0.0, + 0.0, + 0.2, + 0.0, + 0.0, + 0.0, + 0.25, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + }, + "character_state_vector": { + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "schema_ref": "E:/Projects/EpiphanyAgent/schemas/agent-utterance-state-schema.md", + "dimensionality": 64, + "values_ref": "vectors/neutral-character-64.json" + } + }, + "phonetic_realization_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.panphon_sequence_encoder.v0.1", + "dimensionality": 256, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "utterance_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.utterance_embedding_encoder.v0.1", + "version": null, + "training_set": "tiny-panphon-v0.1", + "dimensionality": 64, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": null + }, + "audit_projection": { + "semantic_preservation": "No lexical semantics; preserve the requested IPA sound shape.", + "emphasis": "Single syllable baseline stress where a vowel exists.", + "prosody": "Neutral, slow, precise, no expressive contour.", + "character_pressure": "Neutral speaker baseline.", + "delivery_shape": "voiceless velar stop into open vowel" + }, + "training_refs": { + "positive_examples": [ + { + "kind": "reference_synth_prompt", + "engine": "eSpeak NG or equivalent baseline speech oracle", + "text": "ka" + } + ], + "negative_examples": [] + }, + "trace": { + "pipeline_receipts": [ + { + "stage": "weksa_emit_tiny_panphon_handoff", + "decided_at_utc": "2026-05-20T00:00:00Z", + "latency_budget_ms": 10, + "observed_latency_ms": 0, + "confidence": 0.72 + } + ], + "notes": [ + "This fixture is a crawl-stage training seed, not a full English lowering artifact.", + "PanPhon-style features are hand-authored for the six seed phones until Weksa wires a canonical PanPhon dependency.", + "AquaSynth owns the learned 256-float phonetic realization embedding and 64-float utterance embedding." + ], + "uncertainties": [ + "Feature values should be regenerated from the canonical PanPhon library before broad phoneme coverage.", + "Durations are seed timing hints, not measured reference audio." + ] + } +} diff --git a/schemas/utterance-embedding-handoff.md b/schemas/utterance-embedding-handoff.md index 98f2700..b6d669f 100644 --- a/schemas/utterance-embedding-handoff.md +++ b/schemas/utterance-embedding-handoff.md @@ -64,3 +64,9 @@ The v0.1 phonetic channel uses PanPhon-style articulatory features as its per-phone base representation. Weksa supplies that sequence evidence. AquaSynth owns the learned compression from variable-length PanPhon sequence into the 256-float `phonetic_realization_embedding`. + +The first machine-readable seed batch lives at +`examples/speech-training/tiny-panphon-v0.1/batch.json`. It is the minimal +artifact AquaSynth should consume before broader English or alien pronunciation +coverage: six pure IPA packets with fixed vector widths, inline PanPhon-style +frames, and pending AquaSynth-owned learned outputs. diff --git a/state/map.yaml b/state/map.yaml index ca6a36e..04039c8 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -12,8 +12,9 @@ objective: Create a durable workspace where Weksa can develop from a persistent map before runtime architecture decisions are made. current: > - Define the first lowering target: project interlingua through character - agent state into flavored English dialogue. + Emit concrete v0.1 utterance handoff artifacts for AquaSynth's first + speech-training curriculum while keeping Weksa's ownership limited to + inspected inputs. constraints: - Runtime implementation language is undecided. @@ -227,6 +228,11 @@ landed_baseline: - Nibu lowering target note. - First English pronunciation plan fixture for Nibu proof output. - First toy utterance embedding handoff fixture for Nibu proof output. + - First executable utterance handoff emitter at + `tools/emit_tiny_panphon_handoffs.py`. + - First machine-readable AquaSynth speech-training seed batch at + `examples/speech-training/tiny-panphon-v0.1/batch.json`, covering pure IPA + `a`, `pa`, `ta`, `ka`, `sa`, and `ma` with fixed v0.1 vector widths. - Weksa-to-AquaSynth utterance embedding handoff v0.1 fixes the training vector contract: 1024-float `bge-m3:latest` speech text embedding, variable-length PanPhon sequence evidence, a 256-float AquaSynth-owned diff --git a/tools/emit_tiny_panphon_handoffs.py b/tools/emit_tiny_panphon_handoffs.py new file mode 100644 index 0000000..271b97a --- /dev/null +++ b/tools/emit_tiny_panphon_handoffs.py @@ -0,0 +1,381 @@ +#!/usr/bin/env python3 +"""Emit tiny v0.1 utterance handoff fixtures for AquaSynth speech training. + +This is intentionally not a Weksa runtime. It is a deterministic artifact +emitter for the first crawl-stage curriculum: simple IPA syllables with +PanPhon-style feature frames, fixed-width Weksa/Epiphany input vectors, and +pending AquaSynth-owned learned outputs. +""" + +from __future__ import annotations + +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +OUT = ROOT / "examples" / "speech-training" / "tiny-panphon-v0.1" +VECTORS = OUT / "vectors" + +SCHEMA_VERSION = "weksa.utterance_embedding_handoff.v0.1" +DECIDED_AT_UTC = "2026-05-20T00:00:00Z" + +FEATURE_ORDER = [ + "syl", + "son", + "cons", + "cont", + "delrel", + "lat", + "nas", + "strid", + "voi", + "sg", + "cg", + "ant", + "cor", + "distr", + "lab", + "hi", + "lo", + "back", + "round", + "velaric", + "tense", + "long", +] + +PROSODY_HINT_LABELS = [ + "mean_pitch_pressure", + "pitch_rise", + "pitch_fall", + "pitch_range", + "loudness_pressure", + "loudness_attack", + "loudness_release", + "speaking_rate", + "articulation_precision", + "pause_pressure", + "phrase_final_lengthening", + "stress_contrast", + "clippedness", + "breathiness", + "creak_pressure", + "smoothness", + "warmth", + "threat", + "urgency", + "hesitation", + "irony_dryness", + "tenderness", + "contempt", + "command_force", + "question_contour", + "exclamation_pressure", + "secrecy_low_projection", + "ritual_formality_pressure", + "playful_pressure", + "fatigue", + "emotional_containment", + "reserved", +] + +CHARACTER_STATE_LABELS = [ + "valence", + "arousal", + "dominance", + "urgency", + "anger", + "despair", + "sadness", + "fear", + "anxiety", + "disgust", + "contempt", + "annoyance", + "dismissal", + "flippancy", + "playfulness", + "irony", + "tenderness", + "warmth", + "joy", + "excitement", + "fatigue", + "guardedness", + "confidence", + "shame", + "pride", + "threat", + "secrecy", + "hesitation", + "emotionalContainment", + "thoughtPressure", + "reactionIntensity", + "commandForce", + "currentLoad", + "initiativeHeat", + "pendingTurn", + "cooldownPressure", + "reactionBias", + "interruptThreshold", + "initiativeSpeed", + "voiceBubbly", + "voiceDryness", + "voiceFormality", + "voiceDirectness", + "voiceIntensity", + "voiceWarmth", + "voicePrecision", + "voiceRitualRegister", + "presentationPushiness", + "presentationSelfFocus", + "presentationPlay", + "presentationCareDemand", + "behaviorWorkDrive", + "behaviorBoundaryDefense", + "behaviorPurityDrive", + "behaviorPatience", + "stableAgreeableness", + "stableConscientiousness", + "stableNeuroticism", + "stableOpenness", + "organizationCoherence", + "organizationRigidity", + "slowTraitReserved62", + "slowTraitReserved63", + "slowTraitReserved64", +] + +PHONE_FEATURES = { + "a": { + "syl": 1, + "son": 1, + "cons": -1, + "cont": 1, + "voi": 1, + "lo": 1, + "round": -1, + "tense": -1, + }, + "p": { + "syl": -1, + "son": -1, + "cons": 1, + "cont": -1, + "voi": -1, + "lab": 1, + }, + "t": { + "syl": -1, + "son": -1, + "cons": 1, + "cont": -1, + "voi": -1, + "ant": 1, + "cor": 1, + }, + "k": { + "syl": -1, + "son": -1, + "cons": 1, + "cont": -1, + "voi": -1, + "back": 1, + }, + "s": { + "syl": -1, + "son": -1, + "cons": 1, + "cont": 1, + "strid": 1, + "voi": -1, + "ant": 1, + "cor": 1, + }, + "m": { + "syl": -1, + "son": 1, + "cons": 1, + "cont": -1, + "nas": 1, + "voi": 1, + "lab": 1, + }, +} + +UTTERANCES = [ + ("open-vowel-a", "a", ["a"], "open low vowel baseline"), + ("bilabial-pa", "pa", ["p", "a"], "voiceless bilabial stop into open vowel"), + ("alveolar-ta", "ta", ["t", "a"], "voiceless alveolar stop into open vowel"), + ("velar-ka", "ka", ["k", "a"], "voiceless velar stop into open vowel"), + ("sibilant-sa", "sa", ["s", "a"], "voiceless alveolar sibilant into open vowel"), + ("nasal-ma", "ma", ["m", "a"], "voiced bilabial nasal into open vowel"), +] + + +def feature_vector(phone: str) -> list[float]: + features = PHONE_FEATURES[phone] + return [float(features.get(name, 0)) for name in FEATURE_ORDER] + + +def frame(phone: str, index: int, count: int) -> dict: + is_vowel = PHONE_FEATURES[phone].get("syl") == 1 + duration_ms = 180 if is_vowel else 95 + return { + "index": index, + "phone": phone, + "features": feature_vector(phone), + "markers": { + "stress": 1.0 if is_vowel else 0.0, + "length": 0.0, + "tone": 0.0, + "boundary": 1.0 if index == count - 1 else 0.0, + "duration_ms": duration_ms, + }, + } + + +def write_json(path: Path, value: object) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(value, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + + +def packet(packet_id: str, ipa: str, phones: list[str], note: str) -> dict: + prosody_values = [0.0] * 32 + prosody_values[7] = -0.15 + prosody_values[8] = 0.35 + prosody_values[11] = 0.2 + prosody_values[15] = 0.25 + + return { + "schema_version": SCHEMA_VERSION, + "packet_id": f"tiny-panphon-v0.1/{packet_id}", + "source_output_ref": "examples/speech-training/tiny-panphon-v0.1/README.md", + "speaker_agent_id": "neutral-human-baseline", + "text": { + "spoken_text": ipa, + "normalized_text": ipa, + "channel_note": "Pure IPA curriculum seed; semantic text embedding is intentionally zero.", + }, + "inputs": { + "speech_text_embedding": { + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values_ref": "vectors/zero-semantic-1024.json", + }, + "panphon_sequence": { + "model_id": "panphon-style.v0.1.seed", + "source": "hand-authored seed phones for AquaSynth crawl-stage parity tests", + "ipa": ipa, + "feature_order": FEATURE_ORDER, + "frames": [frame(phone, i, len(phones)) for i, phone in enumerate(phones)], + }, + "prosody_emphasis_hints": { + "dimensionality": 32, + "labels": PROSODY_HINT_LABELS, + "values": prosody_values, + }, + "character_state_vector": { + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "schema_ref": "E:/Projects/EpiphanyAgent/schemas/agent-utterance-state-schema.md", + "dimensionality": 64, + "values_ref": "vectors/neutral-character-64.json", + }, + }, + "phonetic_realization_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.panphon_sequence_encoder.v0.1", + "dimensionality": 256, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": None, + }, + "utterance_embedding": { + "owner": "AquaSynth", + "model_id": "aquasynth.utterance_embedding_encoder.v0.1", + "version": None, + "training_set": "tiny-panphon-v0.1", + "dimensionality": 64, + "status": "pending_aquasynth_training_or_encoding", + "values_ref": None, + }, + "audit_projection": { + "semantic_preservation": "No lexical semantics; preserve the requested IPA sound shape.", + "emphasis": "Single syllable baseline stress where a vowel exists.", + "prosody": "Neutral, slow, precise, no expressive contour.", + "character_pressure": "Neutral speaker baseline.", + "delivery_shape": note, + }, + "training_refs": { + "positive_examples": [ + { + "kind": "reference_synth_prompt", + "engine": "eSpeak NG or equivalent baseline speech oracle", + "text": ipa, + } + ], + "negative_examples": [], + }, + "trace": { + "pipeline_receipts": [ + { + "stage": "weksa_emit_tiny_panphon_handoff", + "decided_at_utc": DECIDED_AT_UTC, + "latency_budget_ms": 10, + "observed_latency_ms": 0, + "confidence": 0.72, + } + ], + "notes": [ + "This fixture is a crawl-stage training seed, not a full English lowering artifact.", + "PanPhon-style features are hand-authored for the six seed phones until Weksa wires a canonical PanPhon dependency.", + "AquaSynth owns the learned 256-float phonetic realization embedding and 64-float utterance embedding.", + ], + "uncertainties": [ + "Feature values should be regenerated from the canonical PanPhon library before broad phoneme coverage.", + "Durations are seed timing hints, not measured reference audio.", + ], + }, + } + + +def emit() -> None: + write_json( + VECTORS / "zero-semantic-1024.json", + { + "model_id": "bge-m3:latest", + "dimensionality": 1024, + "values": [0.0] * 1024, + "reason": "Pure IPA fixture; semantic text channel is intentionally silent.", + }, + ) + write_json( + VECTORS / "neutral-character-64.json", + { + "source": "epiphany.agent_utterance_state.v0 neutral baseline", + "dimensionality": 64, + "labels": CHARACTER_STATE_LABELS, + "values": [0.0] * 64, + }, + ) + + packet_refs = [] + for packet_id, ipa, phones, note in UTTERANCES: + path = OUT / f"{packet_id}.json" + write_json(path, packet(packet_id, ipa, phones, note)) + packet_refs.append(path.name) + + write_json( + OUT / "batch.json", + { + "schema_version": "weksa.utterance_handoff_batch.v0.1", + "batch_id": "tiny-panphon-v0.1", + "packet_schema_version": SCHEMA_VERSION, + "packet_refs": packet_refs, + "purpose": "Initial AquaSynth parity curriculum for simple IPA sounds.", + }, + ) + + +if __name__ == "__main__": + emit()