baidu.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # -*- coding: utf-8 -*-
  2. """
  3. 百度的语音识别API.
  4. dev_pid:
  5. - 1936: 普通话远场
  6. - 1536:普通话(支持简单的英文识别)
  7. - 1537:普通话(纯中文识别)
  8. - 1737:英语
  9. - 1637:粤语
  10. - 1837:四川话
  11. 要使用本模块, 首先到 yuyin.baidu.com 注册一个开发者账号,
  12. 之后创建一个新应用, 然后在应用管理的"查看key"中获得 API Key 和 Secret Key
  13. 填入 config.xml 中.
  14. ...
  15. baidu_yuyin:
  16. appid: '9670645'
  17. api_key: 'qg4haN8b2bGvFtCbBGqhrmZy'
  18. secret_key: '585d4eccb50d306c401d7df138bb02e7'
  19. ...
  20. """
  21. from __future__ import division
  22. from ..__load__ import *
  23. from .base import Base
  24. # 需要百度SDK
  25. from aip import AipSpeech
  26. class Baidu(Base):
  27. def __init__(self):
  28. super(self.__class__, self).__init__(True)
  29. def setting(self, appid, api_key, secret_key, dev_pid=1936, voice=2, per=1, lan='zh', **args):
  30. self.engine = AipSpeech(appid, api_key, secret_key)
  31. self.dev_pid = dev_pid
  32. self.per = per
  33. self.lan = lan
  34. self.voice = voice
  35. def asr(self, fp):
  36. pcm = getPcmFromWav(fp)
  37. res = self.engine.asr(pcm, 'pcm', 16000, {
  38. 'dev_pid': self.dev_pid,
  39. })
  40. if res['err_no'] == 0:
  41. res['result'] = ''.join(res['result'])
  42. return self.arrLog(1, res['result'])
  43. else:
  44. res['err_msg'] = ''.join(res['err_msg'])
  45. return self.arrLog(2, res['err_msg'])
  46. def tts(self, phrase):
  47. result = self.engine.synthesis(phrase, self.lan, self.voice, {
  48. 'vol': 5,
  49. 'spd': 3,
  50. 'pit': 8,
  51. 'per': self.per
  52. });
  53. # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
  54. if not isinstance(result, dict):
  55. tmpfile = writeTempFile(result, '.mp3')
  56. return self.ttsLog(1, tmpfile)
  57. else:
  58. return self.ttsLog(2, '')
  59. #使用百度 UNIT 进行 NLU 解析
  60. def nlu(self, query, service_id):
  61. return self.sdk.getUnit(query, service_id, self.api_key, self.secret_key)
  62. """
  63. 提取意图
  64. :param parsed: 解析结果
  65. :return: 意图数组
  66. """
  67. def getIntent(self, parsed):
  68. return self.sdk.getIntent(parsed)
  69. """
  70. 判断是否包含某个意图
  71. :param parsed: UNIT 解析结果
  72. :param intent: 意图的名称
  73. :return: True: 包含; False: 不包含
  74. """
  75. def hasIntent(self, parsed, intent):
  76. return self.sdk.hasIntent(parsed, intent)
  77. """
  78. 提取某个意图的所有词槽
  79. :param parsed: UNIT 解析结果
  80. :param intent: 意图的名称
  81. :return: 词槽列表。你可以通过 name 属性筛选词槽,
  82. 再通过 normalized_word 属性取出相应的值
  83. """
  84. def getSlots(self, parsed, intent):
  85. return self.sdk.getSlots(parsed, intent)
  86. """
  87. 找出命中某个词槽的内容
  88. :param parsed: UNIT 解析结果
  89. :param intent: 意图的名称
  90. :param name: 词槽名
  91. :return: 命中该词槽的值的列表。
  92. """
  93. def getSlotWords(self, parsed, intent, name):
  94. return self.sdk.getSlotWords(parsed, intent, name)
  95. """
  96. 提取 UNIT 的回复文本
  97. :param parsed: UNIT 解析结果
  98. :param intent: 意图的名称
  99. :return: UNIT 的回复文本
  100. """
  101. def getSay(self, parsed, intent):
  102. return self.sdk.getSay(parsed, intent)