100 Commits
Author SHA1 Message Date
imonlinux 7d844f8807 Add ReSpeaker XVF3800 USB 4-Mic Array support + startup preflight + optional volume sync
Add ReSpeaker XVF3800 USB 4-Mic Array support + startup preflight + optional volume sync
2026-01-12 17:08:50 -08:00
imonlinux 0d6b87739a Update linux-voice-assistant-xvf3800.md
Typos and corrections
2026-01-11 16:33:13 -08:00
imonlinux 68c7930405 Update linux-voice-assistant-2mic-install.md
typo
2026-01-11 16:30:45 -08:00
imonlinux 7abceb946e Delete docs/xvf3800_usb_led_testing.md
Obsolete
2026-01-11 15:47:56 -08:00
imonlinux 5b1ef20656 Update linux-voice-assistant-xvf3800.md
Updated to include all of the information needed to install and configure the XVF3800.
2026-01-11 15:46:26 -08:00
imonlinux c527f60681 Create linux-voice-assistant_xvf3800.service
Added wants and after for pipewire.
2026-01-11 15:38:45 -08:00
imonlinux 4b6b6dd380 Update button_controller.py
Summary

Optimize GPIO button polling interval

Problem

Aggressive polling at 100 Hz (10ms interval) unnecessarily high for human button presses, causing elevated CPU usage with no benefit to responsiveness.

Changes

Changed default poll_interval_seconds from 0.01 to 0.05 (100 Hz → 20 Hz)
Updated ButtonRuntimeConfig dataclass default
Updated fallback default in constructor
2026-01-10 13:26:19 -08:00
imonlinux 67abca1111 Update xvf3800_button_controller.py
Summary

Add USB context manager support and optimize polling interval

Problem

Missing context manager: USB resources could leak on exceptions
Aggressive polling: 100 Hz (10ms) unnecessarily high for human button presses
Changes

Context Manager Support (Critical Fix B)

Added __enter__ and __exit__ methods to XVF3800USBClient class
Enhanced close() with proper null checks and error handling
Enables safe with statement usage
Polling Optimization (Critical Fix C)

Changed default poll_interval_seconds from 0.01 to 0.05 (100 Hz → 20 Hz)
Updated XVF3800ButtonRuntimeConfig dataclass default
Updated fallback default in __init__ constructor
2026-01-10 13:25:29 -08:00
imonlinux d10cf87eef Update xvf3800_led_backend.py
Problem

XVF3800 LED ring worked inconsistently (~50% success rate at startup) due to: 1. Timing race: LED commands sent before WS2812 power (X0D33) enabled 2. Missing context manager: USB resources could leak on exceptions

Changes

Context Manager Support (Critical Fix B)

Added __enter__ and __exit__ methods to _ReSpeaker class
Enhanced close() with proper null checks and error handling
Enables safe with statement usage
LED Power Management (NEW Critical Fix)

Proactive initialization: Enable X0D33 immediately in __init__ before any LED operations
Defensive runtime checks: Added _ensure_led_power() helper method
Power verification: Check X0D33 state before set_effect() and set_ring_colors()
Added 50ms settle time after enabling power
Documentation

Added GPO_WRITE_VALUE and GPO_READ_VALUES to PARAMETERS dict
Added GPO_WS2812_POWER_INDEX constant for clarity
Enhanced inline comments explaining power management
2026-01-10 13:24:38 -08:00
imonlinux 1da9ac1fac Update audio_engine.py
Summary

Add thread-safe locking for wake word reload logic

Problem

Wake word reload logic accessed self.state.wake_words_changed flag without synchronization, creating a potential race condition when wake words are dynamically switched via Home Assistant.

Changes

Added self._wake_words_lock = threading.Lock() in __init__
Wrapped wake word reload block with with self._wake_words_lock: context manager
Ensures atomic read-modify-write of wake_words_changed flag
Impact

