import os
import openpyxl
from xml.etree import ElementTree as ET
import websocket
import datetime
import hashlib
import base64
import hmac
import json
from urllib.parse import urlencode
import time
import ssl
from wsgiref.handlers import format_date_time
from datetime import datetime
from time import mktime
import _thread as thread
STATUS_FIRST_FRAME = 0
STATUS_CONTINUE_FRAME = 1
STATUS_LAST_FRAME = 2
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","ptt":0,
"vinfo":0,"vad_eos":30000,"nunum":0}
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'),
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\"" % (
self.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 on_message(ws, message):
code = json.loads(message)["code"]
sid = json.loads(message)["sid"]
if code != 0:
errMsg = json.loads(message)["message"]
else:
data = json.loads(message)["data"]["result"]["ws"]
result = ""
for i in data:
for w in i["cw"]:
result += w["w"]
r=json.dumps(data, ensure_ascii=False)
r=json.loads(r)
result=r[0]['cw'][0]['w']
wb=openpyxl.load_workbook('D:/tim.xlsx')
ws = wb['Sheet']
ws['A2'] = result
wb.save('D:/tim.xlsx')
def on_error(ws, error):
return
def on_close(object,self,ws):
return
def on_open(ws):
def run(*args):
frameSize = 8000
intervel = 0.04
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"}}
d = json.dumps(d)
ws.send(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(intervel)
ws.close()
thread.start_new_thread(run, ())
if __name__ == "__main__":
path = 'D:/voice/'
dict = {'boliping': '玻璃瓶', 'caogaozhi': '草稿纸',
'gandianchi': '干电池', 'guozike': '瓜子壳',
'guoqiyaopin': '过期药品', 'haimian': '海绵',
'jiuyifu': '旧衣服', 'kouzhao': '口罩',
'maosha': '猫砂', 'niunaihe': '牛奶盒',
'suliaodai': '塑料袋', 'toufa': '头发',
'weishengzhi': '卫生纸', 'xiaopiao': '小票',
'yantou': '烟头'}
time1 = datetime.now()
for filename in os.listdir(path):
name = filename
newpath = os.path.join(path, filename)
for wav in os.listdir(newpath):
name=wav.split('_',1)
name=name[0]
TEXT = '\uFEFF' + str(dict[name])
if name=='guozike':
name='guazike'
m = os.path.join(newpath, wav)
m.replace('\\', '/')
wsParam = Ws_Param(APPID='', APISecret='',
APIKey='',
AudioFile=m)
websocket.enableTrace(False)
wsUrl = wsParam.create_url()
ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close)
ws.on_open = on_open
ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
wb = openpyxl.load_workbook('D:/tim.xlsx')
sheet1 = wb['Sheet']
cell = sheet1['A2']
result = cell.value
sheet2 = wb[name]
data = [m, " ", result]
sheet2.append(data)
wb.save('D:/tim.xlsx')
time2 = datetime.now()
print(time2-time1)
print('finish!')