baidu.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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, 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. def asr(self, fp):
  35. pcm = getPcmFromWav(fp)
  36. res = self.engine.asr(pcm, 'pcm', 16000, {
  37. 'dev_pid': self.dev_pid,
  38. })
  39. if res['err_no'] == 0:
  40. res['result'] = ''.join(res['result'])
  41. return self.arrLog(1, res['result'])
  42. else:
  43. res['err_msg'] = ''.join(res['err_msg'])
  44. return self.arrLog(2, res['err_msg'])
  45. def tts(self, phrase):
  46. result = self.engine.synthesis(phrase, self.lan, 1, {'per': self.per});
  47. # 识别正确返回语音二进制 错误则返回dict 参照下面错误码
  48. if not isinstance(result, dict):
  49. tmpfile = writeTempFile(result, '.mp3')
  50. return self.ttsLog(1, tmpfile)
  51. else:
  52. return self.ttsLog(2, '')
  53. #使用百度 UNIT 进行 NLU 解析
  54. def nlu(self, query, service_id):
  55. return self.sdk.getUnit(query, service_id, self.api_key, self.secret_key)
  56. """
  57. 提取意图
  58. :param parsed: 解析结果
  59. :return: 意图数组
  60. """
  61. def getIntent(self, parsed):
  62. return self.sdk.getIntent(parsed)
  63. """
  64. 判断是否包含某个意图
  65. :param parsed: UNIT 解析结果
  66. :param intent: 意图的名称
  67. :return: True: 包含; False: 不包含
  68. """
  69. def hasIntent(self, parsed, intent):
  70. return self.sdk.hasIntent(parsed, intent)
  71. """
  72. 提取某个意图的所有词槽
  73. :param parsed: UNIT 解析结果
  74. :param intent: 意图的名称
  75. :return: 词槽列表。你可以通过 name 属性筛选词槽,
  76. 再通过 normalized_word 属性取出相应的值
  77. """
  78. def getSlots(self, parsed, intent):
  79. return self.sdk.getSlots(parsed, intent)
  80. """
  81. 找出命中某个词槽的内容
  82. :param parsed: UNIT 解析结果
  83. :param intent: 意图的名称
  84. :param name: 词槽名
  85. :return: 命中该词槽的值的列表。
  86. """
  87. def getSlotWords(self, parsed, intent, name):
  88. return self.sdk.getSlotWords(parsed, intent, name)
  89. """
  90. 提取 UNIT 的回复文本
  91. :param parsed: UNIT 解析结果
  92. :param intent: 意图的名称
  93. :return: UNIT 的回复文本
  94. """
  95. def getSay(self, parsed, intent):
  96. return self.sdk.getSay(parsed, intent)