2017-11-10 14 views
1

google speech recognition API을 파이썬 플라스크 서버에 호출하여 마이크에서 음성 인식을하고 웹 페이지에 결과를 표시하는 웹을 작성했습니다. post과 socket.io를 시도했지만 실패했습니다. 내가 어떻게 해? 웹 클라이언트 :파이썬 서버에서 웹 클라이언트로 Google 음성 인식 결과를 보내는 방법

var socket = io.connect(); 
$('#start_speech').click(function(){ 
     socket.emit('speech_start'); 
     }); 

socket.on('speech_result', function(msg){ 
     socket.emit('speech_result') 
     console.log(msg.data); 
     $('#interim-span').html(msg.data);   
     }); 

음성 인식 기능 :

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'secret!' 
socketio = SocketIO(app) 

@socketio.on('speech_start') 
def speech_recognition(): 
    RATE = 16000 
    CHUNK = int(RATE/10) # 100ms 
    language_code = 'en-US' # a BCP-47 language tag 

    client = speech.SpeechClient() 
    config = types.RecognitionConfig(
     encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16, 
     sample_rate_hertz=RATE, 
     language_code=language_code, 
     enable_word_time_offsets=True) 
    streaming_config = types.StreamingRecognitionConfig(
     config=config, 
     interim_results=True) 

    with MicrophoneStream(RATE, CHUNK) as stream: 
     audio_generator = stream.generator() 
     requests = (types.StreamingRecognizeRequest(audio_content=content) 
        for content in audio_generator) 

     responses = client.streaming_recognize(streaming_config, requests) 

     listen_loop(responses) 



def listen_loop(responses): 
      print("begin loop") 
      for response in responses: 
       if not response.results: 
        continue 
       result = response.results[0] 
       if not result.alternatives: 
        continue 
       alternative = result.alternatives[0] 
       transcript = alternative.transcript 
       if not result.is_final: 
        print(transcript) 
        socketio.emit('speech_result', {data: speech})  
       else: 
        print(transcript) 
        socketio.emit('speech_result', {data: speech}) 
        if re.search(r'\b(exit|quit)\b', transcript, re.I): 
         print('Exiting..') 
         break 

문서에 따르면, 전달 responses는 응답이 서버에 의해 제공 될 때까지 차단하는 발전기이다. 처음에 post 시도하고 루프에서 결과를 반환하지만 "ValueError :보기 함수 응답을 반환하지 않았습니다."있어요.

그런 다음 문제를 봤고 socketio를 시도했습니다. 콘솔에서 결과를 볼 수있는 speech_recognition 함수가 호출되었지만 speech_result 메시지를받지 못했습니다. 나는 그것이 speech_start의 연결에있을 때 다른 사람과 연결할 수 없다고 생각합니까?

사실 나는 실시간으로 음성 인식 결과를 보여주는 google speech webpage에 데모를 발견했지만 어떻게했는지는 알 수 없습니다. 그래서 socketio의 문제입니까 아니면 다른 방법을 시도해야합니까?

답변

0

이 문제를 해결했습니다. 요점은 eventlet.sleep을 사용하여 소켓을 플러시하는 것입니다.

eventlet.spawn(speech_recognition) 

그리고 기능 speech_recognition에서

:

socketio.emit('server_response', {'data': transcript}) 
eventlet.sleep(0.2)