229 lines
6.2 KiB
Markdown
229 lines
6.2 KiB
Markdown
# Linux Voice Assistant on 2‑Mic Linux — Installation & Configuration Guide
|
||
|
||
> Created using ChatGPT 5 with the following prompt:
|
||
|
||
>> Using the following github document as a guide
|
||
>> https://github.com/rhasspy/wyoming-satellite/blob/master/docs/tutorial_2mic.md,
|
||
>> take the attached bash history of commands and create a similar document
|
||
>> detailing the installation and configuration of this linux-voice-assistant project.
|
||
|
||
> Modeled after the Wyoming Satellite two‑mic tutorial, adapted from actual shell history.
|
||
|
||
This guide reproduces a working setup of the **linux-voice-assistant** project with **Wyoming OpenWakeWord** on a Linux host with a 2‑mic HAT (e.g., seeed-2mic-voicecard). It assumes a fresh system with sudo access.
|
||
|
||
## Prerequisites
|
||
- A Linux system (Debian/Ubuntu/Raspberry Pi OS or compatible)
|
||
- Python 3.11+ recommended
|
||
- A 2‑mic sound card
|
||
- Network access to your Home Assistant instance
|
||
|
||
## 1. Install system packages
|
||
|
||
```bash
|
||
sudo apt update
|
||
sudo apt upgrade
|
||
sudo apt install libportaudio2 build-essential git libmpv-dev mpv python3.11-dev
|
||
sudo reboot
|
||
```
|
||
|
||
|
||
## 2. Get the code
|
||
|
||
```bash
|
||
git clone https://github.com/imonlinux/linux-voice-assistant.git
|
||
git clone https://github.com/rhasspy/wyoming-openwakeword.git
|
||
```
|
||
|
||
|
||
## 3. Wyoming OpenWakeWord (OWW)
|
||
|
||
```bash
|
||
cp ./linux-voice-assistant/wyoming-openwakeword/requirements.txt ./wyoming-openwakeword/requirements.txt
|
||
cd wyoming-openwakeword/
|
||
script/setup
|
||
```
|
||
|
||
|
||
## 4. Configure audio devices
|
||
|
||
Find your input/output device names and update the linux-voice-assistant/service/linux-voice-assistant.service file to match sound card details:
|
||
```bash
|
||
arecord -l
|
||
aplay -l
|
||
```
|
||
|
||
|
||
## 5. Systemd services
|
||
|
||
Copy the 2 service files into /etc/systemd/system/:
|
||
```bash
|
||
sudo cp ./service/linux-voice-assistant.service /etc/systemd/system/linux-voice-assistant.service
|
||
sudo cp ./service/wyoming-openwakeword.service /etc/systemd/system/wyoming-openwakeword.service
|
||
```
|
||
Start new services and confirm services are running:
|
||
```bash
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now linux-voice-assistant
|
||
sudo systemctl status linux-voice-assistant wyoming-openwakeword --no-pager -l
|
||
```
|
||
|
||
|
||
## 6. Connect to Home Assistant
|
||
|
||
1. In Home Assistant, go to "Settings" -> "Device & services"
|
||
2. Click the "Add integration" button
|
||
3. Choose "ESPHome" and then "Set up another instance of ESPHome"
|
||
4. Enter the IP address of your voice satellite with port 6053
|
||
5. Click "Submit"
|
||
|
||
|
||
## 7. Verification
|
||
|
||
- Expect logs like `Connected to Home Assistant`
|
||
- Look for `[OWW] Detection: name=...` followed by re-arming/cycling
|
||
- Ask: *“What time is it?”* and confirm TTS reply
|
||
|
||
|
||
## 8. Change OWW detection model
|
||
|
||
Edit the linux-voice-assistant.service file and change the OWW configuration argument for --wake-word-name.
|
||
Project OWW models include:
|
||
|
||
```text
|
||
alexa_v0.1.tflite
|
||
embedding_model.tflite
|
||
hey_jarvis_v0.1.tflite
|
||
hey_mycroft_v0.1.tflite
|
||
hey_rhasspy_v0.1.tflite
|
||
melspectrogram.tflite
|
||
ok_nabu_v0.1.tflite
|
||
```
|
||
|
||
Additional community provided OWW models available from this repository:
|
||
https://github.com/fwartner/home-assistant-wakewords-collection
|
||
|
||
Service file as provided using OWW 'ok_nabu':
|
||
```bash
|
||
sudo systemctl edit --force --full linux-voice-assistant.service
|
||
```
|
||
|
||
```text
|
||
[Unit]
|
||
Description=Linux Voice Assistant
|
||
Requires=wyoming-openwakeword.service
|
||
After=sound.target network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
WorkingDirectory=/home/pi/linux-voice-assistant
|
||
ExecStart=/home/pi/linux-voice-assistant/script/run \
|
||
--name 'Linux Satellite' \
|
||
--audio-input-device seeed-2mic-voicecard \
|
||
--audio-output-device alsa/hw:2,0 \
|
||
--wake-uri 'tcp://127.0.0.1:10400' \
|
||
--wake-word-name 'ok_nabu'
|
||
Restart=always
|
||
RestartSec=2
|
||
Environment=PYTHONUNBUFFERED=1
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
Service file using OWW 'alexa':
|
||
```bash
|
||
sudo systemctl edit --force --full linux-voice-assistant.service
|
||
```
|
||
|
||
```text
|
||
[Unit]
|
||
Description=Linux Voice Assistant
|
||
Requires=wyoming-openwakeword.service
|
||
After=sound.target network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
WorkingDirectory=/home/pi/linux-voice-assistant
|
||
ExecStart=/home/pi/linux-voice-assistant/script/run \
|
||
--name 'Linux Satellite' \
|
||
--audio-input-device seeed-2mic-voicecard \
|
||
--audio-output-device alsa/hw:2,0 \
|
||
--wake-uri 'tcp://127.0.0.1:10400' \
|
||
--wake-word-name 'alexa'
|
||
Restart=always
|
||
RestartSec=2
|
||
Environment=PYTHONUNBUFFERED=1
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
Reload systemd with updated linux-voice-assistant.service file and restart linux-voice-assistant.service and confirm successful run:
|
||
```bash
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl restart linux-voice-assistant.service
|
||
sudo systemctl status linux-voice-assistant wyoming-openwakeword --no-pager -l
|
||
```
|
||
|
||
## 9. Revert to MicroWakeWord
|
||
|
||
Edit the linux-voice-assistant.service file and remove the OWW configuration arguments:
|
||
Service file with OWW:
|
||
```bash
|
||
sudo systemctl edit --force --full linux-voice-assistant.service
|
||
```
|
||
|
||
```text
|
||
[Unit]
|
||
Description=Linux Voice Assistant
|
||
Requires=wyoming-openwakeword.service
|
||
After=sound.target network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
WorkingDirectory=/home/pi/linux-voice-assistant
|
||
ExecStart=/home/pi/linux-voice-assistant/script/run \
|
||
--name 'Linux Satellite' \
|
||
--audio-input-device seeed-2mic-voicecard \
|
||
--audio-output-device alsa/hw:2,0 \
|
||
--wake-uri 'tcp://127.0.0.1:10400' \
|
||
--wake-word-name 'ok_nabu'
|
||
Restart=always
|
||
RestartSec=2
|
||
Environment=PYTHONUNBUFFERED=1
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
Service file without OWW:
|
||
```text
|
||
[Unit]
|
||
Description=Linux Voice Assistant
|
||
Requires=wyoming-openwakeword.service
|
||
After=sound.target network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
WorkingDirectory=/home/pi/linux-voice-assistant
|
||
ExecStart=/home/pi/linux-voice-assistant/script/run \
|
||
--name 'Linux Satellite' \
|
||
--audio-input-device seeed-2mic-voicecard \
|
||
--audio-output-device alsa/hw:2,0
|
||
Restart=always
|
||
RestartSec=2
|
||
Environment=PYTHONUNBUFFERED=1
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
Reload systemd with updated linux-voice-assistant.service file and restart linux-voice-assistant.service and confirm successful run:
|
||
```bash
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl restart linux-voice-assistant.service
|
||
sudo systemctl status linux-voice-assistant wyoming-openwakeword --no-pager -l
|
||
```
|