ali_api.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # coding=utf-8
  2. """
  3. Author: chazzjimel
  4. Email: chazzjimel@gmail.com
  5. wechat:cheung-z-x
  6. Description:
  7. """
  8. import json
  9. import time
  10. import requests
  11. import datetime
  12. import hashlib
  13. import hmac
  14. import base64
  15. import urllib.parse
  16. import uuid
  17. from common.log import logger
  18. from common.tmp_dir import TmpDir
  19. def text_to_speech_aliyun(url, text, appkey, token):
  20. # 请求的headers
  21. headers = {
  22. "Content-Type": "application/json",
  23. }
  24. # 请求的payload
  25. data = {
  26. "text": text,
  27. "appkey": appkey,
  28. "token": token,
  29. "format": "wav"
  30. }
  31. # 发送POST请求
  32. response = requests.post(url, headers=headers, data=json.dumps(data))
  33. # 检查响应状态码和内容类型
  34. if response.status_code == 200 and response.headers['Content-Type'] == 'audio/mpeg':
  35. # 构造唯一的文件名
  36. output_file = TmpDir().path() + "reply-" + str(int(time.time())) + "-" + str(hash(text) & 0x7FFFFFFF) + ".wav"
  37. # 将响应内容写入文件
  38. with open(output_file, 'wb') as file:
  39. file.write(response.content)
  40. logger.debug(f"音频文件保存成功,文件名:{output_file}")
  41. else:
  42. # 打印错误信息
  43. logger.debug("响应状态码: {}".format(response.status_code))
  44. logger.debug("响应内容: {}".format(response.text))
  45. output_file = None
  46. return output_file
  47. class AliyunTokenGenerator:
  48. def __init__(self, access_key_id, access_key_secret):
  49. self.access_key_id = access_key_id
  50. self.access_key_secret = access_key_secret
  51. def sign_request(self, parameters):
  52. # 将参数排序
  53. sorted_params = sorted(parameters.items())
  54. # 构造待签名的字符串
  55. canonicalized_query_string = ''
  56. for (k, v) in sorted_params:
  57. canonicalized_query_string += '&' + self.percent_encode(k) + '=' + self.percent_encode(v)
  58. string_to_sign = 'GET&%2F&' + self.percent_encode(canonicalized_query_string[1:]) # 使用GET方法
  59. # 计算签名
  60. h = hmac.new((self.access_key_secret + "&").encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha1)
  61. signature = base64.encodebytes(h.digest()).strip()
  62. return signature
  63. def percent_encode(self, encode_str):
  64. encode_str = str(encode_str)
  65. res = urllib.parse.quote(encode_str, '')
  66. res = res.replace('+', '%20')
  67. res = res.replace('*', '%2A')
  68. res = res.replace('%7E', '~')
  69. return res
  70. def get_token(self):
  71. # 设置请求参数
  72. params = {
  73. 'Format': 'JSON',
  74. 'Version': '2019-02-28',
  75. 'AccessKeyId': self.access_key_id,
  76. 'SignatureMethod': 'HMAC-SHA1',
  77. 'Timestamp': datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"),
  78. 'SignatureVersion': '1.0',
  79. 'SignatureNonce': str(uuid.uuid4()), # 使用uuid生成唯一的随机数
  80. 'Action': 'CreateToken',
  81. 'RegionId': 'cn-shanghai'
  82. }
  83. # 计算签名
  84. signature = self.sign_request(params)
  85. params['Signature'] = signature
  86. # 构造请求URL
  87. url = 'http://nls-meta.cn-shanghai.aliyuncs.com/?' + urllib.parse.urlencode(params)
  88. # 发送请求
  89. response = requests.get(url)
  90. return response.text