25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

202 satır
7.5 KiB

  1. # -*- coding: utf-8 -*-
  2. import sys
  3. import base64
  4. import hashlib
  5. import hmac
  6. import json
  7. import os
  8. import time
  9. import requests
  10. import urllib
  11. from pydub import AudioSegment
  12. import subprocess
  13. from pathlib import Path
  14. from openai import OpenAI
  15. #优化压缩讯飞识别出来的文字
  16. import json
  17. from jsonpath import jsonpath
  18. def generate_data(filepath,outputfile):
  19. datas = []
  20. with open(filepath,'r',encoding='utf-8') as fs:
  21. data = json.load(fs)
  22. json_1best = jsonpath(data, "$..json_1best")
  23. for json_best in json_1best:
  24. if type(json_best) == str:
  25. json_data = json.loads(json_best)
  26. else:
  27. json_data = json_best
  28. bg_time = jsonpath(json_data,'$..bg')[0]
  29. ed_time = jsonpath(json_data,'$..ed')[0]
  30. text = ''.join(jsonpath(json_data,'$..w'))
  31. datas.append({'text':text,'bg_time':bg_time,'ed_time':ed_time})
  32. with open(outputfile,'w',encoding='utf-8') as fp:
  33. json.dump(datas,fp,ensure_ascii=False)
  34. # 视频中提取音频
  35. def extract_audio_from_video(video_path, audio_path):
  36. audio = AudioSegment.from_file(video_path)
  37. audio = audio.set_channels(1)
  38. speed_factor = 1.2 # 变速倍数
  39. new_frame_rate = int(audio.frame_rate * speed_factor)
  40. audio = audio._spawn(audio.raw_data, overrides={'frame_rate': new_frame_rate})
  41. audio.export(audio_path, format="mp3", bitrate="96k")
  42. # 请求的接口名
  43. lfasr_host = 'https://raasr.xfyun.cn/v2/api'
  44. api_upload = '/upload'
  45. api_get_result = '/getResult'
  46. class RequestApi(object):
  47. def __init__(self, appid, secret_key, upload_file_path):
  48. self.appid = appid
  49. self.secret_key = secret_key
  50. self.upload_file_path = upload_file_path
  51. self.ts = str(int(time.time()))
  52. self.signa = self.get_signa()
  53. def get_signa(self):
  54. appid = self.appid
  55. secret_key = self.secret_key
  56. m2 = hashlib.md5()
  57. m2.update((appid + self.ts).encode('utf-8'))
  58. md5 = m2.hexdigest()
  59. md5 = bytes(md5, encoding='utf-8')
  60. # 以secret_key为key, 上面的md5为msg, 使用hashlib.sha1加密结果为signa
  61. signa = hmac.new(secret_key.encode('utf-8'), md5, hashlib.sha1).digest()
  62. signa = base64.b64encode(signa)
  63. signa = str(signa, 'utf-8')
  64. return signa
  65. def upload(self):
  66. # print("上传部分:")
  67. upload_file_path = self.upload_file_path
  68. file_len = os.path.getsize(upload_file_path)
  69. file_name = os.path.basename(upload_file_path)
  70. param_dict = {}
  71. param_dict['appId'] = self.appid
  72. param_dict['signa'] = self.signa
  73. param_dict['ts'] = self.ts
  74. param_dict["fileSize"] = file_len
  75. param_dict["fileName"] = file_name
  76. param_dict["duration"] = "200"
  77. # print("upload参数:", param_dict)
  78. data = open(upload_file_path, 'rb').read(file_len)
  79. response = requests.post(url =lfasr_host + api_upload+"?"+urllib.parse.urlencode(param_dict),
  80. headers = {"Content-type":"application/json"},data=data)
  81. # print("upload_url:",response.request.url)
  82. result = json.loads(response.text)
  83. # print("upload resp:", result)
  84. return result
  85. def get_result(self):
  86. uploadresp = self.upload()
  87. orderId = uploadresp['content']['orderId']
  88. param_dict = {}
  89. param_dict['appId'] = self.appid
  90. param_dict['signa'] = self.signa
  91. param_dict['ts'] = self.ts
  92. param_dict['orderId'] = orderId
  93. param_dict['resultType'] = "transfer"
  94. status = 3
  95. while status == 3:
  96. response = requests.post(url=lfasr_host + api_get_result + "?" + urllib.parse.urlencode(param_dict),
  97. headers={"Content-type": "application/json"},timeout=360)
  98. result = json.loads(response.text)
  99. status = result['content']['orderInfo']['status']
  100. if status == 1:
  101. break
  102. txtname = self.upload_file_path.replace(".mp3", "1.txt")
  103. with open(txtname,'w',encoding='utf-8') as f:
  104. f.write(result['content']['orderResult'])
  105. return result
  106. #sk-bDOV3ygxCgvDACVLAOj3u7Gpw3YP90ssdn92E0KvnFeMpKap
  107. #月之暗面
  108. def get_zaiyao(reportpath):
  109. client = OpenAI(
  110. api_key = "sk-bDOV3ygxCgvDACVLAOj3u7Gpw3YP90ssdn92E0KvnFeMpKap",
  111. base_url = "https://api.moonshot.cn/v1",
  112. )
  113. filename=reportpath+'.txt'
  114. # xlnet.pdf 是一个示例文件, 我们支持 pdf, doc 以及图片等格式, 对于图片和 pdf 文件,提供 ocr 相关能力
  115. file_object = client.files.create(file=Path(filename), purpose="file-extract")
  116. # 获取结果
  117. # file_content = client.files.retrieve_content(file_id=file_object.id)
  118. # 注意,之前 retrieve_content api 在最新版本标记了 warning, 可以用下面这行代替
  119. # 如果是旧版本,可以用 retrieve_content
  120. file_content = client.files.content(file_id=file_object.id).text
  121. # 把它放进请求中
  122. messages = [
  123. {
  124. "role": "system",
  125. "content": "你是 Kimi,由 Moonshot AI 提供的人工智能助手,你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。同时,你会拒绝一切涉及恐怖主义,种族歧视,黄色暴力等问题的回答。Moonshot AI 为专有名词,不可翻译成其他语言。",
  126. },
  127. {
  128. "role": "system",
  129. "content": file_content,
  130. },
  131. {"role": "user",
  132. "content":"上面这个文件是一段教学音频识别出来的Json格式文件,其中bg_time键是一段话的起始时间。现拟将这段教学文字自动解析和提取教学核心内容,生成一段500字以内的文本摘要,概述教学流程(如首先,其次,接着,随后,最后),并使用mm:ss格式标注出在每段话的起始时间点位,用于帮助用户快速把握教学目标、教学内容、教学过程和教学特色。并给出3-5个教学特色关键词(可涉及教学方法、教学内容)。请你以教学评价专家的身份,帮我处理该文件。",
  133. }
  134. ]
  135. # 然后调用 chat-completion, 获取 Kimi 的回答
  136. completion = client.chat.completions.create(
  137. model="moonshot-v1-32k",
  138. messages=messages,
  139. temperature=0.3,
  140. )
  141. with open(reportpath+'.json','w') as f:
  142. f.write(completion.choices[0].message.content)
  143. mp3file_path = Path(reportpath+'.mp3')
  144. txtfile_path = Path(reportpath+'.txt')
  145. txt1file_path = Path(reportpath+'1.txt')
  146. if mp3file_path.exists():
  147. mp3file_path.unlink() # 删除文件
  148. if txtfile_path.exists():
  149. txtfile_path.unlink() # 删除文件
  150. if txt1file_path.exists():
  151. txt1file_path.unlink() # 删除文件
  152. #print(completion.choices[0].message.content)
  153. # 输入讯飞开放平台的appid,secret_key和待转写的文件路径
  154. if __name__ == '__main__':
  155. #mpeg_section()
  156. print(sys.argv)
  157. name=sys.argv[2]
  158. # filename=[]
  159. video_path = sys.argv[1]+"\\"
  160. report_path = sys.argv[3] +"\\"
  161. extract_audio_from_video(video_path+name+'.mp4', report_path+name+'.mp3')
  162. api = RequestApi(appid="4f50a2a4",
  163. secret_key="ba8734e4ab6f036057dfc065efd7bc0e",
  164. upload_file_path=report_path+name+'.mp3')
  165. api.get_result()
  166. #处理提炼json文件
  167. input_file =report_path+name+'1.txt' # 输入文件名
  168. output_file =report_path+name+'.txt' # 输出文件名
  169. datas = generate_data(input_file,output_file)
  170. #获取摘要
  171. get_zaiyao(report_path+name)