Skip to content
KNOOP edited this page Aug 27, 2026 · 1 revision

Chorus Wake

Chorus Wake (一呼百应) is Ava's multi-device wake-word arbitration system. When multiple Ava devices in the same home hear the same wake word, Chorus Wake ensures only one device responds — the one that heard it best. The others yield gracefully.

Available since 0.7.3.


How It Works

When any Ava device detects a wake word, it broadcasts a claim packet over the local network. All devices collect claims for a fixed window, then compare scores. The device with the highest score wins and opens the assistant. Losers fade out with a yield glow.

Device A hears "Hey Jarvis" (score 1200)
Device B hears "Hey Jarvis" (score 850)
    ↓
Both broadcast AVA_WAKE claims on UDP 19851
    ↓
180 ms collect window
    ↓
Device A has the higher score → wins, opens assistant
Device B yields → fade glow, stays silent
    ↓
Device A finishes → broadcasts AVA_WAKE_END
Device B un-yields

Protocol

Chorus Wake uses UDP broadcast on port 19851 — dedicated to chorus wake, not shared with Bluetooth presence (19847) or AvaVoice (19848/19849).

Packet Purpose
AVA_WAKE Wake claim: device ID, wake key, score, timestamp
AVA_WAKE_END Session end: winner finished talking or run aborted

END packet is sent 3 times to survive unacknowledged Wi-Fi broadcast (DTIM-buffered delivery can drop one packet).


Scoring

The winner is who heard the wake word louder (pre-gain RMS + confidence), not who finished voiceprint first or whose wall clock is behind.

Behavior Description
Collect window Every device collects claims for the same fixed window before deciding
Tie handling Scores within a small margin are treated as a tie — a slightly hotter mic cannot lock the seat just by being a few points ahead
Clear lead yield A device yields immediately only when a prior claim is clearly louder, not merely earlier
Late claim revocation If a clearly-louder claim arrives shortly after a local win, the local device revokes its seat instead of double-answering — handles devices that detected late but out-heard the current winner
Claim repeats Each claim packet is sent multiple times to survive Wi-Fi broadcast drops (DTIM-buffered delivery can drop one packet)

Wake ID Normalization

Chorus normalizes naming differences between microWakeWord and OpenWakeWord by stripping engine suffixes from model IDs. okay_nabu (microWakeWord) and ok_nabu (OpenWakeWord) map to the same wake identity, so devices using different engines can still arbitrate the same wake phrase.


Peer Session Lifecycle

Event Behavior
Local wake detected Broadcast AVA_WAKE claim, start collect window
Collect window ends Compare scores; win or yield
Win Open assistant; on finish, broadcast AVA_WAKE_END
Yield Fade glow; wait for AVA_WAKE_END from winner
AVA_WAKE_END received Un-yield; return to normal wake detection
Session timeout Peer session expires; un-yield regardless
Seat revoked Local win dethroned by louder late claim; yield instead

Rewake handoff: If a new wake arrives while the current session is still active, the winner must not announce chorus end for the session that just started. The handoff is tracked to prevent premature end announcements.


Yield Glow

When a device yields, it shows a subtle glow effect (ChorusYieldGlowView) so you can see it heard you but deferred to another device. The glow fades smoothly — no jarring visual transition.


Setup

  1. Go to SettingsVoice Config
  2. Turn on Chorus Wake
  3. All Ava devices on the same LAN with Chorus Wake enabled will arbitrate

No manual configuration of device priorities or rooms is needed. The device that hears you best responds.


Requirements

  • Multiple Ava devices on the same LAN
  • Chorus Wake enabled on each participating device
  • UDP broadcast enabled on your network (most home networks support this by default)
  • Same wake word configured on participating devices (or cross-engine mapped, e.g., okay_nabuok_nabu)

Back to Home

Clone this wiki locally