2017-12-05 1 views
1

dialogflow에서 직접 텍스트 응답을 얻으려고합니다. github의 예제 코드에서 대답을 얻지 만 사용자 친화적이지는 않습니다. "Speech-Only"응답은 어떻게받을 수 있습니까?Dialogflow에서 직접 텍스트 응답을 얻으려면 어떻게해야합니까?

import os.path 
import sys 

try: 
    import apiai 
except ImportError: 
    sys.path.append(
     os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir) 
    ) 
    import apiai 

CLIENT_ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN' 


def main(): 
    ai = apiai.ApiAI(CLIENT_ACCESS_TOKEN) 

    request = ai.text_request() 

    request.lang = 'de' # optional, default value equal 'en' 

    request.session_id = "<SESSION ID, UNIQUE FOR EACH USER>" 

    request.query = "Hello" 

    response = request.getresponse() 

    print (response.read()) 


if __name__ == '__main__': 
    main() 

은 그냥에게 간단한 결과를 기대합니다. 평범한 안녕하세요 텍스트. 내가 대신 무엇을 얻을

= b'{\n "id": "306fd06a-d9e6-4c2e-8c05-98ff7fc0ecd5",\n "timestamp": "2017-12-05T22:18:15.563Z",\n "lang": "en",\n "result": {\n "source": "agent",\n "resolvedQuery": "hi",\n "action": "input.welcome",\n "actionIncomplete": false,\n "parameters": {},\n "contexts": [],\n "metadata": {\n "intentId": "8406ea3a-a0c9-4470-829f-aba0ce2da2e5",\n "webhookUsed": "false",\n "webhookForSlotFillingUsed": "false",\n "intentName": "Default Welcome Intent"\n },\n "fulfillment": {\n "speech": "Hi there!",\n "messages": [\n {\n "type": 0,\n "speech": "Hi there!"\n }\n ]\n },\n "score": 1.0\n },\n "alternateResult": {\n "source": "domains",\n "resolvedQuery": "hi",\n "action": "smalltalk.greetings.hello",\n "actionIncomplete": false,\n "parameters": {},\n "contexts": [],\n "metadata": {},\n "fulfillment": {\n "speech": "Hey!",\n "source": "agent"\n },\n "score": 1.0\n },\n "status": {\n "code": 200,\n "errorType": "success",\n "webhookTimedOut": false\n },\n "sessionId": "mr.9000"\n}'

답변

1

그냥 메시지를 얻으려면 다음과 같이하십시오 :

response = json.loads(request.getresponse().read().decode('utf-8')) 
message = response['result']['fulfillment']['speech'] 
print (message) 

처음에

import json 

를 추가하는 것을 잊지 마십시오. 아직 설치하지 않았다면 설치하십시오. 파이썬에서 json을 다루고 싶다면해야 할 것이다. 작동하는지 확인하십시오.

+0

TypeError : 'HTTPResponse'개체는 subscriptable이 아닙니다. 나는 그것이 효과가 있었으면 좋겠다. – Furky

+0

안녕하세요, 코드를 약간 변경했습니다. 너 지금 해 볼래? –

+0

'json'이름이 정의되지 않았습니다. 나는 우리가 어떻게 든 가까이에 있다고 느낍니다. – Furky

0

Dialogflow's query API처럼 보입니다. 응답 형식은 here입니다. JSON을 구문 분석해야합니다. 가장 일반적인 방법은 (당신이 파일의 맨 위에 즉 import json)

  1. 이 가져올하는 데 필요한 json 모듈을 사용하여 ...이 될 것이라고 할 수 있습니다.
  2. 다음 당신은 당신이 response을 정의 후, 즉 줄을 추가 (당신이 부하의 방법으로 접수 된 JSON 문자열을로드해야합니다 : response_dict = json.loads(response.read()) 마지막으로
  3. 당신이 response_dict 객체에서 올바른 문자열을 검색해야합니다 : print(response_dict.['result']['resolvedQuery'])
+0

이것은 너무 효과적입니다! 감사 ! – Furky

0

난 당신이 텍스트 응답으로 만 요구하고있다 생각합니다. 그대로

다음과 같은 코드를 사용할 수 있습니다.

Just don't forget to update your access token in the code.

<html> 
<head> 
    <title>API Example</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
    <script type="text/javascript"> 
     var accessToken = "update your access token here"; 
     var baseUrl = "https://api.api.ai/v1/"; 
     $(document).ready(function() { 
      $("#input").keypress(function(event) { 
       if (event.which == 13) { 
        event.preventDefault(); 
        send(); 
       } 
      }); 
      $("#rec").click(function(event) { 
       switchRecognition(); 
      }); 
     }); 
     var recognition; 
     function startRecognition() { 
      recognition = new webkitSpeechRecognition(); 
      recognition.onstart = function(event) { 
       updateRec(); 
      }; 
      recognition.onresult = function(event) { 
       var text = ""; 
       for (var i = event.resultIndex; i < event.results.length; ++i) { 
        text += event.results[i][0].transcript; 
       } 
       setInput(text); 
       stopRecognition(); 
      }; 
      recognition.onend = function() { 
       stopRecognition(); 
      }; 
      recognition.lang = "en-US"; 
      recognition.start(); 
     } 

     function stopRecognition() { 
      if (recognition) { 
       recognition.stop(); 
       recognition = null; 
      } 
      updateRec(); 
     } 
     function switchRecognition() { 
      if (recognition) { 
       stopRecognition(); 
      } else { 
       startRecognition(); 
      } 
     } 
     function setInput(text) { 
      $("#input").val(text); 
      send(); 
     } 
     function updateRec() { 
      $("#rec").text(recognition ? "Stop" : "Speak"); 
     } 
//  function send() { 
//   var text = $("#input").val(); 
//   $.ajax({ 
//    type: "POST", 
//    url: baseUrl + "query?v=20150910", 
//    contentType: "application/json; charset=utf-8", 
//    dataType: "json", 
//    headers: { 
//     "Authorization": "Bearer " + accessToken 
//    }, 
//    data: JSON.stringify({ query: text, lang: "en", sessionId: "somerandomthing" }), 
//    success: function(data) { 
//     setResponse(JSON.stringify(data, undefined, 2)); 
//    }, 
//    error: function() { 
//     setResponse("Internal Server Error"); 
//    } 
//   }); 
//   setResponse("Loading..."); 
//  } 
     function send() { 
      var text = $("#input").val(); 
      $.ajax({ 
       type: "POST", 
       url: baseUrl + "query?v=20150910", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       headers: { 
        "Authorization": "Bearer " + accessToken 
       }, 
       data: JSON.stringify({ query: text, lang: "en", sessionId: "somerandomthing" }), 
       success: function(data) { 
        var respText = data.result.fulfillment.speech; 
        console.log("Respuesta: " + respText); 
        setResponse(respText); 
       }, 
       error: function() { 
        setResponse("Internal Server Error"); 
       } 
      }); 
      setResponse("Thinking..."); 
     } 
     function setResponse(val) { 
      $("#response").text(val); 
     } 

    </script> 
    <style type="text/css"> 
     body { width: 500px; margin: 0 auto; text-align: center; margin-top: 20px; } 
     div { position: absolute; } 
     input { width: 400px; } 
     button { width: 50px; } 
     textarea { width: 100%; } 
    </style> 
</head> 
<body> 
<div> 
    <input id="input" type="text"> <button id="rec">Speak</button> 
    <br>Response<br> <textarea id="response" cols="40" rows="20"></textarea> 
</div> 
</body> 
</html> 
관련 문제