xunfei.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. # -*- coding: utf-8 -*-
  2. """
  3. 科大讯飞的语音识别API.
  4. 外网ip查询:https://ip.51240.com/
  5. voice_name: https://www.xfyun.cn/services/online_tts
  6. """
  7. from __future__ import division
  8. from ..__load__ import *
  9. from base import Base
  10. class Baidu(Base):
  11. url = 'http://api.xfyun.cn/v1/service/v1/'
  12. def __init__(self):
  13. super(self.__class__, self).__init__()
  14. def setting(self, appid, api_key, voice_name='vecan', **args):
  15. self.appid = appid
  16. self.api_key = api_key
  17. self.voice_name = voice_name
  18. def getHeader(self, aue, engineType):
  19. curTime = str(int(time.time()))
  20. # curTime = '1526542623'
  21. if aue = 'raw':
  22. param = "{\"aue\":\"" + aue + "\"" + ",\"engine_type\":\"" + engineType + "\"}"
  23. else:
  24. param = "{\"aue\":\""+aue+"\",\"auf\":\"audio/L16;rate=16000\",\"voice_name\":\"" + self.voice_name + "\",\"engine_type\":\"intp65\"}"
  25. Demeter.logger.debug("param:{}".format(param))
  26. paramBase64 = str(base64.b64encode(param.encode('utf-8')), 'utf-8')
  27. Demeter.logger.debug("x_param:{}".format(paramBase64))
  28. m2 = hashlib.md5()
  29. m2.update((self.api_key + curTime + paramBase64).encode('utf-8'))
  30. checkSum = m2.hexdigest()
  31. header = {
  32. 'X-CurTime': curTime,
  33. 'X-Param': paramBase64,
  34. 'X-Appid': self.appid,
  35. 'X-CheckSum': checkSum,
  36. 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
  37. }
  38. return header
  39. def getBody(self, filepath):
  40. binfile = open(filepath, 'rb')
  41. data = {'audio': base64.b64encode(binfile.read())}
  42. return data
  43. def asr(self, fp):
  44. URL = self.url + "iat"
  45. r = requests.post(URL, headers=self.getHeader('raw', 'sms16k'), data=self.getBody(fp))
  46. res = json.loads(r.content.decode('utf-8'))
  47. Demeter.logger.debug(res)
  48. if 'code' in res and res['code'] == '0':
  49. return self.log(1, res['data'])
  50. else:
  51. return self.log(2, '')
  52. def tts(self, phrase):
  53. URL = self.url + "tts"
  54. r = requests.post(URL, headers=self.getHeader('lame'), data=self.getBody(phrase))
  55. contentType = r.headers['Content-Type']
  56. if contentType == "audio/mpeg":
  57. tmpfile = writeTempFile(r.content, '.mp3')
  58. return self.ttsLog(1, tmpfile)
  59. else :
  60. return self.ttsLog(2, r.text)