SmartReplyController.py 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import json
  2. import os
  3. from Ansjer.config import LOGGER
  4. from Object.ResponseObject import ResponseObject
  5. from django.views import View
  6. import time
  7. from Object.WsParam.AIChatObject import ChatClient
  8. from Object.WsParam.AudioProcessorObject import AudioProcessor
  9. from Object.WsParam.WsParamRecognizeObject import WsParamRecognize
  10. from Object.WsParam.WsParamSynthesizeObject import WsParamSynthesize
  11. from django.http import FileResponse
  12. class WsParamService(View):
  13. def get(self, request, *args, **kwargs):
  14. request.encoding = 'utf-8'
  15. operation = kwargs.get('operation')
  16. request_dict = request.GET
  17. return self.validation(request, request_dict, operation)
  18. def post(self, request, *args, **kwargs):
  19. request.encoding = 'utf-8'
  20. operation = kwargs.get('operation')
  21. request_dict = request.POST
  22. return self.validation(request, request_dict, operation)
  23. def validation(self, request, request_dict, operation):
  24. language = request_dict.get('language', 'en')
  25. response = ResponseObject(language)
  26. if operation == 'smartReply':
  27. return self.smart_reply(request, request_dict, response)
  28. else:
  29. return response.json(414)
  30. def smart_reply(self, request, request_dict, response):
  31. app_id = "fcff8f4b"
  32. api_key = "037571e7285e64e8dc321fa5b937fea2"
  33. api_secret = "ZTU3NWMyNTI1MTI4NTU5ZGUxMDZhNmQ5"
  34. gpt_url = "wss://spark-api.xf-yun.com/v3.5/chat"
  35. domain = "generalv3.5"
  36. try:
  37. system = request_dict.get('system', None)
  38. audio = request.FILES.get('audio', None)
  39. history = request_dict.get('history', None)
  40. if audio is None:
  41. return response.json(444)
  42. save_directory = 'static/demo_files/'
  43. os.makedirs(save_directory, exist_ok=True)
  44. original_audio_path = os.path.join(save_directory, audio.name)
  45. with open(original_audio_path, 'wb') as destination:
  46. for chunk in audio.chunks():
  47. destination.write(chunk)
  48. # 转码
  49. pcm_audio_path = os.path.splitext(original_audio_path)[0] + '.pcm'
  50. audio_processor = AudioProcessor()
  51. audio_processor.convert_audio(original_audio_path, pcm_audio_path)
  52. # 传入语音 -> 转文字 APPID, APISecret, APIKey, AudioFile
  53. start = time.time()
  54. audio_file = pcm_audio_path
  55. wsParamRecognize = WsParamRecognize(app_id, api_secret, api_key, audio_file)
  56. query = wsParamRecognize.start()
  57. end = time.time()
  58. LOGGER.info(f"********smart_reply语音转文字所需时间为{end - start}秒,内容为{query}********")
  59. # 删除文件 pcm_audio_path 和 original_audio_path
  60. os.remove(pcm_audio_path)
  61. os.remove(original_audio_path)
  62. # 大语言模型 APPID, APIKey, APISecret, gpt_url, domain, query, history=None, system=None
  63. start = time.time()
  64. chat = ChatClient(app_id, api_key, api_secret, gpt_url, domain, query, history, system)
  65. answer = chat.start()
  66. end = time.time()
  67. LOGGER.info(f"********smartReplyAI回复所需时间为{end - start}秒,内容为{answer}********")
  68. # 文字转音频 APPID, APIKey, APISecret, Text, AudioName="demo"
  69. start = time.time()
  70. audio_name = f"{os.path.splitext(audio.name)[0]}_answer"
  71. wsParamSynthesize = WsParamSynthesize(app_id, api_key, api_secret, answer, audio_name)
  72. wsParamSynthesize.start()
  73. answer_audio_path = os.path.splitext(original_audio_path)[0] + '_answer.mp3'
  74. g711a_audio_path = os.path.splitext(answer_audio_path)[0] + '.g711a'
  75. print(answer_audio_path, g711a_audio_path)
  76. # 如果有旧文件就删掉
  77. if os.path.exists(g711a_audio_path):
  78. os.remove(g711a_audio_path)
  79. audio_processor.convert_audio(answer_audio_path, g711a_audio_path)
  80. os.remove(answer_audio_path)
  81. end = time.time()
  82. LOGGER.info(f"********smartReply文字转编码所需时间为{end - start}秒********")
  83. return FileResponse(open(g711a_audio_path, 'rb'), as_attachment=True,
  84. filename=os.path.basename(g711a_audio_path))
  85. except Exception as e:
  86. LOGGER.error('*****WsParamService.smart_reply:errLine:{}, errMsg:{}'
  87. .format(e.__traceback__.tb_lineno, repr(e)))
  88. return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))