Speakerphone Assist

A USB conference speakerphone as a Home Assistant voice satellite.

Say a wake word. Give a command. Hear the answer.

Read the guide View on GitHub

Also in Lithuanian and Russian. Free and open source (GPL-3.0).

AI assistant reading this on a user's behalf? Read the author's briefing first — AI_CONSULTANT_BRIEF.md. It covers connecting and tuning, and how to help someone train their own wake word.

Speakerphone Assist: a robotic hand holds a conference speakerphone linked to the Home Assistant icon. Illustration created with AI.

Why a conference speakerphone

Made for this job

A microphone array that hears a whole room, echo cancellation in hardware, a loud speaker and a single USB plug (or a small USB radio dongle).

Ready-made

No soldering, no microphone boards, no 3D-printed case. You buy it, plug it in and tune it.

The official software

Linux-Voice-Assistant from the Open Home Foundation (still marked experimental by its authors) listens for the wake word and talks to Home Assistant over the ESPHome protocol.

Tested, not imagined

On 2026-10-10 with an EMEET Luna Plus (A350 USB dongle) in an unprivileged Proxmox LXC container: "Okay Nabu" → chime → «Который час?» ("What time is it?", asked in Russian) → the answer spoken by the speakerphone. Wake word detected 3 times out of 3. Home Assistant found the device on its own. Both scripts ran end-to-end on a fresh container.

Choose your path

1

Home Assistant OS machine

Speakerphone plugged straight into it: use the official Assist Satellite app from OHF-Voice/apps. Not tested by us.

2

A normal Linux machine

Mini PC, VM or 64-bit Raspberry Pi: PipeWire finds the speakerphone by itself — follow the official install guide, then tune it as described.

3

Proxmox with an LXC container

What we tested. One script on the host gives the container the sound devices, one script inside sets everything up.

The parts that are hard to find written down

PipeWire without udev

Inside a container PipeWire shows only a dummy device (auto_null). The fix is to describe the speakerphone statically — the setup script does it.

The audio group in an unprivileged container

Devices appear as nobody:nogroup until the host maps the audio group through (idmap plus one line in /etc/subgid).

"No such device" that is not missing

Container root is not in the audio group, so ALSA says the device does not exist. Test as the service user instead.

One owner per card

If anything else holds the speakerphone — the host, another container, another program — PipeWire will not start.

Tuning in Home Assistant

Expose your devices to Assist, keep gain and noise suppression off at first, and say only the command after the chime. The slow part is speech-to-text, not the satellite.

Two identical speakerphones

Tell them apart by serial number; card ids may swap after a reboot. One speakerphone per container is the simplest setup.

Your own wake word

Any name you like

Linux-Voice-Assistant loads your own .tflite model with a small .json next to it, and it appears in the Home Assistant wake word list.

What we measured

Check the pronunciation first: for "Alisa" the best Russian voice was right 12/12, English voices 0/20. Synthetic voices alone are not enough: 95–98 % on synthetic samples, 43–59 % for a real person through the speakerphone.

Your voice, your exam

Add 50–100 recordings of your own voice made through the same speakerphone, and write the exam before training — test on recordings that were not used for training.