harmonics voice domain — play + say, text→notes core, offline audio (issue #1)#3
Conversation
…hink → /spec-to-plan) Converged spec + 12-task/6-wave plan for the agent "voice" domain: axes→notes core, play + say verbs, text-legible say tune with expressive pitch/volume stress, derived identity, --seq micro-variation. Includes the .devague frame + plan state (the confirm/reject evidence trail). Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
The five-axis contract (intent/confidence/urgency/state/identity) every domain module speaks — vocabulary + a validated frozen Axes record, dependency-free. Sound decisions deliberately excluded (that is the mapping module's job). Laid down before the wave fan-out so inference/mapping/verbs agree without a cross-wave import dependency. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
…sion [t10] Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
Co-Authored-By: Claude <[email protected]>
…ing state - Backtick the CLI-usage placeholders (<i>/<agent>/<sentence>) so they aren't parsed as inline HTML; drop trailing periods from the H1 titles (MD026). - Add .devague/** to the markdownlint ignores, alongside .afi/.teken. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
PR Summary by QodoHarmonics voice domain: text→notes core, play/say verbs, offline WAV synth
AI Description
Diagram
High-Level Assessment
Files changed (40)
|
Code Review by Qodo
1.
|
… specific test exceptions [review] Co-Authored-By: Claude <[email protected]>
…ring concat, test exceptions)
…av docs [review] Co-Authored-By: Claude <[email protected]>
…liError on I/O, correct --play docs [review] Co-Authored-By: Claude <[email protected]>
…liError I/O, --play docs)
…ide by default [voice] Co-Authored-By: Claude <[email protected]>
…ien); glide by default
Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
… (S3776) Both are byte-identical refactors — the rendered WAV bytes are unchanged for every articulation (verified by MD5), so the approved glide sound is untouched. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
|



harmonics voice domain — the non-TTS audio surface (issue #1)
Builds the domain from issue #1: an agent/robot's own non-speech voice. It renders live meaning — not words — into short, pleasant sonic gestures, the first-person inverse of a spectator soundtrack.
How it was built
Full
devaguepipeline, human-gated at each seam:/think→ a converged spec (docs/specs/) — 16 claims, 15 honesty conditions./spec-to-plan→ a buildable plan (docs/plans/) — 12 tasks, 6 dependency waves, 30/30 coverage./assign-to-workforce→ each wave fanned out to parallel subagents in isolated git worktrees, every merge TDD-gated (tests pass before and after).The design spine — the voice ≠ soundtrack distinction — came from a design conversation: a soundtrack narrates events in the third person off a log; a voice is first-person, driven by the agent's own axes, and (for
say) its melody tracks the sentence so a listener can approximately follow it.What's in it
Pure, offline, dependency-free text→notes core; audio isolated on top.
axes.py— the five-axis vocabulary (intent, confidence, urgency, state, identity).notes.py— theNoteEventcore + JSON / MIDI-like serialization (the test surface and robot representation).mapping.py— the design spine: axes → sonic parameters over a consonant pentatonic scale with a velocity ceiling, so urgent is attention-grabbing but never an alarm (proven by test: urgent vs calm differ only in timing, never pitch/loudness).identity.py— per-agent voice-prints (key + instrument) derived from the identity string, so you can tell who is speaking; palette overrides supported.variation.py— deterministic micro-variation keyed by a--seqnonce (never wall-clock/entropy).inference.py— offline sentence → axes (a documented cue table; no model/network).contour.py— text → melodic contour (one note per word) so a human can follow sound ↔ text; still non-speech.stress.py—*word*/ ALL-CAPS emphasis that raises pitch/velocity within the ceiling.audio/— pure-stdlib offline WAV synth; live playback via a lazy optional import so the core never needs an audio device.harmonics play --intent … [--as] [--seq]andharmonics say "<sentence>"— dry-run by default,--json/--out/--wav/--midi/--play.docs/ear-test-protocol.md— blind-listening protocols with better-than-chance bars for the human-discrimination claims.The scaffold's
culture-agent-templateself-descriptions are replaced with the real voice mission everywhere (parser,explain,learn,overview, README).Verification
black/isort/flake8/banditclean; markdownlint clean.teken cli doctor . --strictpasses 26/26.harmonics play --intent success --wav out.wavandharmonics say "done, tests all green" --wav out.wavboth write validRIFF/WAVE PCM 16-bit mono 44100 Hz, whileimport harmonics.audio.synthneeds no audio device.Open items (non-blocking, tracked as plan risks)
Closes #1.
🤖 Generated with Claude Code