forked from killua/TakwayDisplayPlatform
67 lines
2.4 KiB
Python
67 lines
2.4 KiB
Python
|
import websockets
|
|||
|
import datetime
|
|||
|
import hashlib
|
|||
|
import base64
|
|||
|
import hmac
|
|||
|
import json
|
|||
|
from urllib.parse import urlencode
|
|||
|
from wsgiref.handlers import format_date_time
|
|||
|
from datetime import datetime
|
|||
|
from time import mktime
|
|||
|
from config import Config
|
|||
|
|
|||
|
def generate_xf_asr_url():
|
|||
|
#设置讯飞流式听写API相关参数
|
|||
|
APIKey = Config.XF_ASR.API_KEY
|
|||
|
APISecret = Config.XF_ASR.API_SECRET
|
|||
|
|
|||
|
#鉴权并创建websocket_url
|
|||
|
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(APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
|
|||
|
digestmod=hashlib.sha256).digest()
|
|||
|
signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')
|
|||
|
authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % (
|
|||
|
APIKey, "hmac-sha256", "host date request-line", signature_sha)
|
|||
|
authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
|
|||
|
v = {
|
|||
|
"authorization": authorization,
|
|||
|
"date": date,
|
|||
|
"host": "ws-api.xfyun.cn"
|
|||
|
}
|
|||
|
url = url + '?' + urlencode(v)
|
|||
|
return url
|
|||
|
|
|||
|
|
|||
|
def make_first_frame(buf):
|
|||
|
first_frame = {"common" : {"app_id":Config.XF_ASR.APP_ID},"business" : {"domain":"iat","language":"zh_cn","accent":"mandarin","vad_eos":10000},
|
|||
|
"data":{"status":0,"format":"audio/L16;rate=16000","audio":buf,"encoding":"raw"}}
|
|||
|
return json.dumps(first_frame)
|
|||
|
|
|||
|
def make_continue_frame(buf):
|
|||
|
continue_frame = {"data":{"status":1,"format":"audio/L16;rate=16000","audio":buf,"encoding":"raw"}}
|
|||
|
return json.dumps(continue_frame)
|
|||
|
|
|||
|
def make_last_frame(buf):
|
|||
|
last_frame = {"data":{"status":2,"format":"audio/L16;rate=16000","audio":buf,"encoding":"raw"}}
|
|||
|
return json.dumps(last_frame)
|
|||
|
|
|||
|
def parse_xfasr_recv(message):
|
|||
|
code = message['code']
|
|||
|
if code!=0:
|
|||
|
raise Exception("讯飞ASR错误码:"+str(code))
|
|||
|
else:
|
|||
|
data = message['data']['result']['ws']
|
|||
|
result = ""
|
|||
|
for i in data:
|
|||
|
for w in i['cw']:
|
|||
|
result += w['w']
|
|||
|
return result
|
|||
|
|
|||
|
async def xf_asr_websocket_factory():
|
|||
|
url = generate_xf_asr_url()
|
|||
|
return await websockets.connect(url)
|