Fresh start - excluded large ROM JSON files
This commit is contained in:
93
home-assistant/openwakeword-mqtt.py
Normal file
93
home-assistant/openwakeword-mqtt.py
Normal file
@@ -0,0 +1,93 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
openWakeWord to MQTT publisher
|
||||
Publishes wake word detections to Home Assistant MQTT broker
|
||||
"""
|
||||
|
||||
import time
|
||||
import json
|
||||
import paho.mqtt.client as mqtt
|
||||
import openwakeword
|
||||
from openwakeword.model import Model
|
||||
import numpy as np
|
||||
import sounddevice as sd
|
||||
|
||||
# MQTT Configuration
|
||||
MQTT_HOST = "192.168.0.39" # Home Assistant IP
|
||||
MQTT_PORT = 1883
|
||||
MQTT_USER = "your_mqtt_username" # Replace with your MQTT username
|
||||
MQTT_PASS = "your_mqtt_password" # Replace with your MQTT password
|
||||
MQTT_TOPIC = "homeassistant/openwakeword/detection"
|
||||
|
||||
# Wake word detection threshold (0.0 - 1.0)
|
||||
THRESHOLD = 0.5
|
||||
|
||||
# Audio settings
|
||||
CHUNK_SIZE = 1600 # 100ms of audio @ 16kHz
|
||||
|
||||
def on_connect(client, userdata, flags, rc):
|
||||
if rc == 0:
|
||||
print(f"Connected to MQTT broker at {MQTT_HOST}")
|
||||
else:
|
||||
print(f"Failed to connect, return code {rc}")
|
||||
|
||||
def publish_detection(wake_word, confidence):
|
||||
payload = json.dumps({
|
||||
"wake_word": wake_word,
|
||||
"confidence": float(confidence),
|
||||
"timestamp": time.time()
|
||||
})
|
||||
client.publish(MQTT_TOPIC, payload)
|
||||
print(f"Published: {wake_word} ({confidence:.2f})")
|
||||
|
||||
def main():
|
||||
global client
|
||||
|
||||
# Initialize MQTT client
|
||||
client = mqtt.Client(client_id="openwakeword")
|
||||
client.username_pw_set(MQTT_USER, MQTT_PASS)
|
||||
client.on_connect = on_connect
|
||||
client.connect(MQTT_HOST, MQTT_PORT, 60)
|
||||
client.loop_start()
|
||||
|
||||
# Initialize openwakeword model
|
||||
print("Loading openwakeword models...")
|
||||
oww_model = Model()
|
||||
|
||||
# Get audio stream (adjust for your microphone)
|
||||
# Using sounddevice for microphone input
|
||||
import sounddevice as sd
|
||||
|
||||
def audio_callback(indata, frames, time, status):
|
||||
if status:
|
||||
print(status)
|
||||
# Process audio for wake word detection
|
||||
audio_data = indata.flatten()
|
||||
predictions = oww_model.predict(audio_data)
|
||||
|
||||
# Check for detections
|
||||
for wake_word, score in predictions.items():
|
||||
if score >= THRESHOLD:
|
||||
publish_detection(wake_word, score)
|
||||
|
||||
print("Listening for wake words...")
|
||||
print("Press Ctrl+C to stop")
|
||||
|
||||
# Start streaming from microphone
|
||||
with sd.InputStream(
|
||||
channels=1,
|
||||
samplerate=16000,
|
||||
dtype='int16',
|
||||
blocksize=CHUNK_SIZE,
|
||||
callback=audio_callback
|
||||
):
|
||||
try:
|
||||
while True:
|
||||
time.sleep(0.1)
|
||||
except KeyboardInterrupt:
|
||||
print("\nStopping...")
|
||||
client.loop_stop()
|
||||
client.disconnect()
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user