我希望在浏览器中记录音频的连续双向转录,该浏览器是通过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,但是我不确定在将其提交到队列之前是否需要进一步处理数据。>
谢谢