Голосовой ввод в Unity

Внимание!

Прежде чем начать, рассмотрите возможность использования подключаемого модуля Unity для пакета SDK служб распознавания речи. У подключаемого модуля есть лучшие результаты для распознавания речи и простой доступ к декодированию речи в текст, а также расширенные функции речи, такие как диалоговое окно, взаимодействие на основе намерений, перевод, синтез текста в речь и распознавание речи на естественном языке. Чтобы приступить к работе, ознакомьтесь с примером и документацией.

Unity предоставляет три способа добавления речевого ввода в приложение Unity, первые два из которых являются типами фрасерекогнизер:

  • KeywordRecognizerПредоставляет приложению массив строковых команд для прослушивания
  • GrammarRecognizerПредоставляет приложению файл SRGS, определяющий конкретную грамматику для прослушивания
  • DictationRecognizerПозволяет приложению прослушивать любое слово и предоставлять пользователю заметку или другое отображение речи

Примечание

Диктовка и распознавание фраз не могут быть обработаны одновременно. Если Граммаррекогнизер или Кэйвордрекогнизер активен, Диктатионрекогнизер не может быть активным и наоборот.

Включение возможности для голоса

Для использования речевого ввода приложение должно быть объявлено с помощью функции микрофона .

  1. в редакторе Unity перейдите к изменению > Project Параметры > Player .
  2. выберите вкладку " хранилище Windows ".
  3. в разделе Параметры > возможностей публикации проверьте возможность использования микрофона .
  4. предоставление разрешений приложению доступа к микрофону на устройстве HoloLens
    • Вам будет предложено сделать это при запуске устройства, но если вы случайно щелкнули "нет", вы можете изменить разрешения в параметрах устройства.

Распознавание фраз

Чтобы разрешить приложению прослушивать определенные фразы, произносимые пользователем, выполните некоторые действия:

  1. Укажите, какие фразы следует прослушивать с помощью KeywordRecognizer или GrammarRecognizer
  2. Обрабатывает OnPhraseRecognized событие и принимает действие, соответствующее распознанной фразе

кэйвордрекогнизер

Пространство имен: UnityEngine. Windows. Речь
Типы: кэйвордрекогнизер, фрасерекогнизедевентаргс, спичеррор, спичсистемстатус

Чтобы сохранить несколько нажатий клавиш, потребуется несколько операторов using:

using UnityEngine.Windows.Speech;
using System.Collections.Generic;
using System.Linq;

Затем добавим несколько полей в класс для хранения словаря распознавателя и ключевого слова >.

KeywordRecognizer keywordRecognizer;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();

Теперь добавьте в словарь ключевое слово, например в Start() методе. В этом примере мы добавляем ключевое слово "Activate":

//Create keywords for keyword recognizer
keywords.Add("activate", () =>
{
    // action to be performed when this keyword is spoken
});

Создайте распознаватель ключевых слов и сообщите ему, что мы хотим узнать:

keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());

Теперь Зарегистрируйтесь для OnPhraseRecognized события

keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;

Пример обработчика:

private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    System.Action keywordAction;
    // if the keyword recognized is in our dictionary, call that Action.
    if (keywords.TryGetValue(args.text, out keywordAction))
    {
        keywordAction.Invoke();
    }
}

Наконец, начните распознать!

keywordRecognizer.Start();

граммаррекогнизер

Пространство имен: UnityEngine. Windows. Речь
Типы: граммаррекогнизер, фрасерекогнизедевентаргс, спичеррор, спичсистемстатус

Граммаррекогнизер используется, если вы указываете грамматику для распознавания с помощью SRGS. Это может быть полезно, если приложение содержит несколько ключевых слов, если вы хотите распознавать более сложные фразы или хотите легко включать и выключать наборы команд. Сведения о формате файла см. в статье Создание грамматик с помощью XML-кода SRGS .

После того как грамматика SRGS будет доступна в проекте в папке стреамингассетс:

<PROJECT_ROOT>/Assets/StreamingAssets/SRGS/myGrammar.xml

Создайте GrammarRecognizer и передайте ему путь к файлу SRGS:

private GrammarRecognizer grammarRecognizer;
grammarRecognizer = new GrammarRecognizer(Application.streamingDataPath + "/SRGS/myGrammar.xml");

Теперь Зарегистрируйтесь для OnPhraseRecognized события

grammarRecognizer.OnPhraseRecognized += grammarRecognizer_OnPhraseRecognized;

Вы получите обратный вызов, содержащий сведения, указанные в грамматике SRGS, которую можно правильно обойти. Большая часть важной информации будет предоставлена в semanticMeanings массиве.

private void Grammar_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
    SemanticMeaning[] meanings = args.semanticMeanings;
    // do something
}

Наконец, начните распознать!

grammarRecognizer.Start();

Диктовка

Пространство имен: UnityEngine. Windows. Речь
Типы: диктатионрекогнизер, спичеррор, спичсистемстатус

