У меня есть Java-приложение, которое распознает речь с помощью Speech SDK для службы речи Microsoft Azure. Я пытаюсь применить список фраз к IntentRecouncer, используя класс PhraseListGrammar, чтобы улучшить распознавание имен (например, «Джун», «Рехаан»), но не вижу никаких улучшений в распознавании имен. Однако, когда я заменяю IntentRecouncer на SpeechRecouncer, речевая служба может распознавать имена в данном речевом звуке, и это нормально.
Пример кода для списков фраз от Microsoft выполнен только с помощью SpeechRecouncer (пример)
AudioConfig audioInput = AudioConfig.fromWavFileInput("YourPhraseListedAudioFile.wav");
SpeechRecognizer recognizer = new SpeechRecognizer(config, audioInput);
{
// Create the recognizer.
PhraseListGrammar phraseList = PhraseListGrammar.fromRecognizer(recognizer);
// Add a phrase to assist in recognition.
phraseList.addPhrase("Wreck a nice beach");
// Subscribes to events.
recognizer.recognizing.addEventListener((s, e) -> {
System.out.println("RECOGNIZING: Text = " + e.getResult().getText());
});
recognizer.recognized.addEventListener((s, e) -> {
if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
System.out.println("RECOGNIZED: Text = " + e.getResult().getText());
}
else if (e.getResult().getReason() == ResultReason.NoMatch) {
System.out.println("NOMATCH: Speech could not be recognized.");
}
});
recognizer.canceled.addEventListener((s, e) -> {
System.out.println("CANCELED: Reason = " + e.getReason());
if (e.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorCode = " + e.getErrorCode());
System.out.println("CANCELED: ErrorDetails = " + e.getErrorDetails());
System.out.println("CANCELED: Did you update the subscription info?");
}
stopRecognitionSemaphore.release();
});
recognizer.sessionStarted.addEventListener((s, e) -> {
System.out.println("\n Session started event.");
});
и я, по сути, следую этому примеру. Нельзя ли использовать списки фраз с IntentRecouncer, используя класс PhraseListGrammar? Если нет, есть ли другой способ применить списки фраз к IntentRecouncer?




Нельзя ли использовать списки фраз с IntentRecouncer, используя класс PhraseListGrammar?
К сожалению, прямое применение списка фраз к IntentRecouncer с помощью класса PhraseListGrammar не поддерживается в Microsoft Speech SDK для Java.
Мне удалось обойти это ограничение, используя комбинацию SpeechRecognizer и PhraseListGrammar.
Код:
import com.microsoft.cognitiveservices.speech.*;
import java.util.concurrent.Semaphore;
public class Main {
public static void main(String[] args) {
// Your Speech Service configuration (subscription key, region, etc.)
SpeechConfig config = SpeechConfig.fromSubscription("YourSubscriptionKey", "YourServiceRegion");
// Load audio from a WAV file (replace with your actual file path)
AudioConfig audioInput = AudioConfig.fromWavFileInput("YourPhraseListedAudioFile.wav");
// Create a SpeechRecognizer
SpeechRecognizer recognizer = new SpeechRecognizer(config, audioInput);
// Create a PhraseListGrammar
PhraseListGrammar phraseList = PhraseListGrammar.fromRecognizer(recognizer);
phraseList.addPhrase("Jun");
phraseList.addPhrase("Rehaan");
// Subscribe to recognizing and recognized events
recognizer.recognizing.addEventListener((s, e) -> {
System.out.println("RECOGNIZING: Text = " + e.getResult().getText());
});
recognizer.recognized.addEventListener((s, e) -> {
if (e.getResult().getReason() == ResultReason.RecognizedSpeech) {
System.out.println("RECOGNIZED: Text = " + e.getResult().getText());
} else if (e.getResult().getReason() == ResultReason.NoMatch) {
System.out.println("NOMATCH: Speech could not be recognized.");
}
});
// Start recognition
recognizer.startContinuousRecognitionAsync();
// Wait for recognition to complete (you can use a semaphore or other synchronization mechanism)
Semaphore stopRecognitionSemaphore = new Semaphore(0);
recognizer.canceled.addEventListener((s, e) -> {
System.out.println("CANCELED: Reason = " + e.getReason());
if (e.getReason() == CancellationReason.Error) {
System.out.println("CANCELED: ErrorCode = " + e.getErrorCode());
System.out.println("CANCELED: ErrorDetails = " + e.getErrorDetails());
System.out.println("CANCELED: Did you update the subscription info?");
}
stopRecognitionSemaphore.release();
});
// Wait for recognition to finish (you can adjust the timeout as needed)
try {
stopRecognitionSemaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
// Clean up resources
recognizer.close();
}
}
IntentRecognizer против SpeechRecognizer:
IntentRecognizer обычно используется для задач понимания естественного языка (NLU), где вы определяете намерения и сущности для извлечения структурированной информации из разговорной речи.SpeechRecognizer больше ориентирован на расшифровку разговорного звука в текст без конкретного распознавания намерений.IntentRecognizer не полностью использует подсказки списка фраз, предоставляемые PhraseListGrammar.Ссылаться:
Понятно, в этом случае я буду экспериментировать с SpeechRecouncer или комбинировать два распознавателя. Спасибо!