我在python3开发一个声控家庭助理。
启动时会创建一个线程来监听用户的语音输入。
listen()方法使用google语音识别,并将文本传递给一个方法,用于解析语音并执行来自用户的请求。在class ListenThread(threading.Thread):
def __init__(self):
super(ListenThread, self).__init__()
self._stop_event = threading.Event()
self._deaf_event = threading.Event()
def run(self):
while not self.stopped():
if self.deaf():
print('sleeping')
sleep(5)
print('waking up')
self._deaf_event.clear()
# Change for silent / listening mode
# listen_keyboard()
listen()
def deafen(self, time):
self._deaf_event.set()
def deaf(self):
return self._deaf_event.is_set()
def stop(self):
self._stop_event.set()
def stopped(self):
return self._stop_event.is_set()
如果用户没有用所需的代码字启动请求,比如amazoneecho上的“Alexa”或googleassistant上的“okaygoogle”,线程将休眠5秒,然后再次监听。这可以防止执行错误的请求。在
到目前为止还不错。
问题是,在播放音乐时,线程倾向于使用播放的音频作为音频输入,或者反复睡眠5秒,或者将真实语音输入与播放的歌曲混合,最终由于用户的无效请求而导致再次睡眠。
我想这就是问题所在,因为线程在“静音模式”下工作得很好,输入来自键盘而不是麦克风。在
唯一能让我想到的解决这个问题的方法就是用用户声音和歌曲本身的混合音频,从整个音频输入中减去音乐曲目中的音频。我们最近在大学里做了一些傅立叶变换,但这似乎有点过头了。你还有别的办法吗?在