/
/
/
# What does this implement/fix? Announcements can be typed as a message today. This adds the other half: you hold a button in the web UI and talk, and your voice comes out of the chosen speaker. The audio arrives over an authenticated WebSocket on the webserver and is served back out as a WAV url on the stream server, which the existing announcement renderer pulls like any other source. Nothing in the announcement or player path changes. The microphone needs a secure connection, so the UI only offers this where the browser allows it: the hosted app, Home Assistant ingress (with HA on https), Music Assistant with SSL enabled, or localhost. **Related issue (if applicable):** - n/a **Companion frontend PR:** - https://github.com/music-assistant/frontend/pull/2471 ## Types of changes - [ ] Bugfix (non-breaking change which fixes an issue) — `bugfix` - [ ] New feature (non-breaking change which adds functionality) — `new-feature` - [x] Enhancement to an existing feature — `enhancement` - [ ] New music/player/metadata/plugin provider — `new-provider` - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) — `breaking-change` - [ ] Refactor (no behaviour change) — `refactor` - [ ] Documentation only — `documentation` - [ ] Maintenance / chore — `maintenance` - [ ] CI / workflow change — `ci` - [ ] Dependencies bump — `dependencies` ## Changes - new `live_announcements` module: the session buffer, the inbound WebSocket route and the outbound WAV route - the clip is announced once it is complete, so every player gets it whole — AirPlay needs that to schedule one synchronized instant across a group, and Sonos to know how long it runs - a clip ends on the stop message, on disconnect, after 10s of silence, or at the existing 300s announcement cap; a press that captures nothing is not announced at all - the announcement runs as the user who spoke it, so their player restrictions apply - data channels in the remote-access gateway are now routed by label, so this works over a remote connection as well as Sendspin does - the streaming WAV header helper moved to `helpers/audio` so both callers share it ## Checklist - [x] The code change is tested and works locally. - [x] `pre-commit run --all-files` passes. - [x] `pytest` passes, and tests have been added/updated under `tests/` where applicable. - [ ] For changes to shared models, the companion PR in `music-assistant/models` is linked. - [x] For changes affecting the UI, the companion PR in `music-assistant/frontend` is linked. - [x] I have read and complied with the project's [AI Policy](https://github.com/music-assistant/.github/blob/main/AI_POLICY.md) for any AI-assisted contributions. - [ ] I have [raised a PR against the documentation repository](https://github.com/music-assistant/music-assistant.io/blob/main/CONTRIBUTING.md) targeting the main or beta branch as appropriate.