Используйте DictationRecognizer для преобразования речи пользователя в текст. Диктатионрекогнизер предоставляет функции диктовки и поддерживает регистрацию и прослушивание событий завершения и фразы, поэтому вы можете отправить отзыв пользователю, когда они говорят и затем. Start() методы и, Stop() соответственно, включают и отключают распознавание диктовки. После завершения с распознавателем его следует удалить с помощью, Dispose() чтобы освободить используемые ресурсы. Он автоматически освобождает эти ресурсы во время сборки мусора при дополнительных затратах на производительность, если они не выявляются до этого.

Чтобы начать работу с диктовкой, необходимо выполнить несколько шагов.

  1. Создать новый DictationRecognizer
  2. Обработку событий диктовки
  3. Запуск Диктатионрекогнизер

Включение функции для диктовки

Для использования режима диктовки в приложении необходимо объявить клиент Интернета и возможности микрофона .

  1. в редакторе Unity выберите изменить > Project Параметры > Player .
  2. выберите на вкладке " хранилище Windows "
  3. в разделе Параметры > возможностей публикации проверьте возможность использования функции InternetClient .
    • Кроме того, если микрофон еще не включен, проверьте возможность использования микрофона .
  4. предоставьте разрешения на доступ к микрофону для приложения на устройстве HoloLens, если вы еще не сделали этого.
    • Вам будет предложено сделать это при запуске устройства, но если вы случайно щелкнули "нет", вы можете изменить разрешения в параметрах устройства.

диктатионрекогнизер

Создайте Диктатионрекогнизер следующим образом:

dictationRecognizer = new DictationRecognizer();

Существует четыре события диктовки, которые можно подписывать и обрабатывать для реализации поведения диктовки.

  1. DictationResult
  2. DictationComplete
  3. DictationHypothesis
  4. DictationError

диктатионресулт

Это событие возникает после приостановки пользователем, как правило, в конце предложения. Здесь возвращается полная распознанная строка.

Сначала Подпишитесь на DictationResult событие:

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Затем обработайте обратный вызов Диктатионресулт:

private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
    // do something
}

диктатионхипосесис

Это событие возникает постоянно во время разговора пользователя. Как распознаватель прослушивает этот момент, он предоставляет текст о том, что он слышал.

Сначала Подпишитесь на DictationHypothesis событие:

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Затем обработайте обратный вызов Диктатионхипосесис:

private void DictationRecognizer_DictationHypothesis(string text)
{
    // do something
}

диктатионкомплете

Это событие возникает при остановке распознавателя, при вызове из метода Stop (), истечения времени ожидания или при возникновении какой-либо другой ошибки.

Сначала Подпишитесь на DictationComplete событие:

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Затем обработайте обратный вызов Диктатионкомплете:

private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
   // do something
}

диктатионеррор

Это событие возникает при возникновении ошибки.

Сначала Подпишитесь на DictationError событие:

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Затем обработайте обратный вызов Диктатионеррор:

private void DictationRecognizer_DictationError(string error, int hresult)
{
    // do something
}

После подписки и обработки событий диктовки запустите распознаватель диктовки, чтобы начать получать события.

dictationRecognizer.Start();

Если вы больше не хотите поддерживать Диктатионрекогнизер, необходимо отменить подписывание событий и ликвидировать Диктатионрекогнизер.

dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();

Советы

  • Start() методы и, Stop() соответственно, включают и отключают распознавание диктовки.
  • После завершения с распознавателем его необходимо удалить с помощью, Dispose() чтобы освободить используемые ресурсы. Он автоматически освобождает эти ресурсы во время сборки мусора при дополнительных затратах на производительность, если они не выявляются до этого.
  • Время ожидания происходит по истечении заданного периода времени. Эти времена ожидания можно проверить в DictationComplete событии. Существует два времени ожидания, которые следует учитывать:
    1. Если распознаватель запускается и не слышит звук в течение первых пяти секунд, время ожидания истекает.
    2. Если распознаватель предоставил результат, а затем слышит бездействия в течение 20 секунд, время ожидания истечет.

Использование распознавания и диктовки фраз

Если вы хотите использовать как распознавание, так и диктовку в приложении, необходимо полностью закрыть один из них, прежде чем можно будет начать другой. Если вы используете несколько Кэйвордрекогнизерс, вы можете завершить их все одновременно с помощью:

PhraseRecognitionSystem.Shutdown();

Можно вызвать Restart() для восстановления всех распознавателей до их предыдущего состояния после остановки диктатионрекогнизер:

PhraseRecognitionSystem.Restart();

Кроме того, можно просто запустить Кэйвордрекогнизер, который также перезапустит Фрасерекогнитионсистем.

ввод голоса в смешанной реальности набор средств

Примеры МРТК для речевого ввода можно найти в следующих демонстрационных сценах:

Следующий этап разработки

Если вы используете точку контрольной точки разработки Unity, которую мы собрали, то вам следует ознакомиться с возможностями и API платформы смешанной реальности:

Вы можете в любой момент вернуться к этапам разработки для Unity.