初歩的な質問...
次の 4 行のコードがあります。
3行目は、ユーザーに(音声で)アクションについて確信があるかどうかを尋ねます。
次に、4 行目で speechYesNo というメソッド (以下に含まれます) を呼び出して、ユーザーの応答をリッスンします。
問題は、txtSpeech.speak 行 (3 行目) が話し終わる前に speechYesNo メソッドが呼び出され、"Are you sure..." という音声行とユーザーの応答が記録されることです。
たとえば、ユーザーが「はい」と答えた場合、speechYesNo メソッドの結果は次のようになります。「xxxxx を追加してよろしいですか はい」
結果が「はい」になりたいだけです。
speechYesNo() メソッドが呼び出される前に、3 行目 (txtSpeech.speak) を強制的に終了させる方法はありますか?
ありがとう
String strCommonName = myUtil.getCommonName(strFinalResult);
String strToSpeak = "Are you sure you would like to add " + strCommonName;
txtSpeech.speak(strToSpeak, TextToSpeech.QUEUE_FLUSH, null);
speechYesNo();
これが speechYesNo() メソッドです
public void speechYesNo() {
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());
if(intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, 9);
} else {
Toast.makeText(context, "Your device does not support Speech Input.", Toast.LENGTH_LONG).show();
}
}
これが onActivityResult です...
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 10:
if(resultCode == RESULT_OK && data != null) {
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
String strResult = result.get(0);
Double dblStringComparison = 0.000;
String strFinalResult = "Unknown";
for(int intCount = 0; intCount <= arrAnimals.size()-1; intCount++) {
String strVal1 = strResult;
String strVal2 = myUtil.getCommonName(arrAnimals.get(intCount));
Double dblTemp = myUtil.similarity(strVal1, strVal2 );
if(dblTemp > dblStringComparison){
dblStringComparison = dblTemp;
strFinalResult = arrAnimals.get(intCount);
}
}
atvAnimalName.setText(strFinalResult);
String strCommonName = myUtil.getCommonName(strFinalResult);
String strToSpeak = "Are you sure you would like to add " + strCommonName;
txtSpeech.speak(strToSpeak, TextToSpeech.QUEUE_FLUSH, null);
speechYesNo();
}
break;
case 9:
if(resultCode == RESULT_OK && data != null) {
ArrayList<String> result2 = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
String strYesNo0 = result2.get(0);
Toast.makeText(context, strYesNo0, Toast.LENGTH_LONG).show();
}
break;
}
}
ここに完全なスクリプトがあります
openSpeechMode メソッドは、ユーザーが画像をクリックすると起動し、ユーザーの音声選択を記録します。
これが完了したら、アプリでユーザーに、自分の選択について確信があるかどうかを尋ねます。
ユーザーが「はい」と答えた場合は、さらに作業を行います。
上記の問題は、スピーチ レコーダーが「よろしいですか」という質問と「はい」という応答を記録していることです。
public void openSpeechMode(View view) {
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());
if(intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, 10);
} else {
Toast.makeText(context, "Your device does not support Speech Input.", Toast.LENGTH_LONG).show();
}
}
public void speechYesNo() {
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());
if(intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, 9);
} else {
Toast.makeText(context, "Your device does not support Speech Input.", Toast.LENGTH_LONG).show();
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 10:
if(resultCode == RESULT_OK && data != null) {
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
String strResult = result.get(0);
Double dblStringComparison = 0.000;
String strFinalResult = "Unknown";
for(int intCount = 0; intCount <= arrAnimals.size()-1; intCount++) {
String strVal1 = strResult;
String strVal2 = myUtil.getCommonName(arrAnimals.get(intCount));
Double dblTemp = myUtil.similarity(strVal1, strVal2 );
if(dblTemp > dblStringComparison){
dblStringComparison = dblTemp;
strFinalResult = arrAnimals.get(intCount);
}
}
atvAnimalName.setText(strFinalResult);
String strCommonName = myUtil.getCommonName(strFinalResult);
String strToSpeak = "Are you sure you would like to add " + strCommonName;
txtSpeech.speak(strToSpeak, TextToSpeech.QUEUE_FLUSH, null);
// speechYesNo();
}
break;
case 9:
if(resultCode == RESULT_OK && data != null) {
ArrayList<String> result2 = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
String strYesNo0 = result2.get(0);
Toast.makeText(context, strYesNo0, Toast.LENGTH_LONG).show();
}
break;
}
}