Голосовой ввод в Unity
Внимание
Прежде чем начать, рассмотрите возможность использования подключаемого модуля Unity для пакета SDK Cognitive Speech Services. Подключаемый модуль имеет лучшие результаты точности речи и легкий доступ к декодированию речи в текст, а также расширенные функции речи, такие как диалоговое окно, взаимодействие на основе намерений, перевод, синтез речи в текст и распознавание речи естественного языка. Чтобы приступить к работе, ознакомьтесь с примером и документацией.
Unity предоставляет три способа добавления голосовых входных данных в приложение Unity, первые два из которых являются типами PhraseRecognizer:
- Предоставляет
KeywordRecognizer
приложению массив строковых команд для прослушивания - Предоставляет
GrammarRecognizer
приложению файл SRGS, определяющий определенную грамматику для прослушивания - Позволяет
DictationRecognizer
приложению прослушивать любое слово и предоставлять пользователю заметку или другое отображение речи.
Примечание.
Диктовка и распознавание фраз нельзя обрабатывать одновременно. Если параметр GrammarRecognizer или KeywordRecognizer активен, диктовкаRecognizer не может быть активным и наоборот.
Включение возможности голосовой связи
Возможность микрофона должна быть объявлена для приложения, чтобы использовать входные данные голосовой связи.
- В редакторе Unity перейдите к разделу "Изменить > проигрыватель параметров > проекта"
- Выберите вкладку Магазина 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()
. Мы добавляем ключевое слово "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();
GrammarRecognizer
Пространство имен: UnityEngine.Windows.Speech
Типы: GrammarRecognizer, PhraseRecognizedEventArgs, SpeechError, SpeechSystemStatus
Средство GrammarRecognizer используется, если вы указываете грамматику распознавания с помощью SRGS. Это может быть полезно, если у вашего приложения есть несколько ключевых слов, если вы хотите распознать более сложные фразы, или если вы хотите легко включить и отключить наборы команд. См. статью "Создание грамматики с помощью XML SRGS" для сведений о формате файла.
Получив грамматику 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
Типы: ДиктовкаRecognizer, SpeechError, SpeechSystemStatus
DictationRecognizer
Используйте для преобразования речи пользователя в текст. ДиктовкаRecognizer предоставляет функциональные возможности диктовки и поддерживает регистрацию и прослушивание завершенных событий гипотезы и фраз, поэтому вы можете предоставить пользователю обратную связь как во время выступления, так и после этого. Start()
и Stop()
методы соответственно включите и отключите распознавание диктовки. После завершения работы с распознавательом его следует удалить с помощью Dispose()
для освобождения ресурсов, которые он использует. Он будет автоматически выпускать эти ресурсы во время сборки мусора при дополнительных затратах на производительность, если они не выпускаются до этого.
Для начала работы с диктовкой необходимо выполнить лишь несколько шагов.
- Создание нового
DictationRecognizer
- Обработка событий диктовки
- Запуск диктовкиRecognizer
Включение возможности диктовки
Возможности интернет-клиента и микрофона должны быть объявлены для приложения, чтобы использовать диктовку:
- В редакторе Unity перейдите к разделу "Изменить > проигрыватель параметров > проекта"
- Выберите на вкладке Магазина Windows
- В разделе "Параметры > публикации" проверьте возможность InternetClient
- При необходимости, если вы еще не включите микрофон, проверьте возможность микрофона
- Предоставление разрешений приложению для доступа к микрофону на устройстве HoloLens, если вы еще не сделали
- Вам будет предложено сделать это при запуске устройства, но если вы случайно щелкнули "нет", вы можете изменить разрешения в параметрах устройства.
ДиктовкаRecognizer
Создайте диктовкуRecognizer следующим образом:
dictationRecognizer = new DictationRecognizer();
Существует четыре события диктовки, которые можно подписать на и обработать для реализации поведения диктовки.
DictationResult
DictationComplete
DictationHypothesis
DictationError
ДиктовкаResult
Это событие запускается после приостановки пользователем, как правило, в конце предложения. Здесь возвращается полная распознаваемая строка.
Сначала подпишитесь на DictationResult
событие:
dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
Затем обработайте обратный вызов DictationResult:
private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence)
{
// do something
}
ДиктацияHypothesis
Это событие запускается непрерывно, пока пользователь разговаривает. Как распознаватель слушает, он предоставляет текст того, что он слышал до сих пор.
Сначала подпишитесь на DictationHypothesis
событие:
dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;
Затем обработайте обратный вызов DictationHypothesis:
private void DictationRecognizer_DictationHypothesis(string text)
{
// do something
}
ДиктовкаComplete
Это событие запускается, когда распознаватель останавливается, вызывается ли метод Stop(), происходит время ожидания или другая ошибка.
Сначала подпишитесь на DictationComplete
событие:
dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;
Затем обработайте обратный вызов DictationComplete:
private void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
{
// do something
}
ДиктовкаError
Это событие запускается при возникновении ошибки.
Сначала подпишитесь на DictationError
событие:
dictationRecognizer.DictationError += DictationRecognizer_DictationError;
Затем обработайте обратный вызов диктовкиError:
private void DictationRecognizer_DictationError(string error, int hresult)
{
// do something
}
После подписки и обработки событий диктовки, которые вам нужны, запустите распознаватель диктовки, чтобы начать получение событий.
dictationRecognizer.Start();
Если вы больше не хотите хранить диктовкуRecognizer вокруг, необходимо отменить подписку из событий и удалить диктовкуRecognizer.
dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult;
dictationRecognizer.DictationComplete -= DictationRecognizer_DictationComplete ;
dictationRecognizer.DictationHypothesis -= DictationRecognizer_DictationHypothesis ;
dictationRecognizer.DictationError -= DictationRecognizer_DictationError ;
dictationRecognizer.Dispose();
Советы
Start()
иStop()
методы соответственно включите и отключите распознавание диктовки.- После завершения работы с распознавательом его необходимо удалить с помощью
Dispose()
для освобождения ресурсов, которые он использует. Он будет автоматически выпускать эти ресурсы во время сборки мусора при дополнительных затратах на производительность, если они не выпускаются до этого. - Время ожидания происходит после заданного периода времени. Эти тайм-ауты можно проверить в событии
DictationComplete
. Существует два времени ожидания, которые следует учитывать:- Если распознаватель запускается и не слышит звук в течение первых пяти секунд, время ожидания будет истекает.
- Если распознаватель дал результат, но затем услышит молчание в течение 20 секунд, оно будет истекло.
Использование распознавания фраз и диктовки
Если вы хотите использовать распознавание фраз и диктовку в приложении, необходимо полностью завершить работу, прежде чем начать другую. Если у вас несколько запущенных ключевых словRecognizers, их можно закрыть одновременно с помощью:
PhraseRecognitionSystem.Shutdown();
Вы можете вызвать Restart()
восстановление всех распознавателей до предыдущего состояния после остановки диктовкиRecognizer:
PhraseRecognitionSystem.Restart();
Вы также можете запустить ключевое словоRecognizer, который также перезагрузит PhraseRecognitionSystem.
Входные данные голоса в наборе средств Смешанная реальность
Примеры MRTK для голосовых входных данных можно найти в следующих демонстрационных сценах:
Следующий этап разработки
Если вы выполняете путешествие по контрольной точке разработки Unity, вы узнаете о возможностях платформы Смешанная реальность и API:
Вы можете в любой момент вернуться к этапам разработки для Unity.