本文共 4507 字,大约阅读时间需要 15 分钟。
import websocketimport datetimeimport hashlibimport base64import hmacimport jsonfrom urllib.parse import urlencodeimport timeimport sslfrom wsgiref.handlers import format_date_timefrom datetime import datetimefrom time import mktimeSTATUS_FIRST_FRAME = 0 # 第一帧的标识STATUS_CONTINUE_FRAME = 1 # 中间帧标识STATUS_LAST_FRAME = 2 # 最后一帧的标识finalResult = "" # 声明全局class Ws_Param(object): def __init__(self, APPID, APIKey, APISecret, AudioFile): self.APPID = APPID self.APIKey = APIKey self.APISecret = APISecret self.AudioFile = AudioFile self.CommonArgs = {"app_id": self.APPID} self.BusinessArgs = {"domain": "iat", "language": "zh_cn", "accent": "mandarin", "vinfo": 1, "vad_eos": 10000} def create_url(self): url = 'wss://ws-api.xfyun.cn/v2/iat' now = datetime.now() date = format_date_time(mktime(now.timetuple())) signature_origin = "host: ws-api.xfyun.cn\n" signature_origin += "date: " + date + "\n" signature_origin += "GET /v2/iat HTTP/1.1" signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'), hashlib.sha256).digest() signature_sha = base64.b64encode(signature_sha).decode('utf-8') authorization_origin = "api_key=%s, algorithm=hmac-sha256, headers=host date request-line, signature=%s" % (self.APIKey, signature_sha) authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode('utf-8') url = url + '?' + urlencode({"authorization": authorization, "date": date, "host": "ws-api.xfyun.cn"}) return urldef on_message(ws, message): global finalResult try: code = json.loads(message)["code"] sid = json.loads(message)["sid"] if code != 0: errMsg = json.loads(message)["message"] print("sid:%s call error:%s code is:%s" % (sid, errMsg, code)) else: data = json.loads(message)["data"]["result"]["ws"] result = "" for i in data: for w in i["cw"]: result += w["w"] print("sid:%s call success!,data is:%s" % (sid, json.dumps(data, ensure_ascii=False))) finalResult += result except Exception as e: print("receive msg,but parse exception:", e)def on_error(ws, error): print("### error:", error)def on_close(ws): print("### closed ###")def on_open(ws): def run(*args): frameSize = 8000 # 每一帧的音频大小 interval = 0.04 # 发送音频间隔(单位:s) status = STATUS_FIRST_FRAME with open(wsParam.AudioFile, "rb") as fp: while True: buf = fp.read(frameSize) if not buf: status = STATUS_LAST_FRAME if status == STATUS_FIRST_FRAME: d = { "common": wsParam.CommonArgs, "business": wsParam.BusinessArgs, "data": { "status": 0, "format": "audio/L16;rate=16000", "audio": str(base64.b64encode(buf), 'utf-8'), "encoding": "raw" } } ws.send(json.dumps(d)) status = STATUS_CONTINUE_FRAME elif status == STATUS_CONTINUE_FRAME: d = { "data": { "status": 1, "format": "audio/L16;rate=16000", "audio": str(base64.b64encode(buf), 'utf-8'), "encoding": "raw" } } ws.send(json.dumps(d)) elif status == STATUS_LAST_FRAME: d = { "data": { "status": 2, "format": "audio/L16;rate=16000", "audio": str(base64.b64encode(buf), 'utf-8'), "encoding": "raw" } } ws.send(json.dumps(d)) time.sleep(1) break time.sleep(interval) ws.close() thread.start_new_thread(run, ()) 请注意:以上代码仅为示例,具体参数配置请根据实际需求进行调整。代码中包含了WebSocket连接的实现,包括消息处理、错误处理、连接关闭等功能。如果需要更详细的功能扩展或优化,请根据实际应用场景进行调整。 转载地址:http://iqofk.baihongyu.com/