Skip to content

ADR-v2-105 — Vocal Morse (two-tone timing-coded AAC)

Status: Accepted (2026-07-02) · Wave M Context links: [[adr-v2-097-mouth-sound-switch-access]] (single event vs symbol alphabet), [[adr-v2-095-vocal-joystick]], [[adr-011]]

Context

Wave M research (#1) — a user who can produce only two distinguishable vocal sounds (short grunt vs long hum, or low vs high) emits timed pulses decoded to text/commands. Morse needs only two symbols, so even one reliable vocalization suffices — the lowest-bandwidth input in the whole set. Every excluded switch-access feature (Mouth-Sound Switch, Vocal Joystick, Breath) is a single-event trigger or continuous controller; none is a timing-coded symbol alphabet that turns one vocal gesture into full text. Adaptive timing (auto-calibrating dot/dash + gaps to the user's slowing, fatiguing rhythm) is the studied research edge. Anchor: Google Gboard Morse keyboard (2018, built with a cerebral-palsy user); Adaptive Morse code recognition for disabled persons (ScienceDirect, Math & Computers in Simulation); ongoing Morse-AAC for ALS/locked-in.

Decision

Add an opt-in Vocal Morse: [morsevox] enabled=false, dot_max_ms=200, letter_gap_ms=600, word_gap_ms=1400. Pure cores in morsevox/decode.py: classify_pulse(duration_ms, calib)dot|dash, classify_gap(silence_ms, calib)gap_symbol|gap_letter|gap_word, MorseDecoder (feed dot/dash/gap tokens → emit decoded chars at letter/word boundaries via the international Morse table), and adapt_dot_threshold(durations, calib) → an EMA-refit MorseCalib. Pulse timing comes from the existing hold/mouth-sound stream. OFF by default.

Consequences

  • Full text entry from a single reliable vocalization — the highest-ceiling accessibility win here.
  • Pure timing classifier + decoder + adaptive calibration → fully testable with synthetic durations.
  • Distinct from Mouth-Switch (symbol alphabet vs single trigger).
  • Privacy (ADR-011): local timing only.
  • Caveat: Morse is slow and has a learning curve (inherent); off by default.