46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
import io
|
|
import queue
|
|
import socket
|
|
import threading
|
|
import wave
|
|
|
|
import numpy as np
|
|
from openwakeword.model import Model
|
|
|
|
CHUNK = 1280
|
|
|
|
oww = Model()
|
|
q = queue.Queue()
|
|
|
|
|
|
def receive_udp_audio(port=12102):
|
|
"""
|
|
Get audio from UDP stream and add to wake word detection queue.
|
|
|
|
Rhasspy sends 1024 x 16bit frames + header = 2092 bytes
|
|
Open Wake Word expects 1280 x 16bit frames (CHUNK)
|
|
"""
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
sock.bind(("", port))
|
|
print(f"Listening on UDP port {port}")
|
|
|
|
audio_buffer = []
|
|
while True:
|
|
data, addr = sock.recvfrom(2092)
|
|
audio = wave.open(io.BytesIO(data))
|
|
frames = audio.readframes(1024)
|
|
audio_buffer.extend(np.frombuffer(frames, dtype=np.int16))
|
|
if len(audio_buffer) > CHUNK:
|
|
q.put(audio_buffer[:CHUNK])
|
|
audio_buffer = audio_buffer[CHUNK:]
|
|
|
|
|
|
receive_audio_thread = threading.Thread(target=receive_udp_audio)
|
|
receive_audio_thread.start()
|
|
while True:
|
|
prediction = oww.predict(q.get())
|
|
for model_name in prediction.keys():
|
|
prediction_level = prediction[model_name]
|
|
if prediction_level >= 0.5:
|
|
print(model_name, prediction_level)
|