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

Внимание!

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

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

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

Примечание

Диктовка и распознавание фраз нельзя обрабатывать одновременно. Если grammarRecognizer или KeywordRecognizer активен, DictationRecognizer не может быть активным и наоборот.

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

Чтобы приложение использовало голосовой ввод, необходимо объявить возможность микрофона .

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

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

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

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

KeywordRecognizer

Пространство имен:UnityEngine.Windows.Speech
Типы:KeywordRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

Для сохранения некоторых нажатий клавиш потребуется несколько операторов 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() . В этом примере мы добавляем ключевое слово "активировать":

//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();

GrammarRecognizer

Пространство имен:UnityEngine.Windows.Speech
Типы: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus

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

После получения грамматики SRGS в проекте в папке StreamingAssets:

<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.Speech
Типы: DictationRecognizer, SpeechError, SpeechSystemStatus

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

Для начала работы с диктовкой необходимо выполнить всего несколько действий.

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

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

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

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

ДиктовкаRecognizer

Создайте DictationRecognizer следующим образом:

dictationRecognizer = new DictationRecognizer();

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

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

DictationResult

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

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

dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;

Затем обработайте обратный вызов DictationResult:

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

ДиктацияГипотез

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

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

dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;

Затем обработайте обратный вызов DictationHypothesis:

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

DictationComplete

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

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

dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;

Затем обработайте обратный вызов DictationComplete:

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

ДиктовкаError

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

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

dictationRecognizer.DictationError += DictationRecognizer_DictationError;

Затем обработайте обратный вызов DictationError:

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

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

dictationRecognizer.Start();

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

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 секунд, время ожидания истекает.

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

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

PhraseRecognitionSystem.Shutdown();

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

PhraseRecognitionSystem.Restart();

Можно также просто запустить KeywordRecognizer, который также перезапустит PhraseRecognitionSystem.

Голосовой ввод в наборе средств Смешанная реальность

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

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

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

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