我在Android Studio上的对话流聊天机器人项目将聊天机器人的输出显示为文本。但是我想要文本和语音输出,或者只是语音输出。
我不知道该怎么做。我知道这很简单,但是我不是Java专家。
这是Java文件:
package com.assisto.www.astria;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private ImageButton imagebutton2;
private final int REQ_CODE_SPEECH_INPUT = 100;
ImageButton btnSpeak;
TextView txtSpeechInput, outputText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imagebutton2 = (ImageButton) findViewById(R.id.imagebutton2);
btnSpeak = (ImageButton) findViewById(R.id.btnSpeak);
txtSpeechInput = (TextView) findViewById(R.id.txtSpeechInput);
outputText = (TextView) findViewById(R.id.outputTex);
imagebutton2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View V){
OpenActivity2();
}
});
btnSpeak.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
promptSpeechInput();
}
});
}
public void OpenActivity2(){
Intent intent= new Intent(this, Main2Activity.class);
startActivity(intent);
}
/**
* Showing google speech input dialog
*/
private void promptSpeechInput() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
// intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
"Say Something");
try {
startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
} catch (ActivityNotFoundException a) {
Toast.makeText(getApplicationContext(),
"orry! Your device doesn\\'t support speech input",
Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQ_CODE_SPEECH_INPUT: {
if (resultCode == RESULT_OK && null != data) {
ArrayList<String> result = data
.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
String userQuery=result.get(0);
txtSpeechInput.setText(userQuery);
RetrieveFeedTask task=new RetrieveFeedTask();
task.execute(userQuery);
}
break;
}
}
}
// Create GetText Metod
public String GetText(String query) throws UnsupportedEncodingException {
String text = "";
BufferedReader reader = null;
// Send data
try {
// Defined URL where to send data
URL url=new URL("https://api.dialogflow.com/v1/query?v=20150910");
// Send POST data request
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestProperty("Authorization", "Bearer 19b7b9bc18b949d09d9232ac11b8d33d");
conn.setRequestProperty("Content-Type", "application/json");
//Create JSONObject here
JSONObject jsonParam = new JSONObject();
JSONArray queryArray = new JSONArray();
queryArray.put(query);
jsonParam.put("query", queryArray);
// jsonParam.put("name", "order a medium pizza");
jsonParam.put("lang", "en");
jsonParam.put("sessionId", "1234567890");
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
Log.d("karma", "after conversion is " + jsonParam.toString());
wr.write(jsonParam.toString());
wr.flush();
Log.d("karma", "json is " + jsonParam);
// Get the server response
reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line = null;
// Read Server Response
while ((line = reader.readLine()) != null) {
// Append server response in string
sb.append(line + "\n");
}
text = sb.toString();
JSONObject object1 = new JSONObject(text);
JSONObject object = object1.getJSONObject("result");
JSONObject fulfillment = null;
String speech = null;
// if (object.has("fulfillment")) {
fulfillment = object.getJSONObject("fulfillment");
// if (fulfillment.has("speech")) {
speech = fulfillment.optString("speech");
// }
// }
Log.d("karma ", "response is " + text);
return speech;
} catch (Exception ex) {
Log.d("karma", "exception at last " + ex);
} finally {
try {
reader.close();
} catch (Exception ex) {
}
}
return null;
}
class RetrieveFeedTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... voids) {
String s = null;
try {
s = GetText(voids[0]);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
Log.d("karma", "Exception occurred " + e);
}
return s;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
outputText.setText(s);
}
}
}