2017-09-12 4 views
0

J'ai donc ce code qui prend le langage de l'utilisateur et le transcrit en texte en utilisant Google Cloud Speech API. Il est écrit sur la base de cet exemple de Google: https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/speech/cloud-client/transcribe_streaming_mic.pyPython comment puis-je sortir du générateur de blocage qui attend la réponse du serveur?

Je voulais ajouter un gestionnaire d'erreurs qui arrêterait le processus de transcription à chaque fois qu'il y a un problème de connexion Internet. Je crée un thread de contrôle de connexion qui vérifie la connexion Internet toutes les quelques secondes et définit un indicateur isConnectionError = True.

je parviens à arrêter le processus générateur d'enregistrement audio, mais je ne peux pas arrêter un autre processus de générateur qui bloque et attend pour le serveur d'envoyer un message de réponse:

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 
+0

Il devra fonctionner dans un thread différent, de sorte que les threads bloque. Je suggère qu'il met des réponses sur une file d'attente que vous pouvez vérifier/pop d'une manière non bloquante. –

Répondre

0

Comme suggéré par Kenny, je viens de lancer le générateur dans un fil séparé. Fonctionne parfaitement

0

Nous avons réalisé la même chose par websockets sur les auditeurs et les émetteurs Pour la connexion où la parole vers le texte se passe de la page Web au service Java