# -*- coding: utf-8 -*-
"""
百度的语音识别API.
dev_pid:
	- 1936: 普通话远场
	- 1536：普通话(支持简单的英文识别)
	- 1537：普通话(纯中文识别)
	- 1737：英语
	- 1637：粤语
	- 1837：四川话
要使用本模块, 首先到 yuyin.baidu.com 注册一个开发者账号,
之后创建一个新应用, 然后在应用管理的"查看key"中获得 API Key 和 Secret Key
填入 config.xml 中.
...
	baidu_yuyin: 
		appid: '9670645'
		api_key: 'qg4haN8b2bGvFtCbBGqhrmZy'
		secret_key: '585d4eccb50d306c401d7df138bb02e7'
	...
"""
from __future__ import division
from ..__load__ import *
from .base import Base
# 需要百度SDK
from aip import AipSpeech

class Baidu(Base):

	def __init__(self):
		super(self.__class__, self).__init__(True)

	def setting(self, appid, api_key, secret_key, dev_pid=1936, voice=2, per=1, lan='zh', **args):
		self.engine = AipSpeech(appid, api_key, secret_key)
		self.dev_pid = dev_pid
		self.per = per
		self.lan = lan
		self.voice = voice

	def asr(self, fp):
		pcm = getPcmFromWav(fp)
		res = self.engine.asr(pcm, 'pcm', 16000, {
			'dev_pid': self.dev_pid,
		})
		if res['err_no'] == 0:
			res['result'] = ''.join(res['result'])
			return self.arrLog(1, res['result'])
		else:
			res['err_msg'] = ''.join(res['err_msg'])
			return self.arrLog(2, res['err_msg'])

	def tts(self, phrase):
		result  = self.engine.synthesis(phrase, self.lan, self.voice, {
                                  'vol': 5,
                                  'spd': 3,
                                  'pit': 8,
                                  'per': self.per
                              });
		# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
		if not isinstance(result, dict):
			tmpfile = writeTempFile(result, '.mp3')
			return self.ttsLog(1, tmpfile)
		else:
			return self.ttsLog(2, '')

	#使用百度 UNIT 进行 NLU 解析
	def nlu(self, query, service_id):
		return self.sdk.getUnit(query, service_id, self.api_key, self.secret_key)

	""" 
	提取意图
	:param parsed: 解析结果
	:return: 意图数组
	"""
	def getIntent(self, parsed):
		return self.sdk.getIntent(parsed)

	""" 
	判断是否包含某个意图
	:param parsed: UNIT 解析结果
	:param intent: 意图的名称
	:return: True: 包含; False: 不包含
	"""
	def hasIntent(self, parsed, intent):
		return self.sdk.hasIntent(parsed, intent)

	""" 
	提取某个意图的所有词槽

	:param parsed: UNIT 解析结果
	:param intent: 意图的名称
	:return: 词槽列表。你可以通过 name 属性筛选词槽，
	再通过 normalized_word 属性取出相应的值
	"""
	def getSlots(self, parsed, intent):
		return self.sdk.getSlots(parsed, intent)

	""" 
	找出命中某个词槽的内容

	:param parsed: UNIT 解析结果
	:param intent: 意图的名称
	:param name: 词槽名
	:return: 命中该词槽的值的列表。
	"""
	def getSlotWords(self, parsed, intent, name):
		return self.sdk.getSlotWords(parsed, intent, name)

	"""
	提取 UNIT 的回复文本
	:param parsed: UNIT 解析结果
	:param intent: 意图的名称
	:return: UNIT 的回复文本
	"""
	def getSay(self, parsed, intent):
		return self.sdk.getSay(parsed, intent)