get_script_from_tengxunyun.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import pandas as pd
  2. from urllib.parse import urlencode
  3. import requests
  4. import json
  5. import time
  6. from config.url import voice_to_script_task_submit_url, voice_to_script_task_result_url
  7. class GetScriptFromTengXunYunServer(object):
  8. def __init__(self, logger, db_engine, task_df, task_ids=None):
  9. self.logger = logger
  10. self.db_engine = db_engine
  11. self.task_ids = task_ids
  12. self.task_df = task_df[~task_df.signature.isnull()]
  13. def submit_task(self):
  14. """
  15. 向腾讯云提交语音转脚本的任务
  16. task_df: DataFrame columns 包含 signature 和 video_url
  17. """
  18. # 1 获取已经被提交过的任务
  19. sql = """select md5 signature from tb_asr_result """
  20. submitted_task_df = pd.read_sql(sql, self.db_engine)
  21. # 2 需要提交的任务,去掉历史被提交过的任务,防止重复提交浪费服务时长
  22. to_submit_task_df = self.task_df[~self.task_df.signature.isin(submitted_task_df.signature.values)]
  23. self.logger.info("向腾讯云提交语音转脚本的任务个数为 %s" % len(to_submit_task_df))
  24. # 3 发送请求,提交任务
  25. for index, row in to_submit_task_df.iterrows():
  26. material_md5 = row['signature']
  27. material_url = row['video_url']
  28. request_data = {"md5": material_md5, "url": material_url}
  29. request_full_path = voice_to_script_task_submit_url + '?' + urlencode(request_data)
  30. request = requests.post(request_full_path)
  31. try:
  32. result = json.loads(request.text)
  33. self.logger.info("素材:%s, 向腾讯云提交语音转脚本任务的返回信息为:%s " % (material_md5, result))
  34. except:
  35. self.logger.error("素材:%s, 向腾讯云提交语音转脚本任务的返回信息为:%s " % (material_md5, request.text))
  36. # 4 获取素材对应的发送请求的 task_id
  37. sql = """select task_id from tb_asr_result where md5 in %s""" % (tuple(self.task_df.signature.values),)
  38. task_id_df = pd.read_sql(sql, self.db_engine)
  39. self.task_ids = list(task_id_df['task_id'].values)
  40. def get_result(self):
  41. """
  42. 从腾讯云获取脚本
  43. 每隔1分钟获取一次,直到没有 执行中或者等待执行 的任务为止
  44. Status Integer 任务状态码,0:任务等待,1:任务执行中,2:任务成功,3:任务失败。
  45. StatusStr String 任务状态,waiting:任务等待,doing:任务执行中,success:任务成功,failed:任务失败。
  46. ErrorMsg String 失败原因说明。
  47. """
  48. self.logger.info("从腾讯云获取脚本的个数为%s" % len(self.task_ids))
  49. while True:
  50. sql = """select task_id, task_status from tb_asr_result where task_id in %s and task_status in (0,1)""" % \
  51. (tuple(self.task_ids),)
  52. task_status_df = pd.read_sql(sql, self.db_engine)
  53. if task_status_df.empty:
  54. break
  55. else:
  56. self.logger.info("从腾讯云获取脚本, 休眠一分钟,等待腾讯云任务计算完成。")
  57. time.sleep(10 * 1)
  58. for task_id in task_status_df.task_id.values:
  59. request_data = {'task_id': task_id}
  60. request_full_path = voice_to_script_task_result_url + '?' + urlencode(request_data)
  61. request = requests.post(request_full_path)
  62. try:
  63. result = json.loads(request.text)
  64. self.logger.info("task_id:%s, 从腾讯云获取脚本返回信息为:%s " % (task_id, result))
  65. except:
  66. self.logger.error("task_id:%s, 从腾讯云获取脚本返回信息为:%s " % (task_id, request.text))