Голосовой ввод в Unity
Внимание!
Прежде чем начать, рассмотрите возможность использования подключаемого модуля Unity для пакета SDK Cognitive Speech Services. Подключаемый модуль имеет улучшенные результаты точности речи и простой доступ к декодированию речи в текст, а также расширенные функции речи, такие как диалог, взаимодействие на основе намерений, перевод, синтез текста в речь и распознавание речи на естественном языке. Чтобы приступить к работе, проверка пример и документацию.
Unity предоставляет три способа добавления голосового ввода в приложение Unity, первые два из которых являются типами PhraseRecognizer:
- предоставляет
KeywordRecognizer
вашему приложению массив строковых команд для прослушивания. - предоставляет
GrammarRecognizer
приложению файл SRGS, определяющий конкретную грамматику для прослушивания. - позволяет вашему
DictationRecognizer
приложению прослушивать любое слово и предоставлять пользователю заметку или другое отображение речи.
Примечание
Диктовка и распознавание фраз нельзя обрабатывать одновременно. Если grammarRecognizer или KeywordRecognizer активен, DictationRecognizer не может быть активным и наоборот.
Включение возможности для голосовой связи
Чтобы приложение использовало голосовой ввод, необходимо объявить возможность микрофона .
- В редакторе Unity перейдите к разделу Edit > Project Settings > Player
- Выбор вкладки Магазина Windows
- В разделе Возможности параметров > публикации проверка возможность микрофона.
- Предоставление приложению разрешений на доступ к микрофону на устройстве HoloLens
- Вам будет предложено сделать это при запуске устройства, но если вы случайно нажали "нет", вы можете изменить разрешения в параметрах устройства.
Распознавание фраз
Чтобы позволить приложению прослушивать определенные фразы, произнесенные пользователем, а затем предпринять некоторые действия, необходимо:
- Укажите, какие фразы следует прослушивать с помощью
KeywordRecognizer
илиGrammarRecognizer
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()
, чтобы освободить используемые ресурсы. Эти ресурсы будут автоматически освобождены во время сборки мусора с дополнительными затратами на производительность, если они не будут освобождены до этого.
Для начала работы с диктовкой необходимо выполнить всего несколько действий.
- Создание нового объекта
DictationRecognizer
- Обработка событий диктовки
- Запуск DictationRecognizer
Включение возможности диктовки
Чтобы приложение использовало диктовку, необходимо объявить возможности интернет-клиента и микрофона :
- В редакторе Unity перейдите в раздел Изменить > проигрыватель параметров > проекта.
- Выбор на вкладке Магазина Windows
- В разделе Возможности параметров > публикации проверка возможности InternetClient.
- При необходимости, если вы еще не включили микрофон, проверка возможность микрофона.
- Предоставьте приложению разрешения на доступ к микрофону на устройстве HoloLens, если вы еще этого не сделали
- Вам будет предложено сделать это при запуске устройства, но если вы случайно нажали "нет", вы можете изменить разрешения в параметрах устройства.
ДиктовкаRecognizer
Создайте DictationRecognizer следующим образом:
dictationRecognizer = new DictationRecognizer();
Существует четыре события диктовки, на которые можно подписаться и обработать для реализации поведения диктовки.
DictationResult
DictationComplete
DictationHypothesis
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
. Существует два тайм-аута, о которых следует помнить:- Если распознаватель запускается и не слышит звук в течение первых пяти секунд, время ожидания истекает.
- Если распознаватель дал результат, но затем услышит молчание в течение 20 секунд, время ожидания истекает.
Использование распознавания фраз и диктовки
Если вы хотите использовать распознавание фраз и диктовку в приложении, необходимо полностью завершить работу одного из них, прежде чем начать другой. Если у вас есть несколько запущенных keywordRecognizers, вы можете завершить их все одновременно с помощью:
PhraseRecognitionSystem.Shutdown();
После остановки DictationRecognizer можно вызвать метод Restart()
для восстановления всех распознавателей до предыдущего состояния:
PhraseRecognitionSystem.Restart();
Можно также просто запустить KeywordRecognizer, который также перезапустит PhraseRecognitionSystem.
Голосовой ввод в наборе средств Смешанная реальность
Примеры MRTK для голосового ввода можно найти в следующих демонстрационных сценах:
Следующий этап разработки
Если вы выполняете описанный нами путь создания контрольных точек для разработки Unity, то следующей задачей будет изучение возможностей платформы Смешанная реальность и API:
Вы можете в любой момент вернуться к этапам разработки для Unity.