Несколько фраз с SpeechRecognition в python - PullRequest
0 голосов
/ 21 марта 2020

Я разместил полный код ниже, и я хотел бы иметь возможность добиться повторного выполнения audio = r.listen(source). Я получил код для повторения, но он каждый раз возвращает одно и то же. Мне не очень нравится сдаваться и приходить сюда с просьбой дать ответы (первое сообщение). Что мне нужно сделать, чтобы код возвращал новую фразу каждый раз, когда она выполняет функцию do_again(quit). По сути, программа просит что-то сказать, и с первого раза работает нормально. Когда мне предлагают продолжить или выйти и я ввожу 'c', я хочу повторить все заново. Любая помощь будет принята с благодарностью. PS Я новичок в python и, вероятно, делаю это совершенно неправильно. Любые советы также будут оценены!

Вот код (Вся критика приветствуется. Например: есть ли лучший способ сделать это чище?)

import speech_recognition as sr
import sys
r = sr.Recognizer()
m = sr.Microphone()

with m as source:
    print('Speak clearly for better results ...')
    audio = r.listen(source)

quit = 'c'
q = quit

def do_again(quit):
    quit = input('Press c to continue OR press q to quit: ')
    q = quit
    if q == 'q':
        print('Exiting program')
        sys.exit()
    elif q == 'c':
        print('Running again...')

    else:
        print('ERROR! Press c to continue OR press q to quit ')
        return q

response = {"success": True,
            "error": None,
            "transcription": None
}

while q == 'c':
    try:
        # I want this to return new phrase instead of returning the same phrase.
        response['transcription'] = r.recognize_sphinx(audio) # I want a new 'response' here
        print(f"[SPEECH RECOGNIZED] {response['transcription']}")

    except sr.UnknownValueError:
        print(f"[FATAL ERROR] Exiting...")
    except sr.RequestError as e:
        response['success'] = False
        response['error'] = 'API Unavailable/unresponsive'
        print(f"[FATAL ERROR] {response['error']} {e}")
    do_again(quit)

1 Ответ

0 голосов
/ 21 марта 2020

Я думаю, что нашел свой ответ. Я читал документацию в интерпретаторе python с функцией help(r.Recognizer). Я нашел listen_in_background метод. listen_in_background будет делать то, что мне нужно? Я знаю, что это глупая программа, но я планирую сделать что-то практичное для себя. Если это сработает, вы, ребята, можете закрыть эту ветку. Я чувствую себя очень глупо, ха-ха. Я попробую это, и если это плохо сработает, опубликуйте мое решение. Еще раз спасибо!

[ПРАВИТЬ] Это сработало! Я определил эту функцию: def callback(r,audio), которая необходима для stop_listening = r.listen_in_background(m, callback). Мне сложно понять цель этой строки: stop_listening(wait_for_stop=True). Если кто-то может объяснить немного, чтобы я мог использовать его лучше в будущем. Наконец, я добавил 'magi c word', чтобы выйти из программы (просто произнесите 'quit', и sys.quit() завершит программу.). Есть лучший способ сделать это?

Вот новый код:

import time
import speech_recognition as sr
import sys

def callback(r, audio):
    global done
    try:
        print(f"[PocketSphinx]: Thinks you said: '{r.recognize_sphinx(audio)}'. Read some more ")
    except sr.UnknownValueError:
        print(f"[PocketSphinx]: Fatal error! Unknown Value Error! Exiting program.")
    except sr.RequestError as ex:
        print(f"[PocketSphinx]: Fatal error! Could not process request! {ex}")
    if r.recognize_sphinx(audio) == 'quit':
        print(f"[PocketSphinx]: You said the magic word: 'quit'... Exiting program.")
        done = True

r = sr.Recognizer()
r.energy_threshold = 4000
m = sr.Microphone()
done = False
with m as source:
    r.adjust_for_ambient_noise(source)

print(f"[PocketSphinx]: Read to me... Say 'quit' to exit...")
stop_listening = r.listen_in_background(m, callback)

# 5 second delay 
for _ in range(50):
    time.sleep(0.1)

while not done:
    time.sleep(0.1)
    if done:
        stop_listening(wait_for_stop=True)
        sys.exit()
...