refactor whisper into hotwords
parent
67518be067
commit
e6b219e74e
|
|
@ -0,0 +1,104 @@
|
||||||
|
import speech_recognition as sr
|
||||||
|
import time
|
||||||
|
import threading
|
||||||
|
import queue
|
||||||
|
import signal
|
||||||
|
import sys
|
||||||
|
from os import environ
|
||||||
|
|
||||||
|
def main():
|
||||||
|
managerToParserQ = queue.Queue(maxsize=1)
|
||||||
|
readerToParserQ = queue.Queue(maxsize=10)
|
||||||
|
parserToReactorQ = queue.Queue(maxsize=10)
|
||||||
|
threads = [
|
||||||
|
Manager(managerToParserQ),
|
||||||
|
Reader(managerToParserQ, readerToParserQ),
|
||||||
|
Parser(readerToParserQ, parserToReactorQ),
|
||||||
|
]
|
||||||
|
[t.start() for t in threads]
|
||||||
|
while True:
|
||||||
|
got = parserToReactorQ.get()
|
||||||
|
if not got:
|
||||||
|
break
|
||||||
|
print(got)
|
||||||
|
[t.join() for t in threads]
|
||||||
|
|
||||||
|
def log(*args):
|
||||||
|
print(">", *args, file=sys.stderr)
|
||||||
|
|
||||||
|
class Manager(threading.Thread):
|
||||||
|
def __init__(self, outq):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.outq = outq
|
||||||
|
inq = queue.Queue(maxsize=1)
|
||||||
|
def catcher(sig, frame):
|
||||||
|
inq.put(None)
|
||||||
|
self.inq = inq
|
||||||
|
signal.signal(signal.SIGINT, catcher)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
log("Manager.run: start")
|
||||||
|
self.inq.get()
|
||||||
|
self.outq.put(None)
|
||||||
|
log("Manager.run: stop")
|
||||||
|
|
||||||
|
class Reader(threading.Thread):
|
||||||
|
def __init__(self, inq, outq):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.name = environ.get("MIC_NAME", "pulse_monitor")
|
||||||
|
self.inq = inq
|
||||||
|
self.outq = outq
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
log("Reader.run: start")
|
||||||
|
idx = [
|
||||||
|
idx for idx,v in enumerate(
|
||||||
|
sr.Microphone.list_microphone_names(),
|
||||||
|
) if v in self.name.split(",")
|
||||||
|
][0]
|
||||||
|
with sr.Microphone(device_index=idx) as mic:
|
||||||
|
while not self.should_stop():
|
||||||
|
try:
|
||||||
|
self.outq.put(self._run(mic))
|
||||||
|
except Exception as e:
|
||||||
|
log("Reader.run: error:", e)
|
||||||
|
self.outq.put(None)
|
||||||
|
log("Reader.run: stop")
|
||||||
|
|
||||||
|
def should_stop(self):
|
||||||
|
return not self.inq.empty()
|
||||||
|
|
||||||
|
def _run(self, mic):
|
||||||
|
mic_timeout = int(environ.get("MIC_TIMEOUT", 5))
|
||||||
|
r = sr.Recognizer()
|
||||||
|
return r.listen(
|
||||||
|
mic,
|
||||||
|
timeout=mic_timeout,
|
||||||
|
phrase_time_limit=mic_timeout,
|
||||||
|
)
|
||||||
|
|
||||||
|
class Parser(threading.Thread):
|
||||||
|
def __init__(self, inq, outq):
|
||||||
|
threading.Thread.__init__(self)
|
||||||
|
self.inq = inq
|
||||||
|
self.outq = outq
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
log("Parser.run: start")
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
clip = self.inq.get()
|
||||||
|
if not clip:
|
||||||
|
break
|
||||||
|
self.outq.put(self._run(clip))
|
||||||
|
except Exception as e:
|
||||||
|
log("Parser.run: error:", e)
|
||||||
|
self.outq.put(None)
|
||||||
|
log("Parser.run: stop")
|
||||||
|
|
||||||
|
def _run(self, clip):
|
||||||
|
r = sr.Recognizer()
|
||||||
|
return r.recognize_whisper(clip, language="english")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Loading…
Reference in New Issue