Risk: Very low - purely defensive improvement
Benefit: Eliminates race condition in wake word switching
Performance: Negligible overhead (lock only held during reload check)
2026-01-10 13:23:33 -08:00
imonlinux fed867936a Update xvf3800_button_controller.py
Fix physical mute button not illuminating the led ring with the Mute State.
2026-01-10 11:50:02 -08:00
imonlinux 90fa3a9df7 Update pyproject.toml
updated the aioesphomeapi dependency to 43.9.1
2026-01-08 08:47:37 -08:00
imonlinux 05817ceb58 Update config.json.example
Added volume_sync and max_volume_percent options.
2026-01-06 13:46:32 -08:00
imonlinux 010e5447df Update __main__.py
Add volume max percentage and config for volume sync.
2026-01-06 13:37:00 -08:00
imonlinux 6866358dfe Update config.py
Add volume max percentage and config for volume sync.
2026-01-06 13:36:28 -08:00
imonlinux 7891997392 Update audio_volume.py
Add volume max percentage and config for volume sync.
2026-01-06 13:35:52 -08:00
imonlinux cc2a7a6206 Update audio_volume.py
version mismatch fix
2026-01-06 12:22:34 -08:00
imonlinux 1a1c15f836 Update __main__.py
version mismatch fix
2026-01-06 12:21:54 -08:00
imonlinux cfc24f6b73 Update config.py
Fix self shot foot.
2026-01-06 12:03:44 -08:00
imonlinux 4da78c7435 Update mpv_player.py
What this fixes:

On boot, if PipeWire/Pulse starts with the sink at ~40%, LVA now pushes the sink volume to match the persisted LVA volume (0.0–1.0).

When you move the HA media_player volume slider, LVA now updates:

wpctl (PipeWire) if available

pactl (PulseAudio / PipeWire-Pulse) if available

amixer (ALSA) as a fallback

No reboot / alsactl store required — LVA simply re-applies the persisted volume at start.
2026-01-05 21:52:41 -08:00
imonlinux 8a9939cf62 Update __main__.py
What this fixes:

On boot, if PipeWire/Pulse starts with the sink at ~40%, LVA now pushes the sink volume to match the persisted LVA volume (0.0–1.0).

When you move the HA media_player volume slider, LVA now updates:

wpctl (PipeWire) if available

pactl (PulseAudio / PipeWire-Pulse) if available

amixer (ALSA) as a fallback

No reboot / alsactl store required — LVA simply re-applies the persisted volume at start.
2026-01-05 21:52:02 -08:00
imonlinux eb4c4c26c8 Update config.py
What this fixes:

On boot, if PipeWire/Pulse starts with the sink at ~40%, LVA now pushes the sink volume to match the persisted LVA volume (0.0–1.0).

When you move the HA media_player volume slider, LVA now updates:

wpctl (PipeWire) if available

pactl (PulseAudio / PipeWire-Pulse) if available

amixer (ALSA) as a fallback

No reboot / alsactl store required — LVA simply re-applies the persisted volume at start.
2026-01-05 21:51:21 -08:00
imonlinux a1b460391d Add audio_volume.py
This helper script keeps the LVA media player volume and the OS device volume synchronized.
2026-01-05 21:46:15 -08:00
imonlinux 0f3c7d6c15 Update led_controller.py
Updated to align with the new XVF3800 initialization pathway / preflight behavior.

Keeps XVF3800 behavior isolated to XVF3800 mode so other LED backends remain unchanged.
2026-01-05 18:59:13 -08:00
imonlinux b8a3ce2c39 Update xvf3800_led_backend.py
Extends the existing XVF3800 USB control backend beyond LEDs to support startup preflight commands needed for audio reliability.

Implements command execution internally (no reliance on xvf_host.py) using the same USB control-transfer approach already used for LED features.
2026-01-05 18:57:52 -08:00
imonlinux 3ba4e748ee Update __main__.py
Adds XVF3800-specific initialization flow during controller startup.

Ensures the XVF3800 preflight runs at the right time so audio initialization sees the correct device state.
2026-01-05 18:56:37 -08:00
imonlinux 5932f945e9 Update linux-voice-assistant.service
Add require for pipewire
2026-01-02 19:03:17 -08:00
imonlinux 5315c56556 Add per LED support
Added support for the XVF3800 per-LED command LED_RING_COLOR (12-LED ring, 48-byte payload).

