# coding=utf-8 import os import time import sys import urllib import json import requests #import xmltodict # Demo示例,需要在具体项目具体场景下自行实现相关调用逻辑 class XiaoMiNlu: def __init__(self): self.nlpUrl = 'http://39.106.157.134:8110/chatbot/chat/ivr?' self.appId = 402 def makeUrl(self, sessionId, asrResult, asrBeginTime, asrEndTime, emotionValue, vendorParams): #http://39.106.157.134:8110/chatbot/chat/ivr?AppId=402&Utterance=%E4%BD%A0%E5%A5%BD&VendorParam={%22index%22:%221%22}&SessionId=ee8a166cd1cc4bab url = self.nlpUrl + "AppId=" + str(self.appId) + "&Utterance=" + urllib.quote(asrResult) if sessionId is not None and sessionId != "": url = url + "&SessionId=" + sessionId if vendorParams is not None and vendorParams != "": #按需将 k1=v1;k2=v2;k3=v3的形式转成json格式(云小蜜调用要求) items = vendorParams.split(';') d = dict() for item in items: key,value = item.split('=') d[key] = value url = url + "&VendorParam=" + json.dumps(d) return url def request(self, ssionId, asrResult, asrBeginTime, asrEndTime, emotionValue, vendorParams): url = self.makeUrl(ssionId, asrResult, asrBeginTime, asrEndTime, emotionValue, vendorParams) req = requests.get(url) if(req.status_code != 200): print req.text print "ERROR url(%s), request Fail(%d)" % (url, req.status_code) return "" ''' { "SessionId": "123f", "MessageId": "601762b2951e4a2381e26ec0a2703fc7", "Messages": [ { "Type": "Text", "Text": { "Content": "{\"INTEL_CUST_HEAD\":{\"RESP_DESC\":\"\",\"APP_ID\":\" \",\"RESP_CODE\":\"\",\"TIMESTAMP\":\"\",\"TRANS_ID\":\"\"},\"INTEL_CUST_BODY\":{\"RESP_DESC\":\"\",\"OPERTYPE\":\"0\",\"RESP_CODE\":\"0000\",\"BROADCAST1\":\"engine \",\"INTERRUPT1\":\"\"}}", "AnswerSource": "ChitChat" } } ] } ''' # 按需对NLU的返回进行解析,获取需要关注的内容并打包为xml格式返回:此处示例只获取"Messages->Text->Content"字段对应的值 print "result = ", req.text jss = json.loads(req.text.encode('utf-8')) reply = "" if(jss.has_key('Messages') and jss['Messages'][0].has_key('Text')): result = jss['Messages'][0]['Text'] if result.has_key('Content'): reply = result['Content'].encode('utf-8') # 把 json格式转为xml格式(MRCPSERVER和IVR交互时只有XML格式) reply_json = json.loads(reply) #print type(reply_json), reply_json #xmlstr = xmltodict.unparse(reply_json, full_document=False) xmlstr = "fff" #print "xmlstr = ", xmlstr return xmlstr def nluRequest(sessionId, asrResult, asrBeginTime, asrEndTime, emotionValue, vendorParams): print "python nluRequest = ", sessionId, asrResult, asrBeginTime, asrEndTime, emotionValue, vendorParams ''' 需要NLU服务关注asrResult的取值范围: NO-MTACH : 检测到了语音(vad检测到了起始点),但ASR并没有得到有效的结果,这种一般是客户声音过小、背景音过大、声音有能量但无法听到实际内容导致 NO-INPUT-TIMEOUT : 无话超时,也即:用户侧没有说法,全是静音 ASR-ERROR : 调用ASR进行识别,可能需要NLU服务进行兜底处理 其他情况 : 用户语音的ASR识别结果 ''' if asrResult == "NO-MTACH": print "check speech, but no valid result!" elif asrResult == "NO-INPUT-TIMEOUT": print "check no speech, user may be not speak!" elif asrResult == "ASR-ERROR": print "call ASR failure, you should hold this!" else: print "check speech, and recognized success: ", asrResult #time.sleep(1) # 注意:一定要返回如下格式 # 返回fff类似结构,该结构即是xml格式(去掉xml头)) return "value" nlu = XiaoMiNlu() return nlu.request(sessionId, asrResult, asrBeginTime, asrEndTime, emotionValue, vendorParams) if __name__ == '__main__': print nluRequest("123f", "你好", 1234, 4569, 5, "ke=1;phone=123;callid=zxcvb"), "\n" print nluRequest("123f", "WELCOME", 1234, 4569, 0, "ke=1"), "\n" print nluRequest("123f", "NO-MTACH", 1234, 4569, 0, "ke=1"), "\n" print nluRequest("123f", "NO-INPUT-TIMEOUT", 1234, 1, 4569, "ke=1"), "\n" print nluRequest("123f", "ASR-ERROR", 1234, 4569, 0, ""), "\n" print "Game Over"