【发布时间】:2017-11-14 12:22:29
【问题描述】:
我正在使用 websockets 将请求发送到 IBM 的语音到文本 api,并且我收到一个持续的管道中断错误。 IBM Speech to text api 的文档说它可以占用 4mb 的帧,但我只能给它 70 kb 而不会破坏它。 https://www.ibm.com/watson/developercloud/doc/speech-to-text/websockets.html#WSopen 此外,如果我提供一个小于 70kb(5 秒)的文件,它的工作原理是不返回任何东西。
import websocket
from requests import get
import user_info
import json
import time
import threading
api_token = "https://stream.watsonplatform.net/authorization/api/v1/token"
s2t_url = "wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize"
s2t_model = 'es-ES_BroadbandModel'
mb_chunk = 1024*50
# https://pypi.python.org/pypi/websocket-clien*
# https://www.ibm.com/watson/developercloud/doc/speech-to-text/websockets.html
# -------
# on_open
# -------
def on_open(ws):
"""
Called by the websocet after it is
opened and sends metadataabout the sound file
"""
print("--------------WebSocket is open--------------")
message = {
'action': 'start',
'content-type': 'audio/wav'
}
#def send_binary(*args):
ws.send(json.dumps(message))
i = 0
with open("Deepak2_hwv4122_uncompressed.wav", "rb") as wav:
# while True:
piece = wav.read(mb_chunk)
ws.send(piece)
print(i)
i+=1
if not piece:
#break
pass
wav.close()
# ws.close()
#t = threading.Thread(target=send_binary)
#t.start()
# ----------
# on_message
# ----------
def on_message(ws, message):
print("------------------MESSAGE------------------")
print(message)
# --------
# on_error
# --------
def on_error(ws, error):
print(error)
print("------------------ERROR------------------")
# --------
# on_close
# --------
def on_close(ws):
print("------------Connection is Closed-----------")
ws.close()
# ----------------
# get_token
# ----------------
def get_token():
"""
REST request to get the watson voice service API token
"""
url = api_token + "?url=" + user_info.AUTH['url']
print("URL: " + url)
res = get(url, auth=(user_info.AUTH['username'], user_info.AUTH['password']))
print('Auth Token: ' + res.text)
return res.text
# ----
# main
# ----
if __name__ == "__main__":
global ws_url
cur_token = get_token()
ws_url = s2t_url + '?watson-token=' + cur_token + '&model=' + s2t_model
print("ws_uri: " + ws_url)
# Start WebSocket Connection
websocket.enableTrace(True)
ws = websocket.WebSocketApp(ws_url, on_message=on_message, on_error=on_error, on_close=on_close)
ws.on_open = on_open
ws.run_forever()
我得到的错误是 [Errno 32] Broken pipe File "/home/dell/rahmi/env/lib/python3.5/site-packages/websocket/_app.py", 第 268 行,在 _callback 中 callback(self, *args) 文件“watson-test.py”,第 35 行,在 on_open ws.send(piece) 文件 "/home/dell/rahmi/env/lib/python3.5/site-packages/websocket/_app.py", 第 117 行,在发送中 如果不是 self.sock 或 self.sock.send(data, opcode) == 0: 文件 "/home/dell/rahmi/env/lib/python3.5/site-packages/websocket/_core.py", 第 234 行,在发送中 返回 self.send_frame(frame) 文件“/home/dell/rahmi/env/lib/python3.5/site-packages/websocket/_core.py”, 第 259 行,在 send_frame 中 l = self._send(数据)文件“/home/dell/rahmi/env/lib/python3.5/site-packages/websocket/_core.py”, 第 423 行,在 _send 返回发送(self.sock,数据)文件“/home/dell/rahmi/env/lib/python3.5/site-packages/websocket/_socket.py”, 第 116 行,在发送中 返回 sock.send(data) 文件“/usr/lib/python3.5/ssl.py”,第 861 行,在发送中 return self._sslobj.write(data) File "/usr/lib/python3.5/ssl.py", line 586, in write return self._sslobj.write(data)
【问题讨论】:
标签: python websocket speech-to-text ibm-watson