代码之家  ›  专栏  ›  技术社区  ›  RKK

在android中使用对话流获得语音输入和文本输入的不同响应

  •  0
  • RKK  · 技术社区  · 7 年前

    我正在使用谷歌的对话流(API.AI)创建一个android应用程序聊天机器人。问题是,如果我发送文本输入是出于我的意图,它会给出正确的响应,而如果我使用语音输入发送相同的内容,则会得到错误的响应。我无法理解问题是什么。 这是我的代码:-

    public class MyChatActivity extends AppCompatActivity implements View.OnClickListener, AIListener {
    
        public String TAG = this.getClass().getSimpleName();
        private List<ChatMessageBean> chatList = new ArrayList<>();
    
        private String CLIENT_ACCESS_TOKEN = "My dialog flow agent's client access token";
    
        AIConfiguration config;
        AIService aiService;
        AIRequest aiRequest;
        AIDataService aiDataService;
    
        TextToSpeech textToSpeech;
    
        RecyclerView chatRecyclerView,menuRecyclerView;
        ChatMessageListAdapter chatMessageListAdapter;
        FloatingActionButton  sendMessageButton,recordMessageButton;
        EditText enterMessage;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.my_chat_activity);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            initializeVariables();
            setListeners();
        }
    
        public void initializeVariables() {
            config = new AIConfiguration(CLIENT_ACCESS_TOKEN, AIConfiguration.SupportedLanguages.English, AIConfiguration.RecognitionEngine.System);
            aiService = AIService.getService(getApplicationContext(), config);
            aiRequest = new AIRequest();
            aiDataService = new AIDataService(getApplicationContext(), config);
            chatRecyclerView = (RecyclerView) findViewById(R.id.chat_list_recycler_view);
            setMenuRecyclerView();
            enterMessage = (EditText) findViewById(R.id.enter_text_message);
            sendMessageButton = (FloatingActionButton) findViewById(R.id.send_message_button);
            recordMessageButton =(FloatingActionButton) findViewById(R.id.record_message_button);
    
            textToSpeech = new TextToSpeech(getApplicationContext(),new TextToSpeech.OnInitListener(){
                @Override
                public void onInit(int status) {
                    if(status != TextToSpeech.ERROR) {
                        textToSpeech.setLanguage(Locale.US);
                    }
                }
            });
        }
    
        public void setListeners() {
            sendMessageButton.setOnClickListener(this);
            aiService.setListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.record_message_button:
                    aiService.startListening();
                    break;
                case R.id.send_message_button:
                    String message = enterMessage.getText().toString().trim();
                    enterMessage.setText("");
                    sendMessage(message);//sending message with text input
                    break;
            }
        }
    
        private boolean validateMessage(String message) {
            if ((message.equals("")) || (message.isEmpty()) || (message.length() == 0))
                return false;
            return true;
        }
    
        public void sendMessage(String message) {
            // In this method i am sending the message to dialog flow
            if (validateMessage(message)) {
    
                ChatMessageBean chatMessageBean = new ChatMessageBean(message); // this is the bean I am using for chatbot app's messages
                chatList.add(chatMessageBean);
                chatMessageListAdapter = new ChatMessageListAdapter(chatList);// this is the adapter for recycler view that I am using for app's messages
                chatRecyclerView.setAdapter(chatMessageListAdapter);
                chatRecyclerView.setLayoutManager(new LinearLayoutManager(this));
                aiRequest.setQuery(message);
    
                new AsyncTask<AIRequest, Void, AIResponse>() {
    
                    @Override
                    protected AIResponse doInBackground(AIRequest... aiRequests) {
                        final AIRequest request = aiRequests[0];
                        try {
                            final AIResponse response = aiDataService.request(aiRequest);
                            return response;
                        } catch (AIServiceException e) {
    
                        }
                        return null;
                    }
    
                    @Override
                    protected void onPostExecute(AIResponse response) {
                        if (response != null) {
    
                            Result result = response.getResult();
                            String reply = result.getFulfillment().getSpeech();
                            ChatMessageBean chatMessageBean = new ChatMessageBean(reply.trim());
                            chatList.add(chatMessageBean);
                            chatMessageListAdapter = new ChatMessageListAdapter(chatList);
                            chatRecyclerView.setLayoutManager(new LinearLayoutManager(PersonaAssistantChatActivity.this));
                            chatRecyclerView.setAdapter(chatMessageListAdapter);
    
                            textToSpeech.speak(reply,TextToSpeech.QUEUE_FLUSH,null);
    
                            if(reply.trim().equalsIgnoreCase(API_ACCESS_STRING)){ //API_ACCESS_STRING is the string after which I have to get response from my own defined intents. So I am cheking if the reply is equal to API_ACCESS_STRING
    
                                String intentName=result.getMetadata().getIntentName();
                                switch(intentName){
                                    case "AvailableEmployees":
                                         Log.d(TAG, "CallIntents: AvailableEmployees:"+intentName);
                                        String jobName=result.getStringParameter("JobName");
                                        String date = result.getStringParameter("Date");
                                        Log.d(TAG,"JobName:"+jobName+"date: "+date);  // When I send voice input here I get jobName="AvailableEmployees" automatically, and dialog flow doesnot ask for jobName, where as with text input I get everything right.
    
                                }
                            }
    
                        }
                    }
                }.execute(aiRequest);
            } else {
                Toast.makeText(getApplicationContext(), "Please enter some text first or record your message", Toast.LENGTH_LONG).show();
            }
        }
    
    
        @Override
        public void onResult(AIResponse result) {
            String message= result.getResult().getResolvedQuery().toString().trim();
            sendMessage(message);//sending message with voice input
    
        }
    
        @Override
        public void onError(AIError error) {
            Log.i(TAG, ": onError" + error);
        }
    
        @Override
        public void onAudioLevel(float level) {
            Log.i(TAG, ": onAudioLevel:" + level);
        }
    
        @Override
        public void onListeningStarted() {
            Log.i(TAG, ": onListeningStarted");
    
        }
    
        @Override
        public void onListeningCanceled() {
            Log.i(TAG, ": onListeningCanceled");
        }
    
        @Override
        public void onListeningFinished() {
            Log.i(TAG, ": onListeningFinished");
    
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Cabuxa.Mapache    7 年前

    你不能打电话 sendMessage(message);//sending message with voice input onResult 方法当aiService完成侦听并已向Dialogflow发送请求,并且您得到响应时,将调用此方法。当你打电话的时候 aiService.startListening(); 该服务检测用户在说什么,并将其发送到Dialogflow。

    如果您想知道文本“aiService”正在发送到Dialogflow,您必须使用 PartialResultsListener 并实施:

    @Override
    public void onPartialResults(final List<String> partialResults) {
        if (!partialResults.isEmpty()) {
            String partialResult = partialResults.get(0);
        }
    }
    

    这样,您将得到用户所说的内容,但请注意之前将调用该方法 onListeningFinished() 结束。

    祝你玩得好运 Handler.postDelayed() :)