Implemented/readied the device control logic so the backend can:

write per-LED frames (set_ring_rgb / set_ring_solid / clear_ring),

detect availability (supports_per_led) and fall back if unsupported.

Improved robustness/diagnostics for USB control transfers (more consistent request composition + debug logging around writes).
2026-01-01 15:18:54 -08:00
imonlinux a7a4f47f52 Add per LED control
Prevented MQTT command/state feedback loops while keeping HA-friendly behavior:

accepts retained /state topics during a short startup bootstrap window to restore last-known settings,

then stops processing /state messages and unsubscribes from .../+/state after bootstrap.

Ensures runtime control is driven only by /set topics, while /state remains publish-only for HA UI synchronization.

Adds explicit logging around bootstrap completion to make startup behavior clear.
2026-01-01 15:17:41 -08:00
imonlinux 4f05312e16 Per LED Control Added
Integrated per-LED rendering into the existing effect/state pipeline:

solid/off uses ring frames directly,

blink toggles between frames (color ↔ off),

pulse now rewrites LED_RING_COLOR with scaled RGB per step (instead of relying on global brightness),

spin uses a single “dot” moving around the 12 LEDs.

Ensured the controller uses the XVF3800’s fixed ring size (12) where appropriate.

Fixed the “stuck in Responding” issue by subscribing the voice_idle handler so Idle effects reapply correctly when returning to IDLE.
2026-01-01 15:16:13 -08:00
imonlinux 7bbe0ed96f Add test file that captures microphone audio
uses the same code that the LVA uses to capture microphone audio. Defaults to downmix and accepts left and right as variable for --channel.
2025-12-23 14:03:18 -08:00
imonlinux 4bea3f63d2 Update hey_luna.json
Fixed the friendly name for Hey Luna
2025-12-22 19:43:36 -08:00
imonlinux 77c2299453 Update audio_engine.py
reverting the revert
2025-12-22 11:46:09 -08:00
imonlinux ae9b834ee3 Update audio_engine.py
Revert refractory bug fix
2025-12-22 09:54:01 -08:00
imonlinux bddbbbe899 Update 99-respeaker-xvf3800.rules
Add rule to disable USB autosuspend for the XVF3800. Attempting to address the XVF3800 becoming non-responsive after a period of inactivity.
2025-12-20 16:20:51 -08:00
imonlinux 661e50921e Merge pull request #51 from imonlinux/refractory-rejection-loop_#48
Update audio_engine.py issue: 48
2025-12-20 13:36:48 -08:00
imonlinux 670cd52725 Merge pull request #50 from imonlinux/refractory-rejection-loop_#48
Update audio_engine.py issue: 48
2025-12-20 13:35:34 -08:00
imonlinux 22e94fc92b Update linux-voice-assistant-2mic-install.md 2025-12-18 12:13:03 -08:00
imonlinux 99157b9a8a Add AEC persistance service file 2025-12-16 09:44:52 -08:00
imonlinux 46c39c6ae5 Update config.json.example
cleanup and restore of missing options
2025-12-12 15:18:39 -08:00
imonlinux ab99019d42 Update entity.py
Fix play status sync error between mpv and HA when skipping tracks.
2025-12-11 18:47:01 -08:00
imonlinux 7abce1060d Update mpv_player.py
Fix play status sync error between mpv and HA when skipping tracks.
2025-12-11 18:46:31 -08:00
imonlinux 56572d4b33 LED color status in HA fixed
Bug was preventing HA from showing the correct LED color.
2025-12-11 11:39:21 -08:00
imonlinux 8187760b39 Update mqtt_controller.py 2025-12-11 11:25:59 -08:00
imonlinux 3f05bcfc56 Create 99-respeaker-xvf3800.rules
Added a udev rule to allow non-root users to access the USB LEDs.
2025-12-11 09:57:15 -08:00
imonlinux 31b6d70910 Update xvf3800_usb_led_testing.md
Added the requirement for a udev rule.
2025-12-11 09:54:13 -08:00
imonlinux 1cd861454a Add files via upload 2025-12-11 09:09:07 -08:00
imonlinux f1d2700fac LED Effect Mapping
Background on LED effect mapping from XVF3800 to LVA LED effects.
2025-12-10 14:43:04 -08:00
imonlinux 70079d6a61 Update config.py
Bug fix.
2025-12-09 07:57:02 -08:00
imonlinux 957d3f2839 Update to include XVF3800 Support 2025-12-08 15:21:49 -08:00
imonlinux ae8f1c5c3a Add legacy XVF3800 LED Controls
Minimal pyusb-based wrapper focused on the legacy LED controls only
2025-12-08 14:08:01 -08:00
imonlinux 3d7cc49466 Add support for XVF380 LEDs
Keeps all existing DotStar/NeoPixel behavior intact.

