Python, как мне выйти из блокирующего генератора, ожидающего ответа сервера?

Итак, у меня есть этот код, который будет принимать речь пользователя и преобразовывать ее в текст с помощью Google Cloud Speech API. Он написан на основе этого примера из Google: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/speech/cloud-client/transcribe_streaming_mic.py

Я хотел добавить обработчик ошибок, который останавливал бы процесс транскрипции всякий раз, когда возникает проблема с подключением к Интернету. Я создаю поток монитора подключения, который проверяет интернет-соединение каждые несколько секунд и устанавливает флаг isConnectionError = True.

Мне удается остановить процесс генератора аудиозаписи, но я не могу остановить другой процесс генератора, который блокируется и ждет, пока сервер отправит ответное сообщение:

def listen_print_loop(responses):

"""Iterates through server responses and prints them.
The responses passed is a generator that will block until a response
is provided by the server.
Each response may contain multiple results, and each result may contain
multiple alternatives; for details, see <url removed>.  Here we
print only the transcription for the top alternative of the top result.
In this case, responses are provided for interim results as well. If the
response is an interim one, print a line feed at the end of it, to allow
the next result to overwrite it, until the response is a final one. For the
final one, print a newline to preserve the finalized transcription.
"""
num_chars_printed = 0
for response in responses:
    if not response.results:
        continue

    # The `results` list is consecutive. For streaming, we only care about
    # the first result being considered, since once it's `is_final`, it
    # moves on to considering the next utterance.
    result = response.results[0]
    if not result.alternatives:
        continue

    # Display the transcription of the top alternative.
    transcript = result.alternatives[0].transcript

    # Display interim results, but with a carriage return at the end of the
    # line, so subsequent lines will overwrite them.
    #
    # If the previous result was longer than this one, we need to print
    # some extra spaces to overwrite the previous result
    overwrite_chars = ' ' * (num_chars_printed - len(transcript))

    if not result.is_final:
        sys.stdout.write(transcript + overwrite_chars + '\r')
        sys.stdout.flush()

        num_chars_printed = len(transcript)

    else:
        print(transcript + overwrite_chars)

        # Exit recognition if any of the transcribed phrases could be
        # one of our keywords.
        if re.search(r'\b(exit|quit)\b', transcript, re.I):
            print('Exiting..')
            break

        num_chars_printed = 0

person akmalhakimi1991    schedule 12.09.2017    source источник
comment
Он должен будет работать в другом потоке, чтобы поток блокировался. Я бы посоветовал поместить ответы в очередь, которую вы можете проверить/вытолкнуть неблокирующим образом.   -  person Kenny Ostrom    schedule 12.09.2017


Ответы (2)


Мы достигли того же с помощью веб-сокетов на слушателях и эмиттерах для соединения, где речь в тексте происходит с веб-страницы на службу Java.

person user3776111    schedule 26.09.2017

Как предложил Кенни, я просто запускаю генератор в отдельном потоке. Работает безупречно

person akmalhakimi1991    schedule 28.09.2017