ali_filetrans.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import json
  2. import os
  3. import time
  4. from aliyunsdkcore.acs_exception.exceptions import ClientException
  5. from aliyunsdkcore.acs_exception.exceptions import ServerException
  6. from aliyunsdkcore.client import AcsClient
  7. from aliyunsdkcore.request import CommonRequest
  8. from common.log import log
  9. def file_trans(fileLink):
  10. # 地域ID,固定值。
  11. REGION_ID = "cn-beijing"
  12. PRODUCT = "nls-filetrans"
  13. DOMAIN = "filetrans.cn-beijing.aliyuncs.com"
  14. API_VERSION = "2018-08-17"
  15. POST_REQUEST_ACTION = "SubmitTask"
  16. GET_REQUEST_ACTION = "GetTaskResult"
  17. # 请求参数
  18. KEY_APP_KEY = "appkey"
  19. KEY_FILE_LINK = "file_link"
  20. KEY_VERSION = "version"
  21. KEY_ENABLE_WORDS = "enable_words"
  22. # 是否开启智能分轨
  23. KEY_AUTO_SPLIT = "auto_split"
  24. # 响应参数
  25. KEY_TASK = "Task"
  26. KEY_TASK_ID = "TaskId"
  27. KEY_STATUS_TEXT = "StatusText"
  28. KEY_RESULT = "Result"
  29. # 状态值
  30. STATUS_SUCCESS = "SUCCESS"
  31. STATUS_RUNNING = "RUNNING"
  32. STATUS_QUEUEING = "QUEUEING"
  33. # 创建AcsClient实例
  34. client = AcsClient(os.getenv('ALIYUN_ACCESS_KEY_ID'), os.getenv('ALIYUN_ACCESS_SECRET'), REGION_ID)
  35. # 提交录音文件识别请求
  36. postRequest = CommonRequest()
  37. postRequest.set_domain(DOMAIN)
  38. postRequest.set_version(API_VERSION)
  39. postRequest.set_product(PRODUCT)
  40. postRequest.set_action_name(POST_REQUEST_ACTION)
  41. postRequest.set_method('POST')
  42. # 新接入请使用4.0版本,已接入(默认2.0)如需维持现状,请注释掉该参数设置。
  43. # 设置是否输出词信息,默认为false,开启时需要设置version为4.0。
  44. # task = {KEY_APP_KEY: "IET8NhqIaLoPzdet", KEY_FILE_LINK: fileLink, KEY_VERSION: "4.0", KEY_ENABLE_WORDS: False}
  45. # 开启智能分轨,如果开启智能分轨,task中设置KEY_AUTO_SPLIT为True。
  46. 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}
  47. task = json.dumps(task)
  48. postRequest.add_body_params(KEY_TASK, task)
  49. taskId = ""
  50. try:
  51. postResponse = client.do_action_with_exception(postRequest)
  52. postResponse = json.loads(postResponse)
  53. log.info("录音文件识别任务:" + json.dumps(postResponse,indent=4))
  54. statusText = postResponse[KEY_STATUS_TEXT]
  55. if statusText == STATUS_SUCCESS:
  56. taskId = postResponse[KEY_TASK_ID]
  57. log.info("录音文件识别请求成功响应!任务ID:" + str(taskId))
  58. else:
  59. log.error("录音文件识别任务失败!", statusText)
  60. return False
  61. except ServerException as e:
  62. log.error("录音文件识别失败! 服务端异常", e)
  63. return False
  64. except ClientException as e:
  65. log.error("录音文件识别失败! 客户端异常", e)
  66. return False
  67. # 创建CommonRequest,设置任务ID。
  68. getRequest = CommonRequest()
  69. getRequest.set_domain(DOMAIN)
  70. getRequest.set_version(API_VERSION)
  71. getRequest.set_product(PRODUCT)
  72. getRequest.set_action_name(GET_REQUEST_ACTION)
  73. getRequest.set_method('GET')
  74. getRequest.add_query_param(KEY_TASK_ID, taskId)
  75. # 提交录音文件识别结果查询请求
  76. # 以轮询的方式进行识别结果的查询,直到服务端返回的状态描述符为"SUCCESS"、"SUCCESS_WITH_NO_VALID_FRAGMENT",
  77. # 或者为错误描述,则结束轮询。
  78. statusText = ""
  79. while True:
  80. try:
  81. getResponse = client.do_action_with_exception(getRequest)
  82. getResponse = json.loads(getResponse)
  83. log.info("录音文件识别结果:" + json.dumps(getResponse,indent=4))
  84. statusText = getResponse[KEY_STATUS_TEXT]
  85. if statusText == STATUS_RUNNING or statusText == STATUS_QUEUEING:
  86. # 继续轮询
  87. time.sleep(5)
  88. else:
  89. # 退出轮询
  90. break
  91. except ServerException as e:
  92. log.error("录音文件识别查询失败! 服务端异常", e)
  93. except ClientException as e:
  94. log.error("录音文件识别查询失败! 客户端异常", e)
  95. if statusText == STATUS_SUCCESS:
  96. log.info("录音文件识别结束!成功")
  97. return getResponse
  98. else:
  99. log.error("录音文件识别结束!失败", statusText)
  100. return False