import json import os from aliyunsdkcore.acs_exception.exceptions import ClientException from aliyunsdkcore.acs_exception.exceptions import ServerException from aliyunsdkcore.client import AcsClient from aliyunsdkcore.request import CommonRequest from common.log import log def file_trans(fileLink): # 地域ID,固定值。 REGION_ID = "cn-beijing" PRODUCT = "nls-filetrans" DOMAIN = "filetrans.cn-beijing.aliyuncs.com" API_VERSION = "2018-08-17" POST_REQUEST_ACTION = "SubmitTask" GET_REQUEST_ACTION = "GetTaskResult" # 请求参数 KEY_APP_KEY = "appkey" KEY_FILE_LINK = "file_link" KEY_VERSION = "version" KEY_ENABLE_WORDS = "enable_words" # 是否开启智能分轨 KEY_AUTO_SPLIT = "auto_split" # 响应参数 KEY_TASK = "Task" KEY_TASK_ID = "TaskId" KEY_STATUS_TEXT = "StatusText" KEY_RESULT = "Result" # 状态值 STATUS_SUCCESS = "SUCCESS" STATUS_RUNNING = "RUNNING" STATUS_QUEUEING = "QUEUEING" # 创建AcsClient实例 client = AcsClient(os.getenv('ALIYUN_ACCESS_KEY_ID'), os.getenv('ALIYUN_ACCESS_SECRET'), REGION_ID) # 提交录音文件识别请求 postRequest = CommonRequest() postRequest.set_domain(DOMAIN) postRequest.set_version(API_VERSION) postRequest.set_product(PRODUCT) postRequest.set_action_name(POST_REQUEST_ACTION) postRequest.set_method('POST') # 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置。 # 设置是否输出词信息,默认为false,开启时需要设置version为4.0。 # task = {KEY_APP_KEY: "IET8NhqIaLoPzdet", KEY_FILE_LINK: fileLink, KEY_VERSION: "4.0", KEY_ENABLE_WORDS: False} # 开启智能分轨,如果开启智能分轨,task中设置KEY_AUTO_SPLIT为True。 task = { KEY_APP_KEY : os.getenv('ALIYUN_APP_KEY'), KEY_FILE_LINK : fileLink, KEY_VERSION : "4.0", KEY_ENABLE_WORDS : False, KEY_AUTO_SPLIT : True, "supervise_type":2, "speaker_num":2, "enable_callback":True, "callback_url":"https://toolsapi.gkscrm.com/api/v1/gpt/ali_trans_callback" } task = json.dumps(task) postRequest.add_body_params(KEY_TASK, task) taskId = "" try: postResponse = client.do_action_with_exception(postRequest) postResponse = json.loads(postResponse) log.info("录音文件识别任务:" + json.dumps(postResponse,indent=4)) statusText = postResponse[KEY_STATUS_TEXT] if statusText == STATUS_SUCCESS: taskId = postResponse[KEY_TASK_ID] log.info("录音文件识别请求成功响应!任务ID:" + str(taskId)) return str(taskId) else: log.error("录音文件识别任务失败!", statusText) return False except ServerException as e: log.error("录音文件识别失败! 服务端异常", e) return False except ClientException as e: log.error("录音文件识别失败! 客户端异常", e) return False # # 创建CommonRequest,设置任务ID。 # getRequest = CommonRequest() # getRequest.set_domain(DOMAIN) # getRequest.set_version(API_VERSION) # getRequest.set_product(PRODUCT) # getRequest.set_action_name(GET_REQUEST_ACTION) # getRequest.set_method('GET') # getRequest.add_query_param(KEY_TASK_ID, taskId) # # 提交录音文件识别结果查询请求 # # 以轮询的方式进行识别结果的查询,直到服务端返回的状态描述符为"SUCCESS"、"SUCCESS_WITH_NO_VALID_FRAGMENT", # # 或者为错误描述,则结束轮询。 # statusText = "" # while True: # try: # getResponse = client.do_action_with_exception(getRequest) # getResponse = json.loads(getResponse) # log.info("录音文件识别结果:" + json.dumps(getResponse,indent=4)) # statusText = getResponse[KEY_STATUS_TEXT] # if statusText == STATUS_RUNNING or statusText == STATUS_QUEUEING: # # 继续轮询 # time.sleep(5) # else: # # 退出轮询 # break # except ServerException as e: # log.error("录音文件识别查询失败! 服务端异常", e) # except ClientException as e: # log.error("录音文件识别查询失败! 客户端异常", e) # if statusText == STATUS_SUCCESS: # log.info("录音文件识别结束!成功") # return getResponse # else: # log.error("录音文件识别结束!失败", statusText) # return False