Завершение потока в python (также с использованием обратных вызовов) - PullRequest
1 голос
/ 01 августа 2020

Я работал с программным обеспечением для распознавания речи и нашел способ, чтобы распознаватель речи слушал бесконечно, чтобы было удобнее работать с пользователем. У меня есть команда kickout, которая должна завершить программу, если когда-либо будет произнесено слово terminate. Код показан ниже ...

import speech_recognition as sr
import sys

def callback(recognizer, audio):                          # this is called from the background thread
    try:
        print("You said " + recognizer.recognize_google(audio))
        if(text == 'Terminate' or  text == 'terminate'):
             sys.exit()
    except:
        pass
r = sr.Recognizer()
r.listen_in_background(sr.Microphone(), callback)
import time
while True: time.sleep(0.1) 

Я попытался настроить все потоки на демон и попытался использовать Os.exit (). Пожалуйста, дайте мне знать, если я могу еще что-нибудь попробовать.

1 Ответ

0 голосов
/ 01 августа 2020

Заявление об ограничении ответственности: это не проверено. У меня не установлен этот пакет.

Однако, просто прочитав исходный код на https://github.com/Uberi/speech_recognition/blob/master/speech_recognition/__init__.py, я обнаружил следующее:

Вызов listen_in_background возвращает ссылка на функцию stopper(), которая приемлемо завершает поток прослушивания. Чтобы использовать это, попробуйте следующее:

import time
import speech_recognition as sr
import sys

stop_it = False

def callback(recognizer, audio):  # this is called from the background thread
    global stop_it
    try:
        print("You said " + recognizer.recognize_google(audio))
        if text.lower() == 'terminate':
            stop_it = True
    except:
        pass

r = sr.Recognizer()
just_try_and_stop_me = r.listen_in_background(sr.Microphone(), callback)

while True:
    if stop_it:
        just_try_and_stop_me(wait_for_stop=True)
        break
    time.sleep(0.1)

NB: Глобальные переменные - это своего рода хакерство sh, поэтому для следующей задачи попробуйте инкапсулировать все это в соответствующий класс. . Но пока для начала это должно быть неплохо. Также нет необходимости заключать ваше условие в круглые скобки (это не C). Кроме того, метод .lower() для строки вернет версию в нижнем регистре для более простых сравнений без учета регистра.

...