Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d84fa0898 | ||
|
|
eb29a00386 | ||
|
|
06f7256ebf | ||
|
|
17e3ee061b | ||
|
|
fc2780d92e | ||
|
|
32f6de6222 | ||
|
|
ec70b3b58d | ||
|
|
b339f76b7d | ||
|
|
4ba509ab41 | ||
|
|
34edd1e67d | ||
|
|
957cd205ef | ||
|
|
2a4a08a55b | ||
|
|
19c4c2337f | ||
|
|
b1e36b0cc3 | ||
|
|
0e9f149cc2 |
No files matched your search
+11
-2
@@ -45,12 +45,18 @@ LVA_PULSE_COOKIE="/run/user/${LVA_USER_ID}/pulse/cookie"
|
||||
### Audio output device (optional):
|
||||
# AUDIO_OUTPUT_DEVICE="default"
|
||||
|
||||
### Mic Gain (optional) passed as an argument to LVA will overide the value in thepreferences file on boot but can be changed at runtime in Home Assistant:
|
||||
### Microphone volume level (optional):
|
||||
# MIC_VOLUME="100"
|
||||
|
||||
### Mic Gain (optional) passed as an argument to LVA will overide the value in the preferences file on boot but can be changed at runtime in Home Assistant:
|
||||
# MIC_AUTO_GAIN="0"
|
||||
|
||||
### Mic Noise Suppression (optional) passed as an argument to LVA will overide the value in thepreferences file on boot but can be changed at runtime in Home Assistant:
|
||||
### Mic Noise Suppression (optional) passed as an argument to LVA will overide the value in the preferences file on boot but can be changed at runtime in Home Assistant:
|
||||
# MIC_NOISE_SUPPRESSION="0"
|
||||
|
||||
### Number of mic channels to stream
|
||||
# AUDIO_INPUT_CHANNELS=2
|
||||
|
||||
### Enable thinking sound (optional):
|
||||
# ENABLE_THINKING_SOUND="1"
|
||||
|
||||
@@ -70,6 +76,9 @@ LVA_PULSE_COOKIE="/run/user/${LVA_USER_ID}/pulse/cookie"
|
||||
### Refactory seconds (optional):
|
||||
# REFACTORY_SECONDS="2"
|
||||
|
||||
### Delay before mic opens for continued conversation (optional):
|
||||
# CONTINUE_CONVERSATION_DELAY="0.5"
|
||||
|
||||
### Sound files (optional):
|
||||
# path for custom files in docker is for example "sounds/custom/your_soundfile.flac"
|
||||
# WAKEUP_SOUND="sounds/wake_word_triggered.flac"
|
||||
|
||||
+273
-94
@@ -1,119 +1,298 @@
|
||||
# Changelog
|
||||
<a id="v1.1.11"></a>
|
||||
# [v1.1.11](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.11) - 2026-06-11
|
||||
|
||||
## 1.1.9
|
||||
|
||||
### Improvements
|
||||
- Cookie file and other default parameters by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/231
|
||||
|
||||
## 1.1.8
|
||||
|
||||
### Features
|
||||
- Add changelog generator based on release information by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/226
|
||||
|
||||
## 1.1.7
|
||||
|
||||
### Exciting New Features 🎉
|
||||
- Add linting scripts and pipeline by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/201
|
||||
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
||||
|
||||
## What's Changed
|
||||
### Other Changes
|
||||
- add build flag option for low end devices by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/189
|
||||
- replaced branch build by PR build only by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/203
|
||||
- Change when lint pipeline will start by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/204
|
||||
- fix(script): use os.environ instead of subprocess.environ in setup script by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/205
|
||||
- docs: add documentation for low power device setup and improve setup script by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/206
|
||||
- fix: cookie error (#127) by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/210
|
||||
- fix(config): remove unix: prefix from default pulseaudio socket path … by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/221
|
||||
- Update the changelog file automatically on each release by @omaramin-2000 in https://github.com/OHF-Voice/linux-voice-assistant/pull/224
|
||||
- Enhance hardware compatibility details in README by @Hedda in https://github.com/OHF-Voice/linux-voice-assistant/pull/222
|
||||
- add changelog based on release notes by @florian-asche in https://github.com/OHF-Voice/linux-voice-assistant/pull/225
|
||||
* docs(readme): restructure requirements and hardware section by [@florian-asche](https://github.com/florian-asche) in [#321](https://github.com/OHF-Voice/linux-voice-assistant/pull/321)
|
||||
* App for HAOS by [@omaramin-2000](https://github.com/omaramin-2000) in [#325](https://github.com/OHF-Voice/linux-voice-assistant/pull/325)
|
||||
* Add volume arg to parser by [@aryanhasgithub](https://github.com/aryanhasgithub) in [#335](https://github.com/OHF-Voice/linux-voice-assistant/pull/335)
|
||||
* Enhance wake word documentation by [@omaramin-2000](https://github.com/omaramin-2000) in [#336](https://github.com/OHF-Voice/linux-voice-assistant/pull/336)
|
||||
|
||||
## 1.1.6
|
||||
|
||||
### Bug Fixes
|
||||
- Start listening after wakeup sound
|
||||
- Prevent wake word from interrupting active voice pipeline
|
||||
- Ensure wake word state is set after the wake sound
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.10...v1.1.11
|
||||
|
||||
### Improvements
|
||||
- Script/run error handling and return code consistency
|
||||
- Move port check into Python application
|
||||
- Help output on application parameters
|
||||
- Added default sample rate to pulse documentation
|
||||
[Changes][v1.1.11]
|
||||
|
||||
## 1.1.5
|
||||
|
||||
### Bug Fixes
|
||||
- Fix timer finished sound not looping
|
||||
- Suppress spurious end-file event when starting playback
|
||||
- Fix tts.speak and announce
|
||||
- Fix duck/unduck on timers
|
||||
<a id="v1.1.10"></a>
|
||||
# [v1.1.10](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.10) - 2026-04-23
|
||||
|
||||
### Improvements
|
||||
- Volume persistence across restarts
|
||||
- Enhance play method for playlist support
|
||||
- Add version and hash to docker container
|
||||
- Allow portainer stack to point directly to docker-compose.yml
|
||||
- Improve documentation
|
||||
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
||||
|
||||
## 1.1.4
|
||||
## What's Changed
|
||||
### Exciting New Features 🎉
|
||||
* Add support for WebRTC Auto Gain and Noise Suppression by [@aryanhasgithub](https://github.com/aryanhasgithub) in [#250](https://github.com/OHF-Voice/linux-voice-assistant/pull/250)
|
||||
* Add Instructions for enabling AEC by [@aryanhasgithub](https://github.com/aryanhasgithub) in [#254](https://github.com/OHF-Voice/linux-voice-assistant/pull/254)
|
||||
* Discover project version from Git tags by [@mweinelt](https://github.com/mweinelt) in [#270](https://github.com/OHF-Voice/linux-voice-assistant/pull/270)
|
||||
* Output only satellite by [@jaminh](https://github.com/jaminh) in [#182](https://github.com/OHF-Voice/linux-voice-assistant/pull/182)
|
||||
* Wake word sensitivity by [@florian-asche](https://github.com/florian-asche) in [#207](https://github.com/OHF-Voice/linux-voice-assistant/pull/207)
|
||||
### Other Changes
|
||||
* Revise intro to Linux-Voice-Assistant in README by [@Hedda](https://github.com/Hedda) in [#223](https://github.com/OHF-Voice/linux-voice-assistant/pull/223)
|
||||
* small typo inside the .env file by [@nielsnl68](https://github.com/nielsnl68) in [#235](https://github.com/OHF-Voice/linux-voice-assistant/pull/235)
|
||||
* Move examples by [@jaminh](https://github.com/jaminh) in [#193](https://github.com/OHF-Voice/linux-voice-assistant/pull/193)
|
||||
* Hotfix/build pipeline by [@florian-asche](https://github.com/florian-asche) in [#253](https://github.com/OHF-Voice/linux-voice-assistant/pull/253)
|
||||
* Cleanup mac address by [@nielsnl68](https://github.com/nielsnl68) in [#249](https://github.com/OHF-Voice/linux-voice-assistant/pull/249)
|
||||
* Fix double _tts_finished() call when stop word interrupts TTS by [@interkelstar](https://github.com/interkelstar) in [#256](https://github.com/OHF-Voice/linux-voice-assistant/pull/256)
|
||||
* Add debug logging for stop word detection by [@interkelstar](https://github.com/interkelstar) in [#257](https://github.com/OHF-Voice/linux-voice-assistant/pull/257)
|
||||
* Add maximum seconds for ringing timer by [@omaramin-2000](https://github.com/omaramin-2000) in [#261](https://github.com/OHF-Voice/linux-voice-assistant/pull/261)
|
||||
* Fix lint formatting by [@omaramin-2000](https://github.com/omaramin-2000) in [#262](https://github.com/OHF-Voice/linux-voice-assistant/pull/262)
|
||||
* Update README removing colon signs section headers by [@Hedda](https://github.com/Hedda) in [#265](https://github.com/OHF-Voice/linux-voice-assistant/pull/265)
|
||||
* Update package inclusion to include subpackages: Python Module Hotfix by [@aryanhasgithub](https://github.com/aryanhasgithub) in [#245](https://github.com/OHF-Voice/linux-voice-assistant/pull/245)
|
||||
* Fixed PipeWire setup by [@aryanhasgithub](https://github.com/aryanhasgithub) in [#258](https://github.com/OHF-Voice/linux-voice-assistant/pull/258)
|
||||
* Expose linux-voice-assistant console script by [@mweinelt](https://github.com/mweinelt) in [#268](https://github.com/OHF-Voice/linux-voice-assistant/pull/268)
|
||||
* Start listening after stopping ringing timer using wake word by [@omaramin-2000](https://github.com/omaramin-2000) in [#275](https://github.com/OHF-Voice/linux-voice-assistant/pull/275)
|
||||
* fix(docker): simplify PulseAudio cookie file creation by [@florian-asche](https://github.com/florian-asche) in [#276](https://github.com/OHF-Voice/linux-voice-assistant/pull/276)
|
||||
* docs(config): document timer max ring seconds configuration by [@florian-asche](https://github.com/florian-asche) in [#277](https://github.com/OHF-Voice/linux-voice-assistant/pull/277)
|
||||
* Output only satellite - part 2 by [@florian-asche](https://github.com/florian-asche) in [#278](https://github.com/OHF-Voice/linux-voice-assistant/pull/278)
|
||||
* Add the ability to control microphone volume by [@omaramin-2000](https://github.com/omaramin-2000) in [#287](https://github.com/OHF-Voice/linux-voice-assistant/pull/287)
|
||||
* Fix audio cuts and playback issues by [@omaramin-2000](https://github.com/omaramin-2000) in [#296](https://github.com/OHF-Voice/linux-voice-assistant/pull/296)
|
||||
* docs(install): clarify linger is required on headless systems by [@genericJE](https://github.com/genericJE) in [#299](https://github.com/OHF-Voice/linux-voice-assistant/pull/299)
|
||||
* Fix README.md typo by [@AlecJDavidson](https://github.com/AlecJDavidson) in [#303](https://github.com/OHF-Voice/linux-voice-assistant/pull/303)
|
||||
* Allow option to have docker use nightly build by [@lowlyocean](https://github.com/lowlyocean) in [#302](https://github.com/OHF-Voice/linux-voice-assistant/pull/302)
|
||||
* feat(docker): add custom image and tag env configuration by [@florian-asche](https://github.com/florian-asche) in [#306](https://github.com/OHF-Voice/linux-voice-assistant/pull/306)
|
||||
* Downgrade to Python 3.12 for quicker webrtc builds by [@aryanhasgithub](https://github.com/aryanhasgithub) in [#305](https://github.com/OHF-Voice/linux-voice-assistant/pull/305)
|
||||
|
||||
### Improvements
|
||||
- Added custom paths to docker for wakeword and sounds
|
||||
- Added wake-word-dir variable
|
||||
- Changed default pipewire configuration
|
||||
- Updated documentation regarding wakeword and sounds
|
||||
- Documentation corrections
|
||||
## New Contributors
|
||||
* [@nielsnl68](https://github.com/nielsnl68) made their first contribution in [#235](https://github.com/OHF-Voice/linux-voice-assistant/pull/235)
|
||||
* [@aryanhasgithub](https://github.com/aryanhasgithub) made their first contribution in [#254](https://github.com/OHF-Voice/linux-voice-assistant/pull/254)
|
||||
* [@interkelstar](https://github.com/interkelstar) made their first contribution in [#256](https://github.com/OHF-Voice/linux-voice-assistant/pull/256)
|
||||
* [@mweinelt](https://github.com/mweinelt) made their first contribution in [#270](https://github.com/OHF-Voice/linux-voice-assistant/pull/270)
|
||||
* [@genericJE](https://github.com/genericJE) made their first contribution in [#299](https://github.com/OHF-Voice/linux-voice-assistant/pull/299)
|
||||
* [@AlecJDavidson](https://github.com/AlecJDavidson) made their first contribution in [#303](https://github.com/OHF-Voice/linux-voice-assistant/pull/303)
|
||||
|
||||
## 1.1.3
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.9...v1.1.10
|
||||
|
||||
### Bug Fixes
|
||||
- Hotfix: typo in network-interface output order causing application crash
|
||||
[Changes][v1.1.10]
|
||||
|
||||
### Documentation
|
||||
- Correct LVA_USER_ID variable name
|
||||
|
||||
## 1.1.2
|
||||
<a id="v1.1.9"></a>
|
||||
# [v1.1.9](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.9) - 2026-03-11
|
||||
|
||||
### Breaking Changes
|
||||
- MAC address detection has been fixed. After updating, it may be necessary
|
||||
to remove and re-add the device in Home Assistant.
|
||||
- The docker-compose.yml and .env.example files were updated. Please review
|
||||
and adapt your configuration if required.
|
||||
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
||||
|
||||
### Features
|
||||
- Add variable for network-interface with auto-detection enabled by default
|
||||
- Add MAC address autodetection based on detected or specified network interface
|
||||
- Switch from listening on all IP addresses to binding to the IP of the default interface
|
||||
- Move auto-name creation from shell to Python (name is now optional and auto-generated)
|
||||
- Add first version of docker-compose for developers
|
||||
- Changes EXTRA_ARGS variable to bash array for better variable expansion
|
||||
## What's Changed
|
||||
### Other Changes
|
||||
* Cookie file and other default parameters by [@florian-asche](https://github.com/florian-asche) in [#231](https://github.com/OHF-Voice/linux-voice-assistant/pull/231)
|
||||
|
||||
### Bug Fixes
|
||||
- Fix non-working variables (e.g. sound-files)
|
||||
- Fix client-name validation (no spaces allowed)
|
||||
- Fix example configuration
|
||||
|
||||
## 1.1.1
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.8...v1.1.9
|
||||
|
||||
### Bug Fixes
|
||||
- Handle STOP command correctly in media_player
|
||||
[Changes][v1.1.9]
|
||||
|
||||
## 1.1.0
|
||||
|
||||
### Features
|
||||
- Support custom/external wake words
|
||||
- Add an option to play thinking sound
|
||||
- Add mute/unmute sounds
|
||||
- Add sound customization
|
||||
- Handle announcement separately from the media player
|
||||
- Add Docker build pipeline and compose files
|
||||
- Don't require name for list commands
|
||||
<a id="v1.1.8"></a>
|
||||
# [v1.1.8](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.8) - 2026-03-11
|
||||
|
||||
### Bug Fixes
|
||||
- Fix PEP 508 dependency operator
|
||||
- Fix mpv pause state when loading new media
|
||||
- Fix issues with audio handling
|
||||
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
||||
|
||||
## 1.0.0
|
||||
## What's Changed
|
||||
### Other Changes
|
||||
* Add changelog generator based on release information by [@florian-asche](https://github.com/florian-asche) in [#226](https://github.com/OHF-Voice/linux-voice-assistant/pull/226)
|
||||
|
||||
- Initial release
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.7...v1.1.8
|
||||
|
||||
[Changes][v1.1.8]
|
||||
|
||||
|
||||
<a id="v1.1.7"></a>
|
||||
# [v1.1.7](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.7) - 2026-03-11
|
||||
|
||||
<!-- Release notes generated using configuration in .github/release.yml at main -->
|
||||
|
||||
## What's Changed
|
||||
### Exciting New Features 🎉
|
||||
* Add linting scripts and pipeline by [@florian-asche](https://github.com/florian-asche) in [#201](https://github.com/OHF-Voice/linux-voice-assistant/pull/201)
|
||||
### Other Changes
|
||||
* add build flag option for low end devices by [@florian-asche](https://github.com/florian-asche) in [#189](https://github.com/OHF-Voice/linux-voice-assistant/pull/189)
|
||||
* replaced branch build by PR build only by [@florian-asche](https://github.com/florian-asche) in [#203](https://github.com/OHF-Voice/linux-voice-assistant/pull/203)
|
||||
* Change when lint pipeline will start by [@florian-asche](https://github.com/florian-asche) in [#204](https://github.com/OHF-Voice/linux-voice-assistant/pull/204)
|
||||
* fix(script): use os.environ instead of subprocess.environ in setup script by [@florian-asche](https://github.com/florian-asche) in [#205](https://github.com/OHF-Voice/linux-voice-assistant/pull/205)
|
||||
* docs: add documentation for low power device setup and improve setup script by [@florian-asche](https://github.com/florian-asche) in [#206](https://github.com/OHF-Voice/linux-voice-assistant/pull/206)
|
||||
* fix: cookie error ([#127](https://github.com/OHF-Voice/linux-voice-assistant/issues/127)) by [@florian-asche](https://github.com/florian-asche) in [#210](https://github.com/OHF-Voice/linux-voice-assistant/pull/210)
|
||||
* fix(config): remove unix: prefix from default pulseaudio socket path … by [@florian-asche](https://github.com/florian-asche) in [#221](https://github.com/OHF-Voice/linux-voice-assistant/pull/221)
|
||||
* Update the changelog file automatically on each release by [@omaramin-2000](https://github.com/omaramin-2000) in [#224](https://github.com/OHF-Voice/linux-voice-assistant/pull/224)
|
||||
* Enhance hardware compatibility details in README by [@Hedda](https://github.com/Hedda) in [#222](https://github.com/OHF-Voice/linux-voice-assistant/pull/222)
|
||||
* add changelog based on release notes by [@florian-asche](https://github.com/florian-asche) in [#225](https://github.com/OHF-Voice/linux-voice-assistant/pull/225)
|
||||
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.6...v1.1.7
|
||||
|
||||
[Changes][v1.1.7]
|
||||
|
||||
|
||||
<a id="v1.1.6"></a>
|
||||
# [v1.1.6](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.6) - 2026-03-04
|
||||
|
||||
## What's Changed
|
||||
* Bugfix: start listening after wakeup sound by [@florian-asche](https://github.com/florian-asche) in [#185](https://github.com/OHF-Voice/linux-voice-assistant/pull/185)
|
||||
* added default sample rate to pulse documentation by [@florian-asche](https://github.com/florian-asche) in [#190](https://github.com/OHF-Voice/linux-voice-assistant/pull/190)
|
||||
* Bugfix: Prevent wake word from interrupting active voice pipeline by [@ekiczek](https://github.com/ekiczek) in [#151](https://github.com/OHF-Voice/linux-voice-assistant/pull/151)
|
||||
* Bugfix: ensure wake word state is set after the wake sound by [@florian-asche](https://github.com/florian-asche) in [#198](https://github.com/OHF-Voice/linux-voice-assistant/pull/198)
|
||||
* Improvement: script/run error handling and return code consistency by [@florian-asche](https://github.com/florian-asche) in [#186](https://github.com/OHF-Voice/linux-voice-assistant/pull/186)
|
||||
* Improvement: move portcheck into python application by [@florian-asche](https://github.com/florian-asche) in [#187](https://github.com/OHF-Voice/linux-voice-assistant/pull/187)
|
||||
* Improvement: help output on application parameters by [@florian-asche](https://github.com/florian-asche) in [#188](https://github.com/OHF-Voice/linux-voice-assistant/pull/188)
|
||||
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.5...v1.1.6
|
||||
|
||||
[Changes][v1.1.6]
|
||||
|
||||
|
||||
<a id="v1.1.5"></a>
|
||||
# [v1.1.5](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.5) - 2026-02-27
|
||||
|
||||
## What's Changed
|
||||
* Improve documentation by [@florian-asche](https://github.com/florian-asche) in [#166](https://github.com/OHF-Voice/linux-voice-assistant/pull/166)
|
||||
* Add version and hash to docker container by [@florian-asche](https://github.com/florian-asche) in [#167](https://github.com/OHF-Voice/linux-voice-assistant/pull/167)
|
||||
* Fix timer finished sound not looping by [@ekiczek](https://github.com/ekiczek) in [#159](https://github.com/OHF-Voice/linux-voice-assistant/pull/159)
|
||||
* Volume persistence across restarts by [@omaramin-2000](https://github.com/omaramin-2000) in [#168](https://github.com/OHF-Voice/linux-voice-assistant/pull/168)
|
||||
* docs: add info about reboot by [@florian-asche](https://github.com/florian-asche) in [#175](https://github.com/OHF-Voice/linux-voice-assistant/pull/175)
|
||||
* Enhance play method for playlist support by [@omaramin-2000](https://github.com/omaramin-2000) in [#172](https://github.com/OHF-Voice/linux-voice-assistant/pull/172)
|
||||
* Allow portainer stack to point directly to docker-compose.yml by [@lowlyocean](https://github.com/lowlyocean) in [#177](https://github.com/OHF-Voice/linux-voice-assistant/pull/177)
|
||||
* Fix: Suppress spurious end-file event when starting playback by [@florian-asche](https://github.com/florian-asche) in [#179](https://github.com/OHF-Voice/linux-voice-assistant/pull/179)
|
||||
* Fix: tts.speak and announce by [@florian-asche](https://github.com/florian-asche) in [#179](https://github.com/OHF-Voice/linux-voice-assistant/pull/179)
|
||||
* Fix: duck unduck on timers by [@florian-asche](https://github.com/florian-asche) in [#179](https://github.com/OHF-Voice/linux-voice-assistant/pull/179)
|
||||
|
||||
## New Contributors
|
||||
* [@ekiczek](https://github.com/ekiczek) made their first contribution in [#159](https://github.com/OHF-Voice/linux-voice-assistant/pull/159)
|
||||
* [@lowlyocean](https://github.com/lowlyocean) made their first contribution in [#177](https://github.com/OHF-Voice/linux-voice-assistant/pull/177)
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.4...v1.1.5
|
||||
|
||||
[Changes][v1.1.5]
|
||||
|
||||
|
||||
<a id="v1.1.4"></a>
|
||||
# [v1.1.4](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.4) - 2026-02-20
|
||||
|
||||
## What's Changed
|
||||
* Documentation: Correct LVA_USER_ID variable name where wrong by [@giobber](https://github.com/giobber) in [#155](https://github.com/OHF-Voice/linux-voice-assistant/pull/155)
|
||||
* Documentation by [@florian-asche](https://github.com/florian-asche) in [#162](https://github.com/OHF-Voice/linux-voice-assistant/pull/162)
|
||||
* Added custom paths to docker for wakeword and sounds by [@florian-asche](https://github.com/florian-asche) in [#165](https://github.com/OHF-Voice/linux-voice-assistant/pull/165)
|
||||
* Changed default pipewire configuration by [@florian-asche](https://github.com/florian-asche) in [#165](https://github.com/OHF-Voice/linux-voice-assistant/pull/165)
|
||||
* Added wake-word-dir variable by [@florian-asche](https://github.com/florian-asche) in [#165](https://github.com/OHF-Voice/linux-voice-assistant/pull/165)
|
||||
* Updated documentation regarding wakeword and sounds and some other things. by [@florian-asche](https://github.com/florian-asche) in [#165](https://github.com/OHF-Voice/linux-voice-assistant/pull/165)
|
||||
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.3...v1.1.4
|
||||
|
||||
[Changes][v1.1.4]
|
||||
|
||||
|
||||
<a id="v1.1.3"></a>
|
||||
# [v1.1.3](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.3) - 2026-02-14
|
||||
|
||||
## Hotfix:
|
||||
Fixed a bug where the application crashes when the new network-interface parameter is used.
|
||||
|
||||
## What's Changed
|
||||
* Update documentation, correcting typo by [@giobber](https://github.com/giobber) in [#144](https://github.com/OHF-Voice/linux-voice-assistant/pull/144)
|
||||
* Hotfix: Typo in network-interface output order by [@florian-asche](https://github.com/florian-asche) in [#146](https://github.com/OHF-Voice/linux-voice-assistant/pull/146)
|
||||
|
||||
## New Contributors
|
||||
* [@giobber](https://github.com/giobber) made their first contribution in [#144](https://github.com/OHF-Voice/linux-voice-assistant/pull/144)
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.2...v1.1.3
|
||||
|
||||
[Changes][v1.1.3]
|
||||
|
||||
|
||||
<a id="v1.1.2"></a>
|
||||
# [v1.1.2](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.2) - 2026-02-13
|
||||
|
||||
## Breaking Change
|
||||
* A previous bug in the MAC address detection could have resulted in a device being created with an incorrect address. After installing the new version, it may be necessary to remove and re-add the device in Home Assistant.
|
||||
* The docker-compose.yml and .env.example files were updated. Please review and adapt your configuration if required.
|
||||
|
||||
## What's Changed
|
||||
* Add open home foundation badge to readme by [@omaramin-2000](https://github.com/omaramin-2000) in [#138](https://github.com/OHF-Voice/linux-voice-assistant/pull/138)
|
||||
* Update README.md by [@Hedda](https://github.com/Hedda) in [#31](https://github.com/OHF-Voice/linux-voice-assistant/pull/31)
|
||||
* Changes EXTRA_ARGS variable to bash array to better handle variable expansion by [@Ziris85](https://github.com/Ziris85) in [#136](https://github.com/OHF-Voice/linux-voice-assistant/pull/136)
|
||||
* change client-name validation (no spaces allowed) and fix example configuration by [@florian-asche](https://github.com/florian-asche) in [#139](https://github.com/OHF-Voice/linux-voice-assistant/pull/139)
|
||||
* add first version of docker-compose for developers by [@florian-asche](https://github.com/florian-asche) in [#139](https://github.com/OHF-Voice/linux-voice-assistant/pull/139)
|
||||
* add variable for network-interface with auto-detection enabled by default by [@florian-asche](https://github.com/florian-asche) in [#139](https://github.com/OHF-Voice/linux-voice-assistant/pull/139)
|
||||
* add mac-address autodetection based on detected or specified network-interface by [@florian-asche](https://github.com/florian-asche) in [#139](https://github.com/OHF-Voice/linux-voice-assistant/pull/139)
|
||||
* switch from listening on all ip-addresses to binding to the ip-address of the default interface by [@florian-asche](https://github.com/florian-asche) in [#139](https://github.com/OHF-Voice/linux-voice-assistant/pull/139)
|
||||
* add missing variables and fix variable names by [@florian-asche](https://github.com/florian-asche) in [#139](https://github.com/OHF-Voice/linux-voice-assistant/pull/139)
|
||||
* fix non-working variables (e.g. sound-files) by [@florian-asche](https://github.com/florian-asche) in [#139](https://github.com/OHF-Voice/linux-voice-assistant/pull/139)
|
||||
* move auto-name creation from shell to python (name is now optional and auto-generated if not provided) by [@florian-asche](https://github.com/florian-asche) in [#139](https://github.com/OHF-Voice/linux-voice-assistant/pull/139)
|
||||
* Change download link for docker-compose setup to latest version by [@florian-asche](https://github.com/florian-asche) in [#141](https://github.com/OHF-Voice/linux-voice-assistant/pull/141)
|
||||
|
||||
## New Contributors
|
||||
* [@Hedda](https://github.com/Hedda) made their first contribution in [#31](https://github.com/OHF-Voice/linux-voice-assistant/pull/31)
|
||||
* [@Ziris85](https://github.com/Ziris85) made their first contribution in [#136](https://github.com/OHF-Voice/linux-voice-assistant/pull/136)
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.1...v1.1.2
|
||||
|
||||
[Changes][v1.1.2]
|
||||
|
||||
|
||||
<a id="v1.1.1"></a>
|
||||
# [v1.1.1](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.1) - 2026-02-10
|
||||
|
||||
## What's Changed
|
||||
* media_player: handle STOP command correctly (fixes [#128](https://github.com/OHF-Voice/linux-voice-assistant/issues/128)) by [@pgrafe](https://github.com/pgrafe) in [#129](https://github.com/OHF-Voice/linux-voice-assistant/pull/129)
|
||||
* changed github workflow naming by [@florian-asche](https://github.com/florian-asche) in [#132](https://github.com/OHF-Voice/linux-voice-assistant/pull/132)
|
||||
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.0...v1.1.1
|
||||
|
||||
[Changes][v1.1.1]
|
||||
|
||||
|
||||
<a id="v1.1.0"></a>
|
||||
# [v1.1.0](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.1.0) - 2026-02-10
|
||||
|
||||
## What's Changed
|
||||
* Fix PEP 508 dependency operator: `=>` -> `>=` by [@ms1design](https://github.com/ms1design) in [#14](https://github.com/OHF-Voice/linux-voice-assistant/pull/14)
|
||||
* Support custom/external wake words by [@synesthesiam](https://github.com/synesthesiam) in [#55](https://github.com/OHF-Voice/linux-voice-assistant/pull/55)
|
||||
* Add an option to play thinking sound by [@omaramin-2000](https://github.com/omaramin-2000) in [#30](https://github.com/OHF-Voice/linux-voice-assistant/pull/30)
|
||||
* Add mute/unmute sounds by [@omaramin-2000](https://github.com/omaramin-2000) in [#82](https://github.com/OHF-Voice/linux-voice-assistant/pull/82)
|
||||
* Fix issues [#98](https://github.com/OHF-Voice/linux-voice-assistant/issues/98) and [#87](https://github.com/OHF-Voice/linux-voice-assistant/issues/87) by [@omaramin-2000](https://github.com/omaramin-2000) in [#100](https://github.com/OHF-Voice/linux-voice-assistant/pull/100)
|
||||
* Merge beta changes by [@omaramin-2000](https://github.com/omaramin-2000) in [#112](https://github.com/OHF-Voice/linux-voice-assistant/pull/112)
|
||||
* Add sound customization by [@omaramin-2000](https://github.com/omaramin-2000) in [#116](https://github.com/OHF-Voice/linux-voice-assistant/pull/116)
|
||||
* Fix some format and linting issues by [@jaminh](https://github.com/jaminh) in [#120](https://github.com/OHF-Voice/linux-voice-assistant/pull/120)
|
||||
* removed disconnected log message in process_packet function by [@florian-asche](https://github.com/florian-asche) in [#124](https://github.com/OHF-Voice/linux-voice-assistant/pull/124)
|
||||
* Handle announcement separately from the media player by [@omaramin-2000](https://github.com/omaramin-2000) in [#125](https://github.com/OHF-Voice/linux-voice-assistant/pull/125)
|
||||
* Don't require name for list commands by [@jaminh](https://github.com/jaminh) in [#67](https://github.com/OHF-Voice/linux-voice-assistant/pull/67)
|
||||
* Fix mpv pause state when loading new media by [@pgrafe](https://github.com/pgrafe) in [#123](https://github.com/OHF-Voice/linux-voice-assistant/pull/123)
|
||||
* Add docker build pipeline and compose files by [@florian-asche](https://github.com/florian-asche) in [#118](https://github.com/OHF-Voice/linux-voice-assistant/pull/118)
|
||||
|
||||
## New Contributors
|
||||
* [@ms1design](https://github.com/ms1design) made their first contribution in [#14](https://github.com/OHF-Voice/linux-voice-assistant/pull/14)
|
||||
* [@synesthesiam](https://github.com/synesthesiam) made their first contribution in [#55](https://github.com/OHF-Voice/linux-voice-assistant/pull/55)
|
||||
* [@omaramin-2000](https://github.com/omaramin-2000) made their first contribution in [#30](https://github.com/OHF-Voice/linux-voice-assistant/pull/30)
|
||||
* [@jaminh](https://github.com/jaminh) made their first contribution in [#120](https://github.com/OHF-Voice/linux-voice-assistant/pull/120)
|
||||
* [@florian-asche](https://github.com/florian-asche) made their first contribution in [#124](https://github.com/OHF-Voice/linux-voice-assistant/pull/124)
|
||||
|
||||
**Full Changelog**: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.0.0...v1.1.0
|
||||
|
||||
[Changes][v1.1.0]
|
||||
|
||||
|
||||
<a id="v1.0.0"></a>
|
||||
# [v1.0.0](https://github.com/OHF-Voice/linux-voice-assistant/releases/tag/v1.0.0) - 2025-09-16
|
||||
|
||||
Initial release
|
||||
|
||||
[Changes][v1.0.0]
|
||||
|
||||
|
||||
[v1.1.11]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.10...v1.1.11
|
||||
[v1.1.10]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.9...v1.1.10
|
||||
[v1.1.9]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.8...v1.1.9
|
||||
[v1.1.8]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.7...v1.1.8
|
||||
[v1.1.7]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.6...v1.1.7
|
||||
[v1.1.6]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.5...v1.1.6
|
||||
[v1.1.5]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.4...v1.1.5
|
||||
[v1.1.4]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.3...v1.1.4
|
||||
[v1.1.3]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.2...v1.1.3
|
||||
[v1.1.2]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.1...v1.1.2
|
||||
[v1.1.1]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.1.0...v1.1.1
|
||||
[v1.1.0]: https://github.com/OHF-Voice/linux-voice-assistant/compare/v1.0.0...v1.1.0
|
||||
[v1.0.0]: https://github.com/OHF-Voice/linux-voice-assistant/tree/v1.0.0
|
||||
|
||||
<!-- Generated by https://github.com/rhysd/changelog-from-release v3.9.1 -->
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[](https://github.com/OHF-Voice/linux-voice-assistant/actions/workflows/docker-build-release.yml) [](https://github.com/OHF-Voice/linux-voice-assistant/pkgs/container/linux-voice-assistant) [](https://github.com/OHF-Voice/linux-voice-assistant/blob/main/LICENSE.md) [](https://github.com/OHF-Voice/linux-voice-assistant/commits) [](https://github.com/OHF-Voice/linux-voice-assistant/pkgs/container/linux-voice-assistant)
|
||||
|
||||
An experimental Linux-Voice-Assistant software for [Home Assistant](https://www.home-assistant.io/) remote voice control and interaction.
|
||||
An experimental voice satellite software for [Home Assistant](https://www.home-assistant.io/) remote voice control and interaction.
|
||||
|
||||
This project enables you to build a Linux-based voice assistant designed to use [Assist](https://www.home-assistant.io/voice_control/) for Home Assistant. It allows you to create your own smart speaker that runs on any x64 or ARM64 hardware capable of handling local audio processing (using PulseAudio).
|
||||
|
||||
@@ -24,69 +24,92 @@ Because it runs on a full Linux system and offers access significantly more loca
|
||||
- Prebuild docker image available on [GitHub Container Registry](https://github.com/OHF-Voice/linux-voice-assistant/pkgs/container/linux-voice-assistant)
|
||||
- Prebuild [Raspberry Pi image](https://github.com/florian-asche/PiCompose)
|
||||
|
||||
## Usage
|
||||
## Requirements
|
||||
|
||||
### Hardware
|
||||
- **Microphone:** Device must support 16kHz mono audio
|
||||
- **CPU:** 1Ghz
|
||||
- **Memory:** min. 512MB
|
||||
- **Storage:** The OS and software is around 4GB
|
||||
- **OS:** linux/amd64 or linux/aarch64
|
||||
|
||||
A more extensive list for possible compatible hardware can be found in the [PiCompose documentation](https://github.com/florian-asche/PiCompose) but basically any microphone that works with [PipeWire (multimedia framework for Linux)](https://pipewire.org/) can in theory be used for voice input with the prebuild image from there, you should however preferably use a far-field microphone-array solution if want better result.
|
||||
|
||||
Two solutions recommended for test setups today is to use a Raspberry Pi Zero 2 W SBC (Single Board Computer with built-in WiFi) in combination with the [Satellite1 Hat Board](https://futureproofhomes.net/products/satellite1-top-microphone-board) or the [Respeaker Lite](https://wiki.seeedstudio.com/reSpeaker_usb_v3/). Those have microphone-array designed for far-field voice capture with the added benefit of using an onboard XMOS DSP microcontroller with custom firmware which does advanced audio pre-processing for microphone cleanup that result in very good voice recognition capabilities (as it runs algorithms for Noise Suppression, Acoustic Echo Cancellation, Interference Cancellation, and Automatic Gain Control).
|
||||
Two solutions recommended for setups today is:
|
||||
|
||||
Alternatively if on a lower budget then suggest could try other untested microphone-array boards like example the [reSpeaker 2-Mics Pi HAT V2.0](https://wiki.seeedstudio.com/ReSpeaker_2_Mics_Pi_HAT/) (which uses a much more basic audio codec chip).
|
||||
- use a Raspberry Pi Zero 2W (Single Board Computer with built-in WiFi) in combination with the [Satellite1 Hat Board](https://futureproofhomes.net/products/satellite1-top-microphone-board)
|
||||
- use at least a Raspberry Pi 3 with the [Respeaker Lite](https://wiki.seeedstudio.com/reSpeaker_usb_v3/). The Respeaker Lite currently has a problem with the Zero 2W.
|
||||
|
||||
As for the minimum required compute performance on these satellites the target reference hardware for testing is currently a 64-bit ARM-based SBC based on Raspberry Pi RP3A0 SiP (System-in-Package); which means the Raspberry Pi Zero 2 W, Raspberry Pi Compute Module 3E (Raspberry Pi CM3E), or other development boards that uses the Compute Module Zero" (Raspberry Pi CM0), as all of which have similar specifications to the Raspberry Pi 3 B/B+ but with a CPU running at a lower frequency.
|
||||
Those mic-boards have microphone-array designed for far-field voice capture with the added benefit of using an onboard XMOS DSP microcontroller with custom firmware which does advanced audio pre-processing for microphone cleanup that result in very good voice recognition capabilities (as it runs algorithms for Noise Suppression, Acoustic Echo Cancellation, Interference Cancellation, and Automatic Gain Control).
|
||||
|
||||
But you can also install LVA on AMD64 devices, for example on your Linux desktop computer.
|
||||
Alternatively if on a lower budget then suggest could use other microphone-array boards like for example the [reSpeaker 2-Mics Pi HAT V2.0](https://wiki.seeedstudio.com/ReSpeaker_2_Mics_Pi_HAT/) (which uses a much more basic audio codec chip).
|
||||
|
||||
### Software
|
||||
## Usage
|
||||
|
||||
#### Installation
|
||||
### Installation
|
||||
|
||||
**Assist Satellite app for Home Assistant OS**
|
||||
|
||||
For HA OS, we provide a finished [Assist Satellite](https://github.com/OHF-Voice/apps/tree/main/assist_satellite) app (formerly add-on), which uses the Linux Voice Assistant runtime to turn your HA host into a voice satellite.
|
||||
|
||||
> [!NOTE]
|
||||
> For now you first have to add the [OHF-Voice apps](https://github.com/OHF-Voice/apps) repo manually to the App Store repositroy inside Home Assistant before you can install it.
|
||||
|
||||
Later you will be able to install it directly from the official add-on repository (but it is not yet published publicly there):
|
||||
|
||||
[](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https://github.com/home-assistant/addons)
|
||||
|
||||
Once installed, the satellite is automatically discovered by Home Assistant via the ESPHome integration.
|
||||
|
||||
**Raspberry Pi prebuilt image**
|
||||
|
||||
For Raspberry Pi users, we provide a prebuild image that can be flashed to a SD card. See [PiCompose](https://github.com/florian-asche/PiCompose).
|
||||
|
||||
**Docker / bare metal**
|
||||
|
||||
For all other users, we have different installation methods available (Docker, systemd), each with its own dedicated instructions. See [Linux-Voice-Assistant - Installation](docs/install.md).
|
||||
|
||||
#### Parameter overview
|
||||
### Parameter overview
|
||||
|
||||
💡 **Note:** There is an [environment variable](docs/install_application.md#environment-variables-reference) for each parameter if you use docker or systemd based setup.
|
||||
|
||||
``` sh
|
||||
```sh
|
||||
usage: __main__.py [-h] [--name NAME] [--audio-input-device AUDIO_INPUT_DEVICE] [--list-input-devices] [--audio-input-block-size AUDIO_INPUT_BLOCK_SIZE] [--audio-output-device AUDIO_OUTPUT_DEVICE] [--list-output-devices] [--wake-word-dir WAKE_WORD_DIR] [--mic-auto-gain] [--mic-noise-suppression]
|
||||
[--wake-model WAKE_MODEL] [--stop-model STOP_MODEL] [--download-dir DOWNLOAD_DIR] [--refractory-seconds REFRACTORY_SECONDS] [--wakeup-sound WAKEUP_SOUND] [--timer-finished-sound TIMER_FINISHED_SOUND] [--processing-sound PROCESSING_SOUND]
|
||||
[--mute-sound MUTE_SOUND] [--unmute-sound UNMUTE_SOUND] [--preferences-file PREFERENCES_FILE] [--host HOST] [--network-interface NETWORK_INTERFACE] [--port PORT] [--enable-thinking-sound] [--debug]
|
||||
```
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `--name` | Name of the voice assistant device (required) | Autogenerated (`lva-MAC-ADDRESS`) |
|
||||
| `--audio-input-device` | Soundcard name for input device | Autodetected |
|
||||
| `--audio-input-block-size` | Audio input block size in samples | 1024 |
|
||||
| `--audio-output-device` | mpv name for output device | Autodetected |
|
||||
| `--mic-volume` | Control microphone volume | 1.0 |
|
||||
| `--mic-auto-gain` | Add WebRTC Gain to Mic | 0 |
|
||||
| `--mic-noise-suppression` | Add WebRTC Noise Suppression to Mic | 0 |
|
||||
| `--wake-word-dir` | Directory with wake word models (.tflite) and configs (.json) | `wakewords/` |
|
||||
| `--wake-model` | ID of active wake word model | `okay_nabu` |
|
||||
| `--stop-model` | ID of stop model | `stop` |
|
||||
| `--download-dir` | Directory to download custom wake word models, etc. | `local/` |
|
||||
| `--refractory-seconds` | Seconds before wake word can be activated again | 2.0 |
|
||||
| `--timer-max-ring-seconds` | Seconds after which the timer stops ringing | 900.0 |
|
||||
| `--wakeup-sound` | Sound file played when wake word is detected | `sounds/wake_word_triggered.flac` |
|
||||
| `--timer-finished-sound` | Sound file played when timer finishes | `sounds/timer_finished.flac` |
|
||||
| `--processing-sound` | Sound played while assistant is processing | `sounds/processing.wav` |
|
||||
| `--mute-sound` | Sound played when muting the assistant | `sounds/mute_switch_on.flac` |
|
||||
| `--unmute-sound` | Sound played when unmuting the assistant | `sounds/mute_switch_off.flac` |
|
||||
| `--preferences-file` | Path to preferences JSON file | `preferences.json` |
|
||||
| `--host` | IP-Address for ESPHome server, use 0.0.0.0 for all | Autodetected |
|
||||
| `--network-interface` | Network interface for ESPHome server | Autodetected |
|
||||
| `--port` | Port for ESPHome server | 6053 |
|
||||
| `--enable-thinking-sound` | Enable thinking sound on startup | False |
|
||||
| `--debug` | Print DEBUG messages to console | False |
|
||||
| `--output-only` | Enable output only mode | False |
|
||||
|
||||
| Parameter | Description | Default |
|
||||
| ---------------------------- | --------------------------------------------------------------- | ----------------------------------- |
|
||||
| `--name` | Name of the voice assistant device (required) | Autogenerated (`lva-MAC-ADDRESS`) |
|
||||
| `--audio-input-device` | Soundcard name for input device | Autodetected |
|
||||
| `--audio-input-block-size` | Audio input block size in samples | 1024 |
|
||||
| `--audio-output-device` | mpv name for output device | Autodetected |
|
||||
| `--mic-volume` | Control microphone volume | 100 |
|
||||
| `--mic-auto-gain` | Add WebRTC Gain to Mic | 0 |
|
||||
| `--mic-noise-suppression` | Add WebRTC Noise Suppression to Mic | 0 |
|
||||
| `--audio-input-channels` | Number of microphone audio channels to stream | 2 |
|
||||
| `--wake-word-dir` | Directory with wake word models (.tflite) and configs (.json) | `wakewords/` |
|
||||
| `--wake-model` | ID of active wake word model | `okay_nabu` |
|
||||
| `--stop-model` | ID of stop model | `stop` |
|
||||
| `--download-dir` | Directory to download custom wake word models, etc. | `local/` |
|
||||
| `--refractory-seconds` | Seconds before wake word can be activated again | 2.0 |
|
||||
| `--timer-max-ring-seconds` | Seconds after which the timer stops ringing | 900.0 |
|
||||
| `--wakeup-sound` | Sound file played when wake word is detected | `sounds/wake_word_triggered.flac` |
|
||||
| `--timer-finished-sound` | Sound file played when timer finishes | `sounds/timer_finished.flac` |
|
||||
| `--processing-sound` | Sound played while assistant is processing | `sounds/processing.wav` |
|
||||
| `--mute-sound` | Sound played when muting the assistant | `sounds/mute_switch_on.flac` |
|
||||
| `--unmute-sound` | Sound played when unmuting the assistant | `sounds/mute_switch_off.flac` |
|
||||
| `--preferences-file` | Path to preferences JSON file | `preferences.json` |
|
||||
| `--host` | IP-Address for ESPHome server, use 0.0.0.0 for all | Autodetected |
|
||||
| `--network-interface` | Network interface for ESPHome server | Autodetected |
|
||||
| `--port` | Port for ESPHome server | 6053 |
|
||||
| `--enable-thinking-sound` | Enable thinking sound on startup | False |
|
||||
| `--debug` | Print DEBUG messages to console | False |
|
||||
| `--output-only` | Enable output only mode | False |
|
||||
|
||||
💡 **Note:** There is a detailed explanation on the gain, noise suppression, and wake word sensitivity flags in the [audio options](docs/audio_options.md) file.
|
||||
|
||||
|
||||
## Build Information
|
||||
|
||||
Image builds can be tracked in this repository's `Actions` tab, and utilize [artifact attestation](https://docs.github.com/en/actions/security-guides/using-artifact-attestations-to-establish-provenance-for-builds) to certify provenance.
|
||||
@@ -104,6 +127,7 @@ The documentation for the build process can be found in the [GitHub Actions Work
|
||||
### Code Quality Checks
|
||||
|
||||
The project uses the following tools to ensure code quality:
|
||||
|
||||
- **Black**: Code formatting (88 characters per line, PEP 8 compliant)
|
||||
- **isort**: Import sorting compatible with Black
|
||||
- **flake8**: Style and syntax checks
|
||||
@@ -114,7 +138,7 @@ The project uses the following tools to ensure code quality:
|
||||
|
||||
To use the development tools (linting, testing, etc.), you need to install the required dependencies:
|
||||
|
||||
``` sh
|
||||
```sh
|
||||
./script/setup --dev
|
||||
source .venv/bin/activate
|
||||
```
|
||||
@@ -122,29 +146,33 @@ source .venv/bin/activate
|
||||
### Linting Commands
|
||||
|
||||
#### Run all linting checks
|
||||
``` sh
|
||||
|
||||
```sh
|
||||
./script/lint...
|
||||
```
|
||||
|
||||
#### Individual linting commands (with auto-fix support)
|
||||
|
||||
| Script | Description | Auto-fix Available? |
|
||||
|--------|-------------|---------------------|
|
||||
| `./script/lint_black` | Checks Python code formatting with Black | Yes, use `--auto` flag |
|
||||
| `./script/lint_flake8` | Runs style and syntax checks with flake8 | No |
|
||||
| `./script/lint_isort` | Checks import sorting with isort | Yes, use `--auto` flag |
|
||||
| `./script/lint_mypy` | Runs static type analysis with mypy | No |
|
||||
| `./script/lint_pylint` | Runs code quality checks with pylint | Yes, use `--auto` flag |
|
||||
|
||||
| Script | Description | Auto-fix Available? |
|
||||
| ------------------------ | ------------------------------------------ | ----------------------- |
|
||||
| `./script/lint_black` | Checks Python code formatting with Black | Yes, use`--auto` flag |
|
||||
| `./script/lint_flake8` | Runs style and syntax checks with flake8 | No |
|
||||
| `./script/lint_isort` | Checks import sorting with isort | Yes, use`--auto` flag |
|
||||
| `./script/lint_mypy` | Runs static type analysis with mypy | No |
|
||||
| `./script/lint_pylint` | Runs code quality checks with pylint | Yes, use`--auto` flag |
|
||||
|
||||
#### Examples
|
||||
|
||||
Run a specific lint check:
|
||||
``` sh
|
||||
|
||||
```sh
|
||||
./script/lint_black
|
||||
```
|
||||
|
||||
Auto-fix formatting issues (Black + isort):
|
||||
``` sh
|
||||
|
||||
```sh
|
||||
./script/lint_black --auto
|
||||
./script/lint_isort --auto
|
||||
```
|
||||
@@ -152,7 +180,8 @@ Auto-fix formatting issues (Black + isort):
|
||||
### Testing
|
||||
|
||||
Run the test suite:
|
||||
``` sh
|
||||
|
||||
```sh
|
||||
./script/test
|
||||
```
|
||||
|
||||
|
||||
@@ -52,6 +52,10 @@ if [ -n "${MIC_NOISE_SUPPRESSION}" ]; then
|
||||
EXTRA_ARGS+=( "--mic-noise-suppression" "$MIC_NOISE_SUPPRESSION" )
|
||||
fi
|
||||
|
||||
if [ -n "${AUDIO_INPUT_CHANNELS}" ]; then
|
||||
EXTRA_ARGS+=( "--audio-input-channels" "$AUDIO_INPUT_CHANNELS" )
|
||||
fi
|
||||
|
||||
if [ "$ENABLE_THINKING_SOUND" = "1" ]; then
|
||||
EXTRA_ARGS+=( "--enable-thinking-sound" )
|
||||
fi
|
||||
@@ -72,6 +76,10 @@ if [ -n "${REFACTORY_SECONDS}" ]; then
|
||||
EXTRA_ARGS+=( "--refractory-seconds" "$REFACTORY_SECONDS" )
|
||||
fi
|
||||
|
||||
if [ -n "${CONTINUE_CONVERSATION_DELAY}" ]; then
|
||||
EXTRA_ARGS+=( "--continue-conversation-delay" "$CONTINUE_CONVERSATION_DELAY" )
|
||||
fi
|
||||
|
||||
if [ -n "${WAKEUP_SOUND}" ]; then
|
||||
EXTRA_ARGS+=( "--wakeup-sound" "$WAKEUP_SOUND" )
|
||||
fi
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
### Gain
|
||||
|
||||
When you change gain, LVA(using the webrtc library) automatically adjusts the microphone input volume to keep it at a consistent level. If you're speaking quietly it boosts the signal, if you're speaking loudly it reduces it. Useful in the following ways:-
|
||||
When you change gain, LVA(using the [webrtc](https://github.com/OHF-Voice/webrtc-noise-gain) library) automatically adjusts the microphone input volume to keep it at a consistent level. If you're speaking quietly it boosts the signal, if you're speaking loudly it reduces it. Useful in the following ways:-
|
||||
|
||||
- Microphones that are too quiet by default
|
||||
- Environments where you move around relative to the mic
|
||||
@@ -12,7 +12,7 @@ When you change gain, LVA(using the webrtc library) automatically adjusts the mi
|
||||
|
||||
### Noise Suppression
|
||||
|
||||
When you change noise suppression, LVA(using the webrtc library) filters out constant background noise from the audio signal. It works by learning what "silence" sounds like in your environment and subtracting that from the audio. Useful in the following ways:
|
||||
When you change noise suppression, LVA(using the [webrtc](https://github.com/OHF-Voice/webrtc-noise-gain) library) filters out constant background noise from the audio signal. It works by learning what "silence" sounds like in your environment and subtracting that from the audio. Useful in the following ways:
|
||||
|
||||
- Noisy environments
|
||||
- Improving STT accuracy by sending cleaner audio to Home Assistant
|
||||
|
||||
@@ -258,7 +258,7 @@ The following variables can be configured in the `.env` or in the service file:
|
||||
| `PORT` | `6053` | API server port |
|
||||
| `AUDIO_INPUT_DEVICE` | Autodetected | Audio input device name |
|
||||
| `AUDIO_OUTPUT_DEVICE` | Autodetected | Audio output device name |
|
||||
| `MIC_VOLUME` | Control microphone volume | 1.0 |
|
||||
| `MIC_VOLUME` | Control microphone volume | 100 |
|
||||
| `MIC_AUTO_GAIN` | Add WebRTC Gain to Mic | 0 |
|
||||
| `MIC_NOISE_SUPPRESSION` | Add WebRTC Noise Suppresion to Mic | 0 |
|
||||
| `ENABLE_THINKING_SOUND` | false | Set to "1" to enable thinking sound |
|
||||
@@ -287,16 +287,26 @@ If you want to use your own sounds, you can add them to the `sounds/custom` aka
|
||||
#### Available Wake Word Models:
|
||||
|
||||
The following wake word models are available:
|
||||
|
||||
**microWakeWord:**
|
||||
- `okay_nabu` - Default wake word
|
||||
- `alexa` - Alexa wake word
|
||||
- `hey_jarvis` - Jarvis wake word
|
||||
- `hey_mycroft` - Mycroft wake word
|
||||
- `hey_morgan` - Morgan wake word
|
||||
- `hey_luna` - Luna wake word
|
||||
- `hey_home_assistant` - Home Assistant wake word
|
||||
- `stop` - Stop wake word
|
||||
- `okay_computer` - Okay Computer wake word
|
||||
- `choo_choo_homie` - Choo Choo Homie wake word
|
||||
|
||||
**openWakeWord:**
|
||||
- `ok_nabu` - Default wake word
|
||||
- `alexa` - Alexa wake word
|
||||
- `hey_jarvis` - Jarvis wake word
|
||||
- `hey_mycroft` - Mycroft wake word
|
||||
- `hey_rhasspy` - Rhasspy wake word
|
||||
|
||||
|
||||
### Custom Wake Word:
|
||||
|
||||
|
||||
@@ -71,8 +71,16 @@ async def main() -> None:
|
||||
action="store_true",
|
||||
help="List audio output devices and exit",
|
||||
)
|
||||
parser.add_argument("--mic-volume", type=int, default=100, choices=list(range(1, 101)), help="Microphone volume level (1 to 100)")
|
||||
parser.add_argument("--mic-auto-gain", type=int, default=0, choices=list(range(32)))
|
||||
parser.add_argument("--mic-noise-suppression", type=int, default=0, choices=(0, 1, 2, 3, 4))
|
||||
parser.add_argument(
|
||||
"--audio-input-channels",
|
||||
type=int,
|
||||
default=1,
|
||||
choices=(1, 2),
|
||||
help="Number of mic channels to capture and stream (1=mono, 2=dual-channel voice)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--wake-word-dir",
|
||||
default=[_WAKEWORDS_DIR],
|
||||
@@ -100,6 +108,12 @@ async def main() -> None:
|
||||
type=float,
|
||||
help="Seconds before wake word can be activated again",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--continue-conversation-delay",
|
||||
type=float,
|
||||
default=0.5,
|
||||
help="Seconds to wait after TTS finishes before opening the mic for continued conversation (default: 0.5)",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--wakeup-sound",
|
||||
default=str(_SOUNDS_DIR / "wake_word_triggered.flac"),
|
||||
@@ -282,6 +296,8 @@ async def main() -> None:
|
||||
_LOGGER.exception("Extras for webrtc are not installed")
|
||||
sys.exit(1)
|
||||
|
||||
if args.mic_volume > 0.0:
|
||||
preferences.mic_volume = args.mic_volume
|
||||
if args.mic_auto_gain > 0:
|
||||
preferences.mic_auto_gain = args.mic_auto_gain
|
||||
|
||||
@@ -319,12 +335,14 @@ async def main() -> None:
|
||||
preferences=preferences,
|
||||
preferences_path=preferences_path,
|
||||
refractory_seconds=args.refractory_seconds,
|
||||
continue_conversation_delay=args.continue_conversation_delay,
|
||||
output_only=args.output_only,
|
||||
download_dir=args.download_dir,
|
||||
volume=initial_volume,
|
||||
mic_volume=preferences.mic_volume,
|
||||
mic_auto_gain=preferences.mic_auto_gain,
|
||||
mic_noise_suppression=preferences.mic_noise_suppression,
|
||||
audio_input_channels=args.audio_input_channels,
|
||||
timer_max_ring_seconds=args.timer_max_ring_seconds,
|
||||
)
|
||||
|
||||
@@ -410,6 +428,7 @@ async def main() -> None:
|
||||
|
||||
def process_audio(state: ServerState, mic, block_size: int):
|
||||
"""Process audio chunks from the microphone."""
|
||||
n_channels = state.audio_input_channels
|
||||
|
||||
wake_words: List[Union[MicroWakeWord, OpenWakeWord]] = []
|
||||
micro_features: Optional[MicroWakeWordFeatures] = None
|
||||
@@ -424,12 +443,23 @@ def process_audio(state: ServerState, mic, block_size: int):
|
||||
|
||||
try:
|
||||
_LOGGER.debug("Opening audio input device: %s", mic.name)
|
||||
with mic.recorder(samplerate=16000, channels=1, blocksize=block_size) as mic_in:
|
||||
with mic.recorder(samplerate=16000, channels=n_channels, blocksize=block_size) as mic_in:
|
||||
while True:
|
||||
audio_chunk_array = mic_in.record(block_size).reshape(-1)
|
||||
# little-endian 16-bit signed
|
||||
# Shape: (block_size, n_channels) for stereo, (block_size, 1) for mono.
|
||||
raw = mic_in.record(block_size) # float32, range [-1, 1]
|
||||
mic_vol_scalar = max(0.1, min(1.0, state.mic_volume / 100.0))
|
||||
audio_chunk = (np.clip(audio_chunk_array * mic_vol_scalar, -1.0, 1.0) * 32767.0).astype("<i2").tobytes()
|
||||
|
||||
# Build per-channel byte arrays. Channel 0 is the primary
|
||||
# microphone; channel 1 (when present) is the reference/speaker
|
||||
# feed used for server-side AEC.
|
||||
channel_chunks: list[bytes] = []
|
||||
for ch in range(n_channels):
|
||||
col = raw[:, ch] if n_channels > 1 else raw.reshape(-1)
|
||||
chunk = (np.clip(col * mic_vol_scalar, -1.0, 1.0) * 32767.0).astype("<i2").tobytes()
|
||||
channel_chunks.append(chunk)
|
||||
|
||||
# Primary channel drives WebRTC and wake-word detection.
|
||||
audio_chunk = channel_chunks[0]
|
||||
agc = state.preferences.mic_auto_gain or 0
|
||||
ns = state.preferences.mic_noise_suppression or 0
|
||||
|
||||
@@ -529,7 +559,9 @@ def process_audio(state: ServerState, mic, block_size: int):
|
||||
oww_features = OpenWakeWordFeatures.from_builtin()
|
||||
|
||||
try:
|
||||
state.satellite.handle_audio(audio_chunk)
|
||||
# Both channels travel in one message: data=ch0 (enhanced), data2=ch1 (raw reference)
|
||||
audio_chunk_2 = channel_chunks[1] if n_channels >= 2 else None
|
||||
state.satellite.handle_audio(audio_chunk, audio_chunk_2)
|
||||
|
||||
assert micro_features is not None
|
||||
micro_inputs.clear()
|
||||
|
||||
@@ -98,6 +98,7 @@ class ServerState:
|
||||
preferences: Preferences
|
||||
preferences_path: Path
|
||||
download_dir: Path
|
||||
continue_conversation_delay: float = 0.5 # seconds to wait after TTS before opening mic
|
||||
|
||||
media_player_entity: "Optional[MediaPlayerEntity]" = None
|
||||
satellite: "Optional[VoiceSatelliteProtocol]" = None
|
||||
@@ -125,6 +126,7 @@ class ServerState:
|
||||
mic_auto_gain: int = 0
|
||||
mic_noise_suppression: int = 0
|
||||
mic_volume: int = 100 # 1–100, default maximum
|
||||
audio_input_channels: int = 2 # number of mic channels to stream
|
||||
timer_max_ring_seconds: float = 900.0
|
||||
|
||||
def save_preferences(self) -> None:
|
||||
|
||||
@@ -63,6 +63,8 @@ _LOGGER = logging.getLogger(__name__)
|
||||
|
||||
PROTO_TO_MESSAGE_TYPE = {v: k for k, v in MESSAGE_TYPE_TO_PROTO.items()}
|
||||
|
||||
_HAS_AUDIO_DATA2 = "data2" in {f.name for f in VoiceAssistantAudio.DESCRIPTOR.fields}
|
||||
|
||||
|
||||
class VoiceSatelliteProtocol(APIServer):
|
||||
|
||||
@@ -82,6 +84,9 @@ class VoiceSatelliteProtocol(APIServer):
|
||||
self.supported_features = (
|
||||
VoiceAssistantFeature.VOICE_ASSISTANT | VoiceAssistantFeature.API_AUDIO | VoiceAssistantFeature.ANNOUNCE | VoiceAssistantFeature.START_CONVERSATION | VoiceAssistantFeature.TIMERS
|
||||
)
|
||||
# Channel 1 carries echo-reference audio; advertise SPEAKER so HA knows to use it for server-side AEC.
|
||||
if state.audio_input_channels >= 2:
|
||||
self.supported_features |= VoiceAssistantFeature.MULTI_CHANNEL_AUDIO # pylint: disable=no-member
|
||||
|
||||
existing_media_players = [entity for entity in self.state.entities if isinstance(entity, MediaPlayerEntity)]
|
||||
|
||||
@@ -607,12 +612,14 @@ class VoiceSatelliteProtocol(APIServer):
|
||||
self.state.save_preferences()
|
||||
self.state.wake_words_changed = True
|
||||
|
||||
def handle_audio(self, audio_chunk: bytes) -> None:
|
||||
|
||||
# handle_audio — both channels in ONE message
|
||||
def handle_audio(self, audio_chunk: bytes, audio_chunk_2: Optional[bytes] = None) -> None:
|
||||
if not self._is_streaming_audio or self.state.muted:
|
||||
return
|
||||
|
||||
self.send_messages([VoiceAssistantAudio(data=audio_chunk)])
|
||||
if _HAS_AUDIO_DATA2 and audio_chunk_2 is not None:
|
||||
self.send_messages([VoiceAssistantAudio(data=audio_chunk, data2=audio_chunk_2)])
|
||||
else:
|
||||
self.send_messages([VoiceAssistantAudio(data=audio_chunk)])
|
||||
|
||||
def wakeup(self, wake_word: Union[MicroWakeWord, OpenWakeWord]) -> None:
|
||||
if self._timer_finished:
|
||||
@@ -707,11 +714,25 @@ class VoiceSatelliteProtocol(APIServer):
|
||||
self.send_messages([VoiceAssistantAnnounceFinished()])
|
||||
|
||||
if self._continue_conversation:
|
||||
self.send_messages([VoiceAssistantRequest(start=True)])
|
||||
self._is_streaming_audio = True
|
||||
self._continue_conversation = False
|
||||
# Keep pipeline active during the settle delay so the mic stays closed
|
||||
# and does not capture the tail end of the TTS audio from the speaker.
|
||||
self._pipeline_active = True
|
||||
_LOGGER.debug("Continuing conversation")
|
||||
_LOGGER.debug("Continuing conversation after %.2fs settle delay", self.state.continue_conversation_delay)
|
||||
|
||||
def _start_continued_conversation() -> None:
|
||||
if self.state.muted:
|
||||
_LOGGER.debug("Skipping continued conversation: muted")
|
||||
self._pipeline_active = False
|
||||
self.unduck()
|
||||
return
|
||||
self.send_messages([VoiceAssistantRequest(start=True)])
|
||||
self._is_streaming_audio = True
|
||||
_LOGGER.debug("Continued conversation started")
|
||||
|
||||
threading.Timer(self.state.continue_conversation_delay, _start_continued_conversation).start()
|
||||
else:
|
||||
self._continue_conversation = False
|
||||
self.unduck()
|
||||
|
||||
_LOGGER.debug("TTS response finished")
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@ classifiers = [
|
||||
]
|
||||
requires-python = ">=3.11.0"
|
||||
dependencies = [
|
||||
"aioesphomeapi==42.7.0",
|
||||
"aioesphomeapi==45.3.1",
|
||||
"netifaces2==0.0.22",
|
||||
"soundcard<1",
|
||||
"numpy>=2,<3",
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"type": "micro",
|
||||
"wake_word": "Hey Morgan",
|
||||
"author": "John Karabudak",
|
||||
"website": "https://johnthenerd.com",
|
||||
"model": "hey_morgan.tflite",
|
||||
"trained_languages": [
|
||||
"en"
|
||||
],
|
||||
"version": 2,
|
||||
"micro": {
|
||||
"probability_cutoff": 0.9,
|
||||
"sliding_window_size": 8,
|
||||
"feature_step_size": 10,
|
||||
"tensor_arena_size": 30000,
|
||||
"minimum_esphome_version": "2024.7.0"
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Reference in new issue
Block a user