Можно ли использовать PhraseListGrammar с IntentRecouncer в Microsoft Speech SDK для Java?

У меня есть 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нельзя ли использовать списки фраз с IntentRecouncer, используя класс PhraseListGrammar?

К сожалению, прямое применение списка фраз к IntentRecouncer с помощью класса PhraseListGrammar не поддерживается в Microsoft Speech SDK для Java.

  • IntentRecouncer в Speech SDK для Java в первую очередь предназначен для задач понимания языка, где вы определяете намерения и сущности для извлечения смысла из ввода пользователя. Он не имеет встроенной поддержки для указания пользовательских списков фраз, как это делает SpeechRecouncer.

Мне удалось обойти это ограничение, используя комбинацию 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 или комбинировать два распознавателя. Спасибо!

junhao 07.05.2024 15:44

Другие вопросы по теме

Публикация артефакта в Azure Devops Pipeline: ошибка получения разрешения на доступ к пути
Сбой контейнера Grobid при использовании приложений-контейнеров Azure
Функции Azure добавляют пользовательскую переменную среды во время публикации
Добавьте виртуальные приложения и каталоги в мое веб-приложение Azure
Копия ADF активно добавляет дополнительный столбец, если он недоступен в исходном коде
Конвейер Azure DevOps выдает сообщение «##[ошибка]Файлы проекта, соответствующие указанному шаблону, не найдены». при публикации моего приложения?
Azure cli — получение и создание веб-заданий для списка веб-приложений в Azure с помощью Azure CLI
Масштабирование предпочтительного пула узлов в кластере Azure Kubernetes
В токене Entra ID OpenID, который я получаю при регистрации приложения Azure, что такое утверждение «oid» в результирующем токене доступа и откуда оно берется?
Сбой конвейера с ОШИБКОЙ: недостаточно значений для распаковки (ожидалось 2, получено 1) при попытке перенести версию платформы APIM с stv1 на stv2