Adds a USB-based XVF3800 backend using the legacy LED controls (LED_EFFECT, LED_BRIGHTNESS, LED_SPEED, LED_COLOR).

Plugs it into LedController by treating "led_type": "xvf3800", "interface": "usb" as a new backend.
2025-12-08 14:06:45 -08:00
imonlinux b15848a97d Add pyusb to required depends 2025-12-08 11:43:59 -08:00
imonlinux 59d8071384 Delete linux_voice_assistant/xvf3800_controller.py
Duplicate file...
2025-12-08 11:34:22 -08:00
imonlinux e845c5c811 XVF3800 Mute Button Support
This is the same design as earlier, but now explicitly expects button_config.mode/poll_interval_seconds to exist (with defaults from ButtonConfig).
2025-12-08 11:33:21 -08:00
imonlinux a52b503cdb XVF3800 Mute Button Support
linux_voice_assistant/config.py – adds button.mode + poll_interval_seconds
2025-12-08 11:31:18 -08:00
imonlinux 13aad43c29 XVF3800 Mute Button Support
Import XVF3800ButtonController.

In _init_controllers, choose between ButtonController and XVF3800ButtonController based on config.button.mode.
2025-12-08 11:29:01 -08:00
imonlinux ebe93da7cb Add details on the XVF3800 mute button 2025-12-08 11:27:37 -08:00
imonlinux 6c65903425 Update README.md
Updated to include XVF3800 support
2025-12-06 21:09:22 -08:00
imonlinux 8d135dc51b Update audio_engine.py issue: 48
Behavioral changes:

Each wake word has its own timer.

Rapid repeats of the same phrase within the refractory window still get rejected (which is desirable).

A misfire of “Hey Jarvis” no longer locks out “Okay Nabu” immediately afterward.

If a user really wants to disable the gating, they can set:

"wake_word": {
  "refractory_seconds": 0
}


and this code will treat it as “no refractory” (max(..., 0.0) above).
2025-12-06 19:32:29 -08:00
imonlinux 7305a289a0 Add files via upload
What’s in it:

Xvf3800RuntimeConfig – simple dataclass for VID/PID, timeouts, etc.

Xvf3800Controller(EventHandler) – structured very similar to your other controllers:

On init:

Checks enabled and hid availability.

Uses hid.enumerate() to find the XVF3800 by VID/PID.

Opens the first HID interface (non-blocking).

Starts a background thread _poll_loop().

_poll_loop():

Reads HID reports (read(64, timeout_ms=...)).

For each non-empty report:

Calls _parse_hw_mute_from_report(report) → Optional[bool].

If it returns True/False and the value changed, it publishes:

self.loop.call_soon_threadsafe(
    self.event_bus.publish,
    "set_mic_mute",
    {"state": new_state},
)


Exits cleanly when self._running is false or state.shutdown is true.

@subscribe def set_mic_mute(self, data: dict):

Listens to the same set_mic_mute event MQTT and ButtonController use.

Updates _last_hw_mute_state.

Calls _send_hw_mute_state(desired) to push mute+LED down to hardware.

