我在使用基于会话的语音识别界面时遇到问题。具体来说,我试图将较长的音频流分成多个块,一次上传一个,并在结尾处接收完整的解析文本(而不是从单个源流式传输分块音频)。
IBM Watson提供语音识别的无状态和有状态接口。更常见的无状态协议接受(分块)音频流并在完成时返回解析的内容。基于会话的方法允许客户端建立持久会话,使用多部分将音频作为多个块上传,并查询结果,这对于处理长流或处理麦克风输入非常有用。
我能够找到一些tutorials和discussions但是没有一个例子似乎有效(可能已经过时,因为界面正在迅速发展)。
这是一个代表性的样本。以下POST将创建一个会话:
curl -X POST -u "user:password" -H "Content-Type: application/json" \
https://stream.watsonplatform.net/speech-to-text/api/v1/sessions -verbose -d ""
然后,下一个应该使用上一个命令提供的端点提交一部分音频数据来识别服务:
curl -k -X POST -u "user:password" \
-H "content-type: audio/flac" --data-binary @temp.2.flac -H "Transfer-encoding: chunked" \
--cookie "SESSIONID=65097570295a0eccd15fd6dba326487416634371; Secure" \
https://stream.watsonplatform.net/speech-to-text/api/v1/sessions/65097570295a0eccd15fd6dba3264874/recognize -verbose
最后,此命令应返回结果:
curl -k -X GET -u "user:password" \
--cookie "SESSIONID=65097570295a0eccd15fd6dba326487416634371; Secure" \
https://stream.watsonplatform.net/speech-to-text/api/v1/sessions/65097570295a0eccd15fd6dba3264874/observe_result -verbose
第一个命令完成没有任何问题,返回HTTP 201 Created状态,以及合理查看的端点,它们(与SESSIONID cookie一起)用于后续调用。:
"recognize": "https://stream.watsonplatform.net/speech-to-text/api/v1/sessions/65097570295a0eccd15fd6dba3264874/recognize",
"recognizeWS": "wss://stream.watsonplatform.net/speech-to-text/api/v1/sessions/65097570295a0eccd15fd6dba3264874/recognize",
"observe_result": "https://stream.watsonplatform.net/speech-to-text/api/v1/sessions/65097570295a0eccd15fd6dba3264874/observe_result",
"session_id": "65097570295a0eccd15fd6dba3264874",
"new_session_uri": "https://stream.watsonplatform.net/speech-to-text/api/v1/sessions/65097570295a0eccd15fd6dba3264874"
但是,第二个和第三个命令都失败,HTTP代码为404“会话不存在”。错误。
非常感谢任何curl或Java指针或示例。
答案 0 :(得分:1)
我刚刚意识到这篇文章;抱歉耽搁了。我不确定您是如何发出命令的,但问题可能是会话在后续调用之前超时。如果默认的30秒会话超时在后续调用之前到期,则服务返回带有指示消息的404。如前一位用户所示,这也可能是您提供cookie的方式的问题。但是我经历过会话超时问题,这也可能是罪魁祸首。
答案 1 :(得分:0)
我写了一个Gist,它使用curl命令识别PCM文件。在您的情况下,您只需要更改音频格式并指向您的文件 见https://gist.github.com/germanattanasio/ae26dc0144f229ad913a
在处理cookie时,将它们保存在文件中然后在后续请求中使用该文件总是好的。
例如
curl -X POST -u "user:password" -H "Content-Type: application/json" \
https://stream.watsonplatform.net/speech-to-text/api/v1/sessions \
-verbose -d ""
可以写成:
curl -X POST -b cookies.txt -c cookies.txt -u $USERNAME:$PASSWORD \
"https://stream.watsonplatform.net/speech-to-text/api/v1/sessions" \
-d ""
结果将相同,cookies.txt
将包含SESSIONID
。
然后你可以使用:
curl -X POST -b cookies.txt -c cookies.txt -u $USERNAME:$PASSWORD \
"https://stream.watsonplatform.net/speech-to-text/api/v1/sessions/$SESSION_ID/recognize?continuous=true" \
--header "Content-Type: audio/flac" --header "Transfer-Encoding: chunked" \
--data-binary @temp.2.flac
确保使用第一个curl命令中的值更新$SESSION_ID
。