import os
import struct
from datetime import datetime
-from threading import Thread
-import numpy as np
import pvporcupine
import pyaudio
-import soundfile
import speech_recognition as sr
+
class HotwordListener(object):
def __init__(self,
command_queue,
input_device_index=None,
library_path=pvporcupine.LIBRARY_PATH,
model_path=pvporcupine.MODEL_PATH):
- super(HotwordListener, self).__init__()
self._queue = command_queue
self._library_path = library_path
self._model_path = model_path
def listen_forever(self):
keywords = list()
for x in self._keyword_paths:
- keywords.append(os.path.basename(x).replace('.ppn', '').split('_')[0])
+ keywords.append(
+ os.path.basename(x).replace('.ppn', '').split('_')[0]
+ )
porcupine = None
pa = None
print('}')
while True:
- raw = audio_stream.read(porcupine.frame_length, exception_on_overflow=False)
+ raw = audio_stream.read(
+ porcupine.frame_length,
+ exception_on_overflow=False
+ )
pcm = struct.unpack_from("h" * porcupine.frame_length, raw)
result = porcupine.process(pcm)
if result >= 0:
- os.system('/usr/bin/aplay /var/www/kiosk/attention.wav')
+ cmd = 'aplay /var/www/kiosk/attention.wav'
+ print(f'Running {cmd}...')
+ x = os.system(cmd)
+ print(f'---- (done {x}) ----')
print('[%s] >>>>>>>>>>>>> Detected wakeword %s' % (
str(datetime.now()), keywords[result])
)
print('>>>>>>>>>>>>>>> Listening for command now...')
raw = bytearray()
- for i in range(0, int(porcupine.sample_rate / porcupine.frame_length * 4)):
+ for i in range(
+ 0,
+ int(porcupine.sample_rate / porcupine.frame_length * 4)
+ ):
raw += audio_stream.read(porcupine.frame_length,
exception_on_overflow=False)
- print(f'>>>>>>>>>>>>>> Recognizing command... {len(raw)} bytes')
+ print(
+ f'>>>>>>>>>>>>>> Recognizing command... {len(raw)} bytes'
+ )
speech = sr.AudioData(
frame_data = bytes(raw),
sample_rate = porcupine.sample_rate,
sample_width = 2, # 16 bits
)
- try:
- command = recognizer.recognize_google(speech)
- print('[%s] >>>>>>>>>>>>> Google says command was %s' % (
+ command = recognizer.recognize_google(speech)
+ print(
+ '[%s] >>>>>>>>>>>>> Google says command was %s' % (
str(datetime.now()), command)
- )
- except Exception:
- command = 'weather'
+ )
self._queue.put(command)
except Exception as e:
def main():
- keyword_paths = [pvporcupine.KEYWORD_PATHS[x] for x in ["blueberry", "bumblebee"]]
+ keyword_paths = [
+ pvporcupine.KEYWORD_PATHS[x] for x in ["blueberry", "bumblebee"]
+ ]
sensitivities = [0.85, 0.95]
HotwordListener(
+ [],
keyword_paths,
sensitivities,
).listen_forever()
+
if __name__ == '__main__':
main()