Заставить SpeechRecouncer игнорировать громкое воспроизведение текста в речь во время прослушиванияAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Заставить SpeechRecouncer игнорировать громкое воспроизведение текста в речь во время прослушивания

Сообщение Anonymous »

Мой экспериментальный код ниже (

Код: Выделить всё

compileSdk 34
, minSdk 33), работает хорошо, поскольку преобразование текста в речь и распознавание речи рассматриваются отдельно:

Код: Выделить всё

package com.example.speechandspeak;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.speech.RecognitionListener;
import android.speech.RecognizerIntent;
import android.speech.SpeechRecognizer;
import android.speech.tts.TextToSpeech;
import android.util.Log;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import java.util.ArrayList;
import java.util.Locale;

public class MainActivity extends AppCompatActivity implements RecognitionListener {

private TextToSpeech tts;
private SpeechRecognizer speechRecognizer;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Initialize TextToSpeech
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
int ttsLang = tts.setLanguage(Locale.US);
if (ttsLang == TextToSpeech.LANG_MISSING_DATA || ttsLang == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(MainActivity.this, "Language is not supported!", Toast.LENGTH_SHORT).show();
} else {
speakText();
}
} else {
Toast.makeText(MainActivity.this, "TTS Initialization failed!", Toast.LENGTH_SHORT).show();
}
}
});

// Check if microphone permission is granted
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
// Permission is not granted, request it
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, 1);
}
// Initialize SpeechRecognizer
speechRecognizer = SpeechRecognizer.createSpeechRecognizer(this);
speechRecognizer.setRecognitionListener(this);
}

private void speakText() {
Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName());
String message = getString(R.string.tts_message);
tts.speak(message, TextToSpeech.QUEUE_FLUSH, null, null);

// After speaking, initiate speech recognition
Intent speechRecognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
speechRecognizer.startListening(speechRecognizerIntent);
}

@Override
public void onReadyForSpeech(Bundle params) {
Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName());
}

@Override
public void onBeginningOfSpeech() {
Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName());
}

@Override
public void onRmsChanged(float rmsdB) {
//Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName());
}

@Override
public void onBufferReceived(byte[] bytes) {
Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName());
}

@Override
public void onEndOfSpeech() {
Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName());
}

@Override
public void onError(int i) {
Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName() + "(" + i + ")");
}

@Override
public void onEvent(int eventType, Bundle params) {
Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName());
}

@Override
public void onPartialResults(Bundle partialResults) {
Log.d(this.getLocalClassName(),  "Entered: "  + Thread.currentThread().getStackTrace()[2].getMethodName());
}

@Override
public void onResults(Bundle results) {
Log.d(this.getLocalClassName(),  "Entered: " + Thread.currentThread().getStackTrace()[2].getMethodName());
ArrayList matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
if (matches != null && !matches.isEmpty()) {
Log.v(this.getLocalClassName(),  "Matches: " + matches);
String text = matches.get(0).toLowerCase(); // Convert to lowercase for case-insensitive comparison
if (text.equals("stop")) {
if (tts.isSpeaking()) {
tts.stop();
speechRecognizer.stopListening(); // Stop listening for further commands
Toast.makeText(MainActivity.this, "Stopped!", Toast.LENGTH_SHORT).show();
}
}
}
}

@Override
protected void onDestroy() {
super.onDestroy();
if (tts != null) {
tts.shutdown();
}
}
}
То есть пример предложения ("Это демонстрация распознавания речи и преобразования текста в речь. Скажи "стоп!", чтобы выйти.") воспроизводится четко, а распознаватель речи запускается и работает правильно, как видно из отладочных сообщений Logcat:

Код: Выделить всё

12:40:09.125 MainActivity              D  Entered: speakText
12:40:09.297                           D  Entered: onReadyForSpeech
12:40:09.761                           D  Entered: onBeginningOfSpeech
12:40:13.365                           D  Entered: onEndOfSpeech
12:40:13.394                           D  Entered: onResults
12:40:13.396                           V  Matches: [demonstration of speech recognition and text to speech say stop to quit]
12:40:14.524 ProfileInstaller          D  Installing profile for com.example.speechandspeak
Однако, поскольку SpeechRecouncer начинает прослушивание практически одновременно с воспроизведением TTS (намеренно, это предполагаемый тестовый пример), onResults() распознает только вывод TTS (< em>"демонстрация распознавания речи и текст в речь: "Стой, чтобы бросить курить"), игнорируя все, что я говорю в это время.
Вместо этого я бы этого хотел. , чтобы сосредоточиться на своем голосе и игнорировать вывод TTS.
Как мне это сделать?
Я знаю, что Android 13+ смартфоны способны на это, потому что когда я говорю "Привет, Google" во время воспроизведения TTS вслух, моя речь распознается, вывод TTS приостанавливается и запускается Google Assistant слушаю...
Как это достигается?

Подробнее здесь: https://stackoverflow.com/questions/785 ... e-listenin
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»