如何将Websocket数据添加到沃森语音到文本队列中

时间:2019-04-08 22:51:22

标签: python flask websocket ibm-watson speech-to-text

我希望在浏览器中记录音频的连续双向转录,该浏览器是通过Python Flask后端发送到Watson Speech to Text的。我可以成功地将音频发送到服务器,并将结果发送到浏览器。此外,该代码还会提供表明其已成功连接到IBM Watson Speech to Text API的消息。但是,我似乎无法将服务器内部的音频数据添加到watson python sdk所需的audio_source队列中。也就是说,没有转录发生。

我将基于在此处使用麦克风示例的语音到文本的方法:https://github.com/watson-developer-cloud/python-sdk/blob/master/examples/microphone-speech-to-text.py

我正在使用此处显示的方法来进行Flask Websocket连接: https://github.com/diewland/Flask-SocketIO-Audio

这只是上下文的样板:

from ibm_watson import SpeechToTextV1
from ibm_watson.websocket import RecognizeCallback, AudioSource
from threading import Thread, Lock
from Queue import Queue, Full

CHUNK = 1024
BUF_MAX_SIZE = CHUNK * 10
# Buffer to store audio
q = Queue(maxsize=int(round(BUF_MAX_SIZE / CHUNK)))
audio_source = AudioSource(q, True, True)

class MyRecognizeCallback(RecognizeCallback):
    def __init__(self):
        RecognizeCallback.__init__(self)

    def on_transcription(self, transcript):
        print('=======================')
        print(transcript)
        print('=======================')

    def on_connected(self):
        print('Connection was successful')

    def on_error(self, error):
        print('Error received: {}'.format(error))

    def on_inactivity_timeout(self, error):
        print('Inactivity timeout: {}'.format(error))

    def on_listening(self):
        print('Service is listening')

    def on_hypothesis(self, hypothesis):
        print(hypothesis)

    def on_data(self, data):
        print('=======================')
        print(data)
        print('=======================')

    def on_close(self):
        print("Connection closed")


def recognize_using_weboscket(*args):
    mycallback = MyRecognizeCallback()
    speech_to_text.recognize_using_websocket(audio=audio_source,
                                             content_type='audio/l16; rate=44100',
                                             recognize_callback=mycallback,
                                             interim_results=True)

我认为问题可能出在我启动“ identify_using_websocket”线程的位置(如下)。它确实连接并向我发送正在监听的消息。我尝试了多种不同的方法来启动这个accept_using_websockets线程,但这是唯一一种1)似乎连接到watson的方法,2)不会将代码锁定在其他位置,并且3)仍然输出正确的音频最后录制。

@socketio.on('connect', namespace='/transcription')
def test_connect():
    global thread
    with thread_lock:
       if thread is None:
            thread = socketio.start_background_task(target=recognize_using_weboscket)

    session['audio'] = []

    emit('my_response', {'data': 'Connected', 'count': 0})

但是,当我使用下面的q.put(data)向队列添加更多数据时,队列(q)永远不会改变。我认为audio_source / queue的上下文可能无法以我认为的方式提供。

@socketio.on('audio', namespace='/transcription')
def handle_my_custom_event(audio):
        values = OrderedDict(sorted(audio.items(), key=lambda t:int(t[0]))).values()
    session['audio'] += values
    q.put(list(values))
    print('queue size:', q.qsize())
    print(list(values)[-1])

使用麦克风的Watson STT使用pyaudio回调将新数据添加到队列中,我将用上面的websocket回调替换该数据以尝试模仿这种行为。

# define callback for pyaudio to store the recording in queue
def pyaudio_callback(in_data, frame_count, time_info, status):
    try:
        q.put(in_data)
    except Full:
        pass # discard
    return (None, pyaudio.paContinue)

即使接收到的音频值适当更改,队列大小也不会改变(上面的Flask-SocketIO-Audio示例包括文件写出,即使添加了此代码,输出的wav文件也是正确的)。我似乎没有适当地更改队列和/或音频源以将数据发送到沃森。

我也完全不确定浏览器正在发送的数据格式。在将数据写入波形文件之前需要进行一些处理,并且STT麦克风示例似乎表明它可能是音频/ 16,但是我不确定在将其提交到队列之前是否需要进一步处理数据。

谢谢

0 个答案:

没有答案