rust-whisper/whisper-2023/microphone_recognition.py

84 lines
2.3 KiB
Python

#!/usr/bin/env python3
# https://github.com/Uberi/speech_recognition/blob/master/examples/microphone_recognition.py
# NOTE: this example requires PyAudio because it uses the Microphone class
import speech_recognition as sr
import time
import threading
import queue
from sys import stderr
from os import environ
class Recognizer(threading.Thread):
def __init__(self, q):
threading.Thread.__init__(self)
self.q = q
def run(self):
while True:
got = self.q.get()
self.one(got)
def one(self, audio):
r = sr.Recognizer()
## recognize speech using Sphinx
#try:
# start = time.time()
# print("Sphinx thinks you said " + r.recognize_sphinx(audio))
# print("/Sphinx", int(time.time()-start))
#except sr.UnknownValueError:
# print("Sphinx could not understand audio")
#except sr.RequestError as e:
# print("Sphinx error; {0}".format(e))
# recognize speech using whisper
try:
start = time.time()
print(r.recognize_whisper(audio, language="english"))
print("/Whisper", int(time.time()-start), file=stderr)
except sr.UnknownValueError:
print("Whisper could not understand audio")
except sr.RequestError as e:
print("Could not request results from Whisper")
class Listener():
def __init__(self):
if not environ.get("MIC_NAME", None):
from sys import stdin
for index, name in enumerate(sr.Microphone.list_microphone_names()):
print("[{0}] Microphone with name \"{1}\" found for `Microphone(device_index={0})`".format(index, name))
exit()
self.name = environ["MIC_NAME"]
self._mic = None
def mic(self):
if not self._mic:
self._mic = self.new_mic()
return self._mic
def new_mic(self):
idx = [idx for idx,v in enumerate(sr.Microphone.list_microphone_names()) if v in self.name.split(",")][0]
mic = sr.Microphone(device_index=idx)
mic.__enter__()
return mic
def run(self):
mic_timeout=int(environ.get("MIC_TIMEOUT", 5))
# obtain audio from the microphone
r = sr.Recognizer()
return r.listen(self.mic(), timeout=mic_timeout, phrase_time_limit=mic_timeout)
q = queue.Queue(maxsize=1)
l = Listener()
t = Recognizer(q)
t.start()
while True:
got = l.run()
q.put(got)
t.join()