Android 我想在我的家庭自动化应用程序中加入连续(免提)语音命令识别
我创建了一个简单的android应用程序,用于控制连接到我的Raspberry Pi的继电器。我使用按钮和基本语音识别来触发这些按钮,并打开/关闭相应的中继通道 到目前为止,语音识别部分由识别器Intent处理,其中我需要按下应用程序上的一个按钮以打开谷歌语音提示,该提示会监听我的语音命令,并激活/禁用控制继电器开关的相应按钮 我希望对连续语音识别也能做到这一点,它允许应用程序连续收听我的命令,而用户无需按下应用程序上的按钮,从而实现免提操作。 这是我现有的代码,这是一种非常简单的语音识别方法,允许我打开和关闭连接到继电器的各种设备的按钮:Android 我想在我的家庭自动化应用程序中加入连续(免提)语音命令识别,android,speech-recognition,cmusphinx,recognizer-intent,Android,Speech Recognition,Cmusphinx,Recognizer Intent,我创建了一个简单的android应用程序,用于控制连接到我的Raspberry Pi的继电器。我使用按钮和基本语音识别来触发这些按钮,并打开/关闭相应的中继通道 到目前为止,语音识别部分由识别器Intent处理,其中我需要按下应用程序上的一个按钮以打开谷歌语音提示,该提示会监听我的语音命令,并激活/禁用控制继电器开关的相应按钮 我希望对连续语音识别也能做到这一点,它允许应用程序连续收听我的命令,而用户无需按下应用程序上的按钮,从而实现免提操作。 这是我现有的代码,这是一种非常简单的语音识别方法,
public void micclick(View view) {
if(view.getId()==R.id.mic)
{promptSpeechInput();}
}
private void promptSpeechInput() {
Intent i= new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
i.putExtra(RecognizerIntent.EXTRA_PROMPT,"Speak!");
try{
startActivityForResult(i,100);
}
catch (ActivityNotFoundException a)
{
Toast.makeText(MainActivity.this,"Sorry your device doesn't support",Toast.LENGTH_SHORT).show();
}
}
public void onActivityResult(int requestCode, int resultCode, Intent i) {
super.onActivityResult(requestCode, resultCode, i);
String voicetxt;
switch (requestCode) {
case 100:
if (resultCode == RESULT_OK && i != null) {
ArrayList<String> result2 = i.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
voicetxt = result2.get(0);
if (voicetxt.equals("fan on")) {
StringBuffer result=new StringBuffer();
toggleButton1.setChecked(true);
result.append("Fan: ").append(toggleButton1.getText());
sc.onRelayNumber="a";
new Thread(sc).start();
Toast.makeText(MainActivity.this, result.toString(),Toast.LENGTH_SHORT).show();
}
if (voicetxt.equals("fan of")) {
StringBuffer result=new StringBuffer();
toggleButton1.setChecked(false);
result.append("Fan: ").append(toggleButton1.getText());
sc.onRelayNumber = "a_off";
new Thread(sc).start();
Toast.makeText(MainActivity.this, result.toString(),Toast.LENGTH_SHORT).show();
}
if (voicetxt.equals("light on")) {
StringBuffer result=new StringBuffer();
toggleButton2.setChecked(true);
result.append("Light: ").append(toggleButton2.getText());
sc.onRelayNumber = "b";
new Thread(sc).start();
Toast.makeText(MainActivity.this, result.toString(),Toast.LENGTH_SHORT).show();
}
if (voicetxt.equals("light off")) {
StringBuffer result=new StringBuffer();
toggleButton2.setChecked(false);
result.append("Light: ").append(toggleButton2.getText());
sc.onRelayNumber = "b_off";
new Thread(sc).start();
Toast.makeText(MainActivity.this, result.toString(),Toast.LENGTH_SHORT).show();
}
if (voicetxt.equals("air conditioner on")) {
StringBuffer result=new StringBuffer();
toggleButton3.setChecked(true);
result.append("AC: ").append(toggleButton3.getText());
sc.onRelayNumber = "c";
new Thread(sc).start();
Toast.makeText(MainActivity.this, result.toString(),Toast.LENGTH_SHORT).show();
}
if (voicetxt.equals("air conditioner of")) {
StringBuffer result=new StringBuffer();
toggleButton3.setChecked(false);
result.append("AC: ").append(toggleButton3.getText());
sc.onRelayNumber = "c_off";
new Thread(sc).start();
Toast.makeText(MainActivity.this, result.toString(),Toast.LENGTH_SHORT).show();
}
if (voicetxt.equals("heater on")) {
StringBuffer result=new StringBuffer();
toggleButton4.setChecked(true);
result.append("Heater: ").append(toggleButton4.getText());
sc.onRelayNumber = "d";
new Thread(sc).start();
Toast.makeText(MainActivity.this, result.toString(),Toast.LENGTH_SHORT).show();
}
if (voicetxt.equals("heater off")) {
StringBuffer result=new StringBuffer();
toggleButton4.setChecked(false);
result.append("Heater: ").append(toggleButton4.getText());
sc.onRelayNumber = "d_off";
new Thread(sc).start();
Toast.makeText(MainActivity.this, result.toString(),Toast.LENGTH_SHORT).show();
}
}
break;
}
}
public void micclick(查看){
if(view.getId()==R.id.mic)
{promptSpeechInput();}
}
私有无效promptSpeechInput(){
意图i=新意图(识别者意图、行动、识别、讲话);
i、 putExtra(RecognizerIntent.EXTRA语言模型,RecognizerIntent.LANGUAGE模型自由形式);
i、 putExtra(RecognizerIntent.EXTRA_语言,Locale.getDefault());
i、 putExtra(RecognizerIntent.EXTRA_提示“说话!”);
试一试{
startActivityForResult(i,100);
}
捕获(ActivityNotFoundException a)
{
Toast.makeText(MainActivity.this,“对不起,您的设备不支持”,Toast.LENGTH\u SHORT.show();
}
}
ActivityResult上的公共void(int请求代码、int结果代码、意图i){
super.onActivityResult(请求代码、结果代码、i);
字符串voicetxt;
开关(请求代码){
案例100:
if(resultCode==RESULT\u OK&&i!=null){
ArrayList result2=i.GetStringArrayListXTRA(识别器意图.额外结果);
voicetxt=result2.get(0);
if(voicetxt.equals(“风扇打开”)){
StringBuffer结果=新的StringBuffer();
toggleButton1.setChecked(真);
result.append(“Fan:”).append(toggleButton1.getText());
sc.onRelayNumber=“a”;
新线程(sc.start();
Toast.makeText(MainActivity.this,result.toString(),Toast.LENGTH_SHORT).show();
}
if(voicetxt.equals(“fan of”)){
StringBuffer结果=新的StringBuffer();
toggleButton1.setChecked(假);
result.append(“Fan:”).append(toggleButton1.getText());
sc.onRelayNumber=“a_off”;
新线程(sc.start();
Toast.makeText(MainActivity.this,result.toString(),Toast.LENGTH_SHORT).show();
}
if(voicetxt.equals(“亮起”)){
StringBuffer结果=新的StringBuffer();
toggleButton2.setChecked(真);
result.append(“Light:”).append(toggleButton2.getText());
sc.onRelayNumber=“b”;
新线程(sc.start();
Toast.makeText(MainActivity.this,result.toString(),Toast.LENGTH_SHORT).show();
}
if(voicetxt.equals(“灯灭”)){
StringBuffer结果=新的StringBuffer();
toggleButton2.setChecked(假);
result.append(“Light:”).append(toggleButton2.getText());
sc.onRelayNumber=“b_off”;
新线程(sc.start();
Toast.makeText(MainActivity.this,result.toString(),Toast.LENGTH_SHORT).show();
}
如果(voicetxt.equals(“空调开启”)){
StringBuffer结果=新的StringBuffer();
toggleButton3.setChecked(真);
result.append(“AC:”).append(toggleButton3.getText());
sc.onRelayNumber=“c”;
新线程(sc.start();
Toast.makeText(MainActivity.this,result.toString(),Toast.LENGTH_SHORT).show();
}
if(voicetxt.equals(“空调”)){
StringBuffer结果=新的StringBuffer();
toggleButton3.setChecked(假);
result.append(“AC:”).append(toggleButton3.getText());
sc.onRelayNumber=“c_off”;
新线程(sc.start();
Toast.makeText(MainActivity.this,result.toString(),Toast.LENGTH_SHORT).show();
}
如果(voicetxt.equals(“加热器打开”)){
StringBuffer结果=新的StringBuffer();
toggleButton4.setChecked(真);
result.append(“加热器:”).append(toggleButton4.getText());
sc.onRelayNumber=“d”;
新线程(sc.start();
Toast.makeText(MainActivity.this,result.toString(),Toast.LENGTH_SHORT).show();
}
如果(voicetxt.equals(“加热器关闭”)){
StringBuffer结果=新的StringBuffer();
toggleButton4.setChecked(假);
result.append(“加热器:”).append(toggleButton4.getText());
sc.onRelayNumber=“d_off”;
新线程(sc.start();
Toast.makeText(MainActivity.this,result.toString(),Toast.LENGTH_SHORT).show();
}
}
打破
}
}
我想在不必按下按钮的情况下实现相同的功能。请注意,我是Android应用程序开发新手。如果可能的话,请描述外部库的使用情况,如果它们是必需的,因为我认为谷歌的识别不可能持续识别
public class CustomRecognizer : Java.Lang.Object, IRecognitionListener, TextToSpeech.IOnInitListener
{
private SpeechRecognizer _speech;
private Intent _speechIntent;
public string Words;
public CustomRecognizer(Context _context)
{
this._context = _context;
Words = "";
_speech = SpeechRecognizer.CreateSpeechRecognizer(this._context);
_speech.SetRecognitionListener(this);
_speechIntent = new Intent(RecognizerIntent.ActionRecognizeSpeech);
_speechIntent.PutExtra(RecognizerIntent.ExtraLanguageModel, RecognizerIntent.LanguageModelFreeForm);
_speechIntent.PutExtra(RecognizerIntent.ActionRecognizeSpeech, RecognizerIntent.ExtraPreferOffline);
_speechIntent.PutExtra(RecognizerIntent.ExtraSpeechInputCompleteSilenceLengthMillis, 1000);
_speechIntent.PutExtra(RecognizerIntent.ExtraSpeechInputPossiblyCompleteSilenceLengthMillis, 1000);
_speechIntent.PutExtra(RecognizerIntent.ExtraSpeechInputMinimumLengthMillis, 1500);
}
void startover()
{
_speech.Destroy();
_speech = SpeechRecognizer.CreateSpeechRecognizer(this._context);
_speech.SetRecognitionListener(this);
_speechIntent = new Intent(RecognizerIntent.ActionRecognizeSpeech);
_speechIntent.PutExtra(RecognizerIntent.ExtraSpeechInputCompleteSilenceLengthMillis, 1000);
_speechIntent.PutExtra(RecognizerIntent.ExtraSpeechInputPossiblyCompleteSilenceLengthMillis, 1000);
_speechIntent.PutExtra(RecognizerIntent.ExtraSpeechInputMinimumLengthMillis, 1500);
StartListening();
}
public void StartListening()
{
_speech.StartListening(_speechIntent);
}
public void StopListening()
{
_speech.StopListening();
}
public void OnBeginningOfSpeech()
{
}
public void OnBufferReceived(byte[] buffer)
{
}
public void OnEndOfSpeech()
{
}
public void OnError([GeneratedEnum] SpeechRecognizerError error)
{
Words = error.ToString();
startover();
}
public void OnEvent(int eventType, Bundle @params)
{
}
public void OnPartialResults(Bundle partialResults)
{
}
public void OnReadyForSpeech(Bundle @params)
{
}
public void OnResults(Bundle results)
{
var matches = results.GetStringArrayList(SpeechRecognizer.ResultsRecognition);
if (matches == null)
Words = "Null";
else
if (matches.Count != 0)
Words = matches[0];
else
Words = "";
//do anything you want for the result
}
startover();
}
public void OnRmsChanged(float rmsdB)
{
}
public void OnInit([GeneratedEnum] OperationResult status)
{
if (status == OperationResult.Error)
txtspeech.SetLanguage(Java.Util.Locale.Default);
}
}
void StartRecording()
{
string rec = PackageManager.FeatureMicrophone;
if (rec != "android.hardware.microphone")
{
// no microphone, no recording. Disable the button and output an alert
Toast.MakeText(this, "NO MICROPHONE", ToastLength.Short);
}
else
{
//you can pass any object you want to connect to your recognizer here (I am passing the activity)
CustomRecognizer voice = new CustomRecognizer(this);
voice.StartListening();
}
}