如何在wit.ai中发送用于语音识别的分块音频数据?

时间:2018-04-06 16:36:47

标签: python stream speech-recognition wit.ai

我有一个大型mp3文件(约1.8GB),我必须使用wit.ai进行转录。 由于我正在使用wav文件,我将其转换为wav文件。

但是由于wit.ai的语音api不能超过10s长音频,我计划将文件串流传输。但有些我如何得到400响应(坏请求)。我无法找到,我发错了什么。以下是详细信息:

headers = {'authorization': 'Bearer ' + wit_access_token,
         'Content-Type': 'audio/wav','Transfer-encoding': 'chunked'}
with open('meeting-record.wav', 'rb') as f:
    audio = f.read(2048)  # taken it any number
resp = requests.post(API_ENDPOINT, headers = headers,
                 data = audio)
print(resp) 
data = json.loads(resp.content)
text = data['_text']
print(text)
f.close()

我收到以下输出

<Response [400]>
Traceback (most recent call last):
  File ".\sound-record.py", line 61, in <module>
    text = data['_text']
KeyError: '_text'

有人可以显示一些指针,它出错了吗?

2 个答案:

答案 0 :(得分:1)

我以前没有使用过wit.ai API,但是Bing Speech API似乎要求以类似的方式提供数据。我不确定是否由于代码而出错,但是为了正确地分块和流传输文件,您可以在其中添加另一个函数,如下所示:

def stream_audio_file(speech_file, chunk_size=1024):
    # Chunk audio file
    with open(speech_file, 'rb') as f:
        while 1:
            data = f.read(1024)
        if not data:
            break
        yield data

现在,只要您在文件中的某处具有该功能即可为您流式传输和分块数据,就可以返回到初始方法:

headers = {
    'Accept': 'application/json',
    'Transfer-Encoding': 'chunked',
    'Content-type': 'audio/wav',
    'Authorization': 'Bearer {0}'.format(YOUR_AUTH_TOKEN)
}

data = stream_audio_file(YOUR_AUDIO_FILE)

r = requests.post(url, headers=headers, data=data)

results = json.loads(r.content)

print(results)

旁注: 您提到想要在自己的服务器上安装某些产品。有一个名为pocketsphinx的不错的模块,该模块是免费的,托管在您的计算机上,并用Python编写。它与SpeechRecognition模块非常匹配,该模块在顶部提供了一个不错的层,因此您不必花费太多时间来格式化请求。

答案 1 :(得分:0)

Wit.ai不应该转录长文件,它是一个识别短命令的系统。您最好使用适当的服务:

还有很多其他人