Placeholders:

def _parse_hw_mute_from_report(self, report: bytes) -> Optional[bool]:
    # TODO: implement once we know the report layout
    _LOGGER.debug("XVF3800 HID report (len=%d): %s", len(report), report.hex())
    return None

def _send_hw_mute_state(self, muted: bool) -> None:
    # TODO: implement once we know output report format
    _LOGGER.debug("(stub) Would send HID command to set XVF3800 mute=%s", muted)
2025-12-06 18:34:54 -08:00
imonlinux 44091bbc8b Add files via upload
What it does:

Uses hidapi (pip install hidapi) to:

Enumerate devices with VID/PID 0x2886:0x001a (Seeed / XVF3800).

Open the first matching HID interface (or a specific --path).

Read reports in a loop and print them as timestamps + hex blobs.

You (or testers) run it, press/release the XVF mute button a few times, and paste the output into the Discussion so we can see which byte/bit is the mute state.
2025-12-06 18:32:30 -08:00
imonlinux 97da7f2d0f Initial draft xvf3800 tutorial 2025-12-05 19:50:01 -08:00
imonlinux 471ecea811 Create xvf3800_probe.py 2025-12-03 11:50:49 -08:00
imonlinux 186f33f1a1 Update config.json.example
Add clarity for using NeoPixel LEDs with Grove Port interface.
2025-11-30 12:31:34 -08:00
imonlinux 57b20a1ef1 Update button_controller.py
Fixed bug when running on a non-RPi board.
2025-11-30 00:49:59 -08:00
imonlinux 5ef680d734 Merge pull request #44 from imonlinux/gpio-button-suport
Summary

Add support for the ReSpeaker 2-Mic HAT momentary button as a first-class control surface for the Linux Voice Assistant. The button now behaves like:

Short press

If TTS or music is playing → stop playback (equivalent to the Stop wake word)

Otherwise → start a new conversation (equivalent to a wake word trigger)

Long press

Toggle microphone mute (wired through the existing set_mic_mute event, so MQTT state and LEDs stay in sync)

The implementation uses a polling-based GPIO loop (RPi.GPIO) instead of kernel edge-detection to avoid “Failed to add edge detection” issues on some HAT/overlay setups. Button behavior is fully configurable via config.json.
2025-11-30 00:38:37 -08:00
imonlinux 5773f3a35a Update lva-desktop.md
Update to include the additional dependencies in the .venv for Qt5.
2025-11-30 00:37:31 -08:00
imonlinux 6260bf1dca Update pyproject.toml
Fix regression bug introduced with the lva tray client.
2025-11-30 00:33:08 -08:00
imonlinux fa3889805e Update linux-voice-assistant-2mic-install.md
Update to include support of implementation of the GPIO button function.
2025-11-30 00:00:35 -08:00
imonlinux a9cf822136 Update satellite.py
Extended the satellite state machine with a manual wake entrypoint:

Added manual_wakeup(self, phrase: str = "button"):

Mirrors the semantics of wakeup(), but does not require a wake-word model instance.

Respects the current state: only triggers from STARTING or IDLE.

If a timer alarm is ringing, calls the existing _stop_timer_alarm(...) instead of starting a new conversation (consistent with wake-word behavior).

Otherwise calls a shared helper _start_conversation(phrase).

Introduced _start_conversation(wake_word_phrase: str) to encapsulate:

Sending VoiceAssistantRequest(start=True, wake_word_phrase=...),

Transitioning to LISTENING,

Setting _is_streaming_audio = True,

Playing the configured wakeup_sound via tts_player.

Kept prior timer/alarm logic intact (including auto stop and Stop wake word behavior), so the button integrates cleanly with existing timer and TTS flows.
2025-11-29 23:43:08 -08:00
imonlinux 0073dc6a23 Update __main__.py
Imported the new ButtonController.

In _init_controllers():

Instantiated ButtonController when config.button.enabled is True.

Passed loop, event_bus, state, and config.button.

Stored the instance on state.button_controller to keep it alive for the lifetime of the process.

