5 from datetime import datetime
6 from threading import Thread
12 import speech_recognition as sr
14 class HotwordListener(object):
19 input_device_index=None,
20 library_path=pvporcupine.LIBRARY_PATH,
21 model_path=pvporcupine.MODEL_PATH):
22 super(HotwordListener, self).__init__()
23 self._queue = command_queue
24 self._library_path = library_path
25 self._model_path = model_path
26 self._keyword_paths = keyword_paths
27 self._sensitivities = sensitivities
28 self._input_device_index = input_device_index
30 def listen_forever(self):
32 for x in self._keyword_paths:
33 keywords.append(os.path.basename(x).replace('.ppn', '').split('_')[0])
39 porcupine = pvporcupine.create(
40 library_path=self._library_path,
41 model_path=self._model_path,
42 keyword_paths=self._keyword_paths,
43 sensitivities=self._sensitivities)
44 recognizer = sr.Recognizer()
45 pa = pyaudio.PyAudio()
47 audio_stream = pa.open(
48 rate=porcupine.sample_rate,
50 format=pyaudio.paInt16,
52 frames_per_buffer=porcupine.frame_length,
53 input_device_index=self._input_device_index)
56 for keyword, sensitivity in zip(keywords, self._sensitivities):
57 print(' %s (%.2f)' % (keyword, sensitivity))
61 raw = audio_stream.read(porcupine.frame_length, exception_on_overflow=False)
62 pcm = struct.unpack_from("h" * porcupine.frame_length, raw)
63 result = porcupine.process(pcm)
65 os.system('/usr/bin/aplay /var/www/kiosk/attention.wav')
66 print('[%s] >>>>>>>>>>>>> Detected wakeword %s' % (
67 str(datetime.now()), keywords[result])
69 print('>>>>>>>>>>>>>>> Listening for command now...')
71 for i in range(0, int(porcupine.sample_rate / porcupine.frame_length * 4)):
72 raw += audio_stream.read(porcupine.frame_length,
73 exception_on_overflow=False)
74 print(f'>>>>>>>>>>>>>> Recognizing command... {len(raw)} bytes')
75 speech = sr.AudioData(
76 frame_data = bytes(raw),
77 sample_rate = porcupine.sample_rate,
78 sample_width = 2, # 16 bits
81 command = recognizer.recognize_google(speech)
82 print('[%s] >>>>>>>>>>>>> Google says command was %s' % (
83 str(datetime.now()), command)
87 self._queue.put(command)
89 except Exception as e:
93 except KeyboardInterrupt:
97 if porcupine is not None:
100 if audio_stream is not None:
107 def show_audio_devices(cls):
108 fields = ('index', 'name', 'defaultSampleRate', 'maxInputChannels')
109 pa = pyaudio.PyAudio()
110 for i in range(pa.get_device_count()):
111 info = pa.get_device_info_by_index(i)
112 print(', '.join("'%s': '%s'" % (k, str(info[k])) for k in fields))
117 keyword_paths = [pvporcupine.KEYWORD_PATHS[x] for x in ["blueberry", "bumblebee"]]
118 sensitivities = [0.85, 0.95]
124 if __name__ == '__main__':