5 from datetime import datetime
9 import speech_recognition as sr
12 class HotwordListener(object):
17 input_device_index=None,
18 library_path=pvporcupine.LIBRARY_PATH,
19 model_path=pvporcupine.MODEL_PATH):
20 self._queue = command_queue
21 self._library_path = library_path
22 self._model_path = model_path
23 self._keyword_paths = keyword_paths
24 self._sensitivities = sensitivities
25 self._input_device_index = input_device_index
27 def listen_forever(self):
29 for x in self._keyword_paths:
31 os.path.basename(x).replace('.ppn', '').split('_')[0]
38 porcupine = pvporcupine.create(
39 library_path=self._library_path,
40 model_path=self._model_path,
41 keyword_paths=self._keyword_paths,
42 sensitivities=self._sensitivities)
43 recognizer = sr.Recognizer()
44 pa = pyaudio.PyAudio()
46 audio_stream = pa.open(
47 rate=porcupine.sample_rate,
49 format=pyaudio.paInt16,
51 frames_per_buffer=porcupine.frame_length,
52 input_device_index=self._input_device_index)
55 for keyword, sensitivity in zip(keywords, self._sensitivities):
56 print(' %s (%.2f)' % (keyword, sensitivity))
60 raw = audio_stream.read(
61 porcupine.frame_length,
62 exception_on_overflow=False
64 pcm = struct.unpack_from("h" * porcupine.frame_length, raw)
65 result = porcupine.process(pcm)
67 cmd = 'aplay /var/www/kiosk/attention.wav'
68 print(f'Running {cmd}...')
70 print(f'---- (done {x}) ----')
71 print('[%s] >>>>>>>>>>>>> Detected wakeword %s' % (
72 str(datetime.now()), keywords[result])
74 print('>>>>>>>>>>>>>>> Listening for command now...')
78 int(porcupine.sample_rate / porcupine.frame_length * 4)
80 raw += audio_stream.read(porcupine.frame_length,
81 exception_on_overflow=False)
83 f'>>>>>>>>>>>>>> Recognizing command... {len(raw)} bytes'
85 speech = sr.AudioData(
86 frame_data = bytes(raw),
87 sample_rate = porcupine.sample_rate,
88 sample_width = 2, # 16 bits
90 command = recognizer.recognize_google(speech)
92 '[%s] >>>>>>>>>>>>> Google says command was %s' % (
93 str(datetime.now()), command)
95 self._queue.put(command)
97 except Exception as e:
101 except KeyboardInterrupt:
102 print('Stopping ...')
105 if porcupine is not None:
108 if audio_stream is not None:
115 def show_audio_devices(cls):
116 fields = ('index', 'name', 'defaultSampleRate', 'maxInputChannels')
117 pa = pyaudio.PyAudio()
118 for i in range(pa.get_device_count()):
119 info = pa.get_device_info_by_index(i)
120 print(', '.join("'%s': '%s'" % (k, str(info[k])) for k in fields))
126 pvporcupine.KEYWORD_PATHS[x] for x in ["blueberry", "bumblebee"]
128 sensitivities = [0.85, 0.95]
136 if __name__ == '__main__':