Left the rest of startup orchestration unchanged (audio engine, MQTT, LEDs, etc.), so the button is just an additional input surface plugged into the existing architecture.
2025-11-29 23:42:24 -08:00
imonlinux dc9049e899 Add button_controller.py
Introduced a new ButtonController responsible for handling the ReSpeaker (or generic GPIO) button:

Uses RPi.GPIO with BCM numbering and internal pull-up (PUD_UP), assuming an active-low button.

Starts a dedicated polling thread that:

Reads the GPIO level at a configurable interval (default 10 ms / 100 Hz),

Detects press and release transitions,

Computes press duration to classify short vs long press.

Short press behavior:

If state.tts_player.is_playing or state.music_player.is_playing:

Schedules state.satellite.stop() on the asyncio loop,

Also stops music via state.music_player.stop().

Otherwise:

Schedules state.satellite.manual_wakeup("button") to start a new voice interaction (wake-like behavior without needing a model instance).

Long press behavior:

Toggles mic mute using the existing event path:

Publishes set_mic_mute on the EventBus with {"state": not state.mic_muted}.

This ensures MicMuteHandler remains the single writer for mic state, updates mic_muted_event, and syncs MQTT mute state/LEDs.

Designed to fail gracefully:

If ButtonConfig.enabled is False or RPi.GPIO is unavailable, logs a message and disables button support without affecting the rest of the system.
2025-11-29 23:41:24 -08:00
imonlinux edc66183c3 Update config.py
Added a new ButtonConfig dataclass:

enabled: bool = False

pin: int = 17 (BCM pin for the button)

long_press_seconds: float = 1.0

Extended the main Config dataclass with a button: ButtonConfig field.

Updated load_config_from_json() to construct button_config from the "button" section in config.json.

This allows enabling/disabling the button, changing the GPIO pin, and tuning the long-press threshold (and optional poll interval) without code changes.
2025-11-29 23:40:16 -08:00
imonlinux 93bdb60fc0 Update README.md
Updated to include support for the gpio button.
2025-11-29 23:39:13 -08:00
imonlinux 912468703a Update README.md
Updated to include the addition of the alarm duration MQTT setting.
2025-11-29 14:51:04 -08:00
imonlinux 17f1671f1b Merge pull request #43 from imonlinux/implement-alarm-play-duration
Added a new user preference: alarm_duration_seconds (0 = infinite / Stop-only, >0 = auto-stop after N seconds).

Exposed that preference via MQTT/HA as a number entity (Alarm Duration) in seconds.

Updated the satellite timer logic so the alarm:

loops as before,

stops on the Stop wake word or wake wake word (existing semantics),

and optionally auto-stops after alarm_duration_seconds if configured.

Ensured all paths that stop the alarm cleanly restore audio state and wake word activation.
2025-11-29 14:40:58 -08:00
imonlinux 0e928bd7b3 Update satellite.py
Added internal tracking for an alarm auto-stop:

self._timer_auto_stop_handle: Optional[asyncio.TimerHandle]

On VOICE_ASSISTANT_TIMER_FINISHED:

enables the Stop wake word,

starts the repeating timer_finished_sound alarm as before,

reads state.preferences.alarm_duration_seconds and, if > 0, schedules an auto-stop callback after that duration.

Centralized alarm stopping in helper methods:

_clear_timer_auto_stop() – cancels any pending auto-stop timer.

_stop_timer_alarm(reason: str) – stops the alarm sound, clears flags, unducks music, and removes the Stop wake word from active_wake_words.

_auto_stop_timer_alarm() – invoked by the scheduled timer, calls _stop_timer_alarm("auto_timeout").

Updated behavior paths:

wakeup() now stops a ringing alarm instead of starting a new conversation if a timer is active.

stop() (Stop wake word) stops a ringing alarm first; only falls back to stopping TTS if no alarm is active.

_play_timer_finished() continues to loop the sound until _timer_finished is cleared, then unducks and exits cleanly.
2025-11-29 14:39:46 -08:00
imonlinux 0025fc781f Update mqtt_controller.py
Added MQTT topics for the new alarm duration control:

lva/<device_id>/alarm_duration/set

lva/<device_id>/alarm_duration/state

Published a new Home Assistant number discovery config:

number.<device_id>_alarm_duration (0–3600 seconds, step 5, unit s).

On /alarm_duration/set:

validates and parses the payload as a non-negative integer,

publishes a set_alarm_duration event on the EventBus,

echoes the value back to /alarm_duration/state.

On connect, publishes the current alarm_duration_seconds from preferences to the state topic for retained startup behavior.
2025-11-29 14:38:52 -08:00
imonlinux 5da1dd4bc4 Update models.py
Updated Preferences dataclass with a new field:

alarm_duration_seconds: int = 0

Kept ServerState.save_preferences() unchanged so alarm_duration_seconds is automatically serialized into preferences.json.
2025-11-29 14:38:13 -08:00
imonlinux b43b036198 Update __main__.py
Extended Preferences loading to initialize and backfill a new alarm_duration_seconds field (default 0).

Added a set_alarm_duration event handler to MicMuteHandler which:

validates and normalizes the duration value,

updates state.preferences.alarm_duration_seconds,

persists the updated preferences to disk.

Kept the existing “single writer” pattern (MicMuteHandler) for preferences/state updates.
2025-11-29 14:37:18 -08:00
imonlinux 5931370c63 Update README.md 2025-11-28 14:10:45 -08:00
imonlinux 53d143fb35 Update README.md
Updated for additional supported Linux distros.
2025-11-28 14:10:18 -08:00
imonlinux be41c876b0 Update lva-desktop.md
Add command to chmod +x on the script/tray file.
2025-11-27 19:10:07 -08:00
imonlinux 48a6ec38a5 Add user mode unit file for the tray client 2025-11-27 19:08:09 -08:00
imonlinux b43cd95ec1 Update pyproject.toml
Add dependencies for the LVA Tray Client.
2025-11-26 20:08:48 -08:00
imonlinux e1fd1ccd4d Update lva-desktop.md
Update to include mpv "just in case"
2025-11-26 20:06:21 -08:00
imonlinux 5ce9085fd9 Merge pull request #42 from imonlinux/desktop-tray-client
Desktop tray client
2025-11-26 20:02:28 -08:00
imonlinux d0a74a2d3b Update README.md
Add info for tray client on Linux desktop.
2025-11-26 19:59:58 -08:00
imonlinux 85560b8126 Add tray script under the scripts folder. 2025-11-26 19:53:38 -08:00
imonlinux 0a2c227cad Add LVA Tray Client
Provide a simple tray client to show the status of the LVA running on a Linux desktop.
2025-11-26 19:51:17 -08:00
imonlinux 11c0e4fbb6 Create lva-desktop.md
Add tutorial for running LVA on a Linux desktop.
2025-11-26 19:49:39 -08:00
imonlinux e13cc31e5b Update satellite.py
Fix bug with no stt after wake word detection.
2025-11-24 15:14:15 -08:00
imonlinux e3f9757bee Update README.md
Clean up What's working section
2025-11-23 20:32:46 -08:00
imonlinux f38c89fb3b Update README.md
Typo
2025-11-23 20:12:02 -08:00
imonlinux c6c34b60e5 Update install-respeaker-drivers.sh
Added logic to support both Bookworm and Trixie version of Raspberry Pi OS.
2025-11-23 20:01:11 -08:00
imonlinux 62164e0142 Update linux-voice-assistant-2mic-install.md
Modified packages list in support of Trixie and soundcard.
2025-11-23 20:00:18 -08:00
imonlinux bd488f555e Update linux-voice-assistant-2mic-install.md
Add AEP tuning details.
2025-11-23 19:33:31 -08:00
imonlinux a9989f0c25 Update README.md
Confirmed working with Rasberry OS Trixie.
2025-11-23 19:25:11 -08:00
imonlinux baa6f9080f Update satellite.py
Fix wake word change bug
2025-11-22 16:11:16 -08:00