我正在尝试编写一个应用程序,允许我说出命令并让应用程序执行我所说的内容。但这是问题所在,我不想使用弹出GoogleVoice的RecognizerIntent。我想拥有自己的定制产品。任何人都可以给我一些帮助或提示,让我这样做吗?也许在我说了什么并执行任务后如何使用结果的帮助?
更新的代码:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
public class VoicingMain extends Activity implements OnClickListener {
ListView lv;
private SpeechRecognizer sr;
private Intent srIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.voicing);
lv = (ListView) findViewById(R.id.lvList);
Button b = (Button) findViewById(R.id.bStartVoicing);
b.setOnClickListener(this);
boolean available = SpeechRecognizer.isRecognitionAvailable(this);
Log.d("Speech", "available = " + available);
sr = SpeechRecognizer.createSpeechRecognizer(this);
sr.setRecognitionListener(new SpeechListener());
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
srIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
srIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
srIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
this.getPackageName());
srIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 5);
Log.d("speech", "button active");
sr.startListening(srIntent);
new CountDownTimer(3000, 1000) {
@Override
public void onTick(long arg0) {
// TODO Auto-generated method stub
}
@Override
public void onFinish() {
// TODO Auto-generated method stub
sr.stopListening();
}
}.start();
}
private class SpeechListener implements RecognitionListener {
@Override
public void onBeginningOfSpeech() {
// TODO Auto-generated method stub
Log.d("Speech", "onBeginningOfSpeech");
}
@Override
public void onBufferReceived(byte[] arg0) {
// TODO Auto-generated method stub
Log.d("Speech", "onBufferReceived");
}
@Override
public void onEndOfSpeech() {
// TODO Auto-generated method stub
Log.d("Speech", "onEndOfSpeech");
}
@Override
public void onError(int arg0) {
// TODO Auto-generated method stub
Log.d("Speech", "onError");
}
@Override
public void onEvent(int arg0, Bundle arg1) {
// TODO Auto-generated method stub
Log.d("Speech", "onEvent");
}
@Override
public void onPartialResults(Bundle arg0) {
// TODO Auto-generated method stub
Log.d("Speech", "onPartialResults");
}
@Override
public void onReadyForSpeech(Bundle arg0) {
// TODO Auto-generated method stub
Log.d("Speech", "onReadyForSpeech");
}
@Override
public void onResults(Bundle arg0) {
// TODO Auto-generated method stub
Log.d("Speech", "results");
}
@Override
public void onRmsChanged(float arg0) {
// TODO Auto-generated method stub
// Log.d("Speech", "onRmsChanged");
}
}
}
这是我到目前为止所拥有的
答案 0 :(得分:1)
此SO question显示了如何访问SpeechListener
中的结果。这些结果可在Results()
方法中找到。
至于执行任务的能力,您应该有某种处理程序,它将根据文本启动必要的服务。此处理程序可以使用意图与服务进行通信。例如,以下是您对用户说“呼叫Bob”的反应(基于上面的链接):
@Override
public void onResults(Bundle results) {
ArrayList<String> voiceResults = results
.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if (voiceResults == null) {
Log.e(TAG, "No voice results");
} else {
for (int i = 0; i < voiceResults.size(); ++i) {
if( voiceResults[i].contains("Call") )
for( int j = i+1; j < matches.size(); ++j )
if( voiceResults[j].contains("Bob") )
{
//Get Bob's phone number, using [this][2]
String bobNumber = "123 123 1234";
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:"+bobNumber));
startActivity(callIntent);
break;
}
}
}
}