May 10, 2026
Voice refactor, prosody fixes, and dead code purge
The voice pipeline was collapsed onto the moonshine_voice package, eliminating kokoro-onnx and espeak-ng entirely
The voice pipeline was collapsed onto the moonshine_voice package, eliminating kokoro-onnx and espeak-ng entirely. TTS and STT now route through a single pip dependency that owns G2P, ONNX runtime, and voice assets. Warmup daemon threads fire at boot so the first user message no longer stalls while ~1 GB of models download.
TTS preprocessing dependencies (markdown-it-py, pysbd, num2words) were moved into the main requirements to fix import errors in CI unit tests. The synthesis route now streams one NDJSON chunk per sentence, segmenting with pysbd that correctly handles abbreviations and decimals, giving the frontend playback before the full text is processed.
Multiple prosody fixes followed: punctuation-driven segmentation with silence pads restored natural inflection after Moonshine’s neural G2P was found to strip all punctuation. Pause durations were halved, short ALL-CAPS acronyms and digit-letter joins are pre-expanded to prevent garbled G2P output, and a type coercion bug where synthesize() returned a list instead of ndarray was fixed. The default voice was switched to af_heart.
A client-context bug that silently dropped heartbeats when the cached location was null was fixed. The AttributeError on lat/lon access was caused by json-roundtrip serialization; the fix uses an or {} coercion consistent with existing patterns.
The schedule search delegation in memory recall was restored after an erroneous removal had regressed a key cycle score to 0.68. This delegation is the only path to surface scheduled items after a transcript reset.
A sweeping dead-code removal pass eliminated zero-caller methods and subsystems, including 15 Redis-compat methods from MemoryStore, the ACT output-queue subsystem, ONNX predict_multi_label, ability lifecycle hooks, vault change_password, list get_lists_for_prompt, and unused news search_sources. Dead service registrations were also cleaned from boot.
Minor fixes included silencing werkzeug INFO logs from frontend health polls, making /voice/health return 200 for the unavailable state so the UI picks up the actionable JSON, a theme-aware label for the history-end pill, and populating clean_text for text documents. List prompt directives that caused redundant LLM calls were removed.
-
Collapsed voice onto moonshine_voice, dropping kokoro-onnx and espeak-ng.
-
Replaced regex markdown stripper with markdown-it-py + pysbd, streaming TTS per sentence.
-
Fixed prosody with punctuation segmentation, silence pads, shorter pauses, and acronym expansion.
-
Fixed client-context null-location bug that silently dropped heartbeats.
-
Restored schedule search delegation in memory recall, fixing a regression.
-
Removed over 400 lines of dead code across memory store, output service, ONNX, vault, and abilities.