HoloLens (1-го поколения) и Azure 301: перевод языка
Примечание
Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет опубликована новая серия учебников, демонстрирующих разработку для HoloLens 2. В этом уведомлении будет добавлена ссылка на эти руководства при их публикации.
В этом курсе вы узнаете, как добавить возможности перевода в приложение смешанной реальности с помощью Azure Cognitive Services с помощью API перевода текстов.
API перевода текстов — это служба перевода, которая работает практически в режиме реального времени. Служба основана на облаке, и с помощью вызова REST API приложение может использовать технологию нейронного машинного перевода для перевода текста на другой язык. Дополнительные сведения см. на странице API перевода текстов Azure.
По завершении этого курса у вас будет приложение смешанной реальности, которое сможет выполнять следующие действия:
- Пользователь будет говорить на микрофон, подключенный к иммерсивной гарнитуре (VR) (или встроенному микрофону HoloLens).
- Приложение будет записывать диктовку и отправлять ее в API перевода текстов Azure.
- Результат перевода будет отображаться в простой группе пользовательского интерфейса в сцене Unity.
В этом курсе вы узнаете, как получить результаты из службы переводчика в пример приложения на основе Unity. Вы сможете применить эти понятия к пользовательскому приложению, которое вы можете создать.
Поддержка устройств
Курс | HoloLens | Иммерсивные гарнитуры |
---|---|---|
301. Смешанная реальность и Azure: перевод с одного языка на другой | ✔️ | ✔️ |
Примечание
Хотя в этом курсе основное внимание уделяется Windows Mixed Reality иммерсивным гарнитурам ( VR), вы также можете применить то, что вы узнали в этом курсе, для Microsoft HoloLens. По мере прохождения курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки HoloLens. При использовании HoloLens вы можете заметить некоторое эхо во время захвата голоса.
Предварительные требования
Примечание
Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Кроме того, имейте в виду, что предварительные требования и письменные инструкции в этом документе представляют то, что было протестировано и проверено на момент написания статьи (май 2018 г.). Вы можете использовать последнюю версию программного обеспечения, как указано в статье установка инструментов , хотя не следует предполагать, что информация в этом курсе будет полностью соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.
Для этого курса мы рекомендуем использовать следующее оборудование и программное обеспечение:
- Компьютер разработки, совместимый с Windows Mixed Reality для разработки иммерсивной гарнитуры (VR)
- Windows 10 Fall Creators Update (или более поздней версии) с включенным режимом разработчика
- Последняя версия пакета SDK для Windows 10
- Unity 2017.4
- Visual Studio 2017
- Windows Mixed Reality иммерсивная гарнитура (VR) или Microsoft HoloLens с включенным режимом разработчика
- Набор наушников со встроенным микрофоном (если гарнитура не имеет встроенного микрофона и динамиков);
- Доступ к Интернету для получения сведений о настройке и переводе Azure
Перед началом работы
Чтобы избежать проблем со сборкой этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).
Код, приведенный в этом руководстве, позволяет выполнять запись с микрофона по умолчанию, подключенного к компьютеру. Убедитесь, что для микрофона по умолчанию задано устройство, которое вы планируете использовать для записи голоса.
Чтобы разрешить компьютеру включить диктовку, перейдите в раздел Параметры > Конфиденциальность > Речь, рукописный ввод & ввода и нажмите кнопку Включить службы распознавания речи и вводить предложения.
Если вы используете микрофон и наушники, подключенные к гарнитуре (или встроенные к ней), убедитесь, что параметр "Когда я ношу гарнитуру, переключаться на микрофон гарнитуры" включен в разделе Параметры Звук > и речь смешанной реальности>.
Предупреждение
Имейте в виду, что при разработке иммерсивной гарнитуры для этого задания могут возникнуть проблемы с устройством вывода звука. Это связано с проблемой с Unity, которая исправлена в более поздних версиях Unity (Unity 2018.2). Эта проблема не позволяет Unity изменить устройство вывода звука по умолчанию во время выполнения. В качестве обходного решения убедитесь, что вы выполнили описанные выше действия, а затем закройте и снова откройте редактор, когда эта проблема появится.
Глава 1. Портал Azure
Чтобы использовать API Azure Translator, необходимо настроить экземпляр службы, чтобы сделать его доступным для приложения.
Войдите на портал Azure.
Примечание
Если у вас еще нет учетной записи Azure, ее необходимо создать. Если вы выполняете это руководство в учебной или лабораторной ситуации, обратитесь к преподавателю или одному из прокторов за помощью в настройке новой учетной записи.
После входа щелкните Создать в левом верхнем углу и выполните поиск по запросу "API перевода текстов". Нажмите клавишу ВВОД.
Примечание
На более новых порталах слово "Создать " может быть заменено на "Создать ресурс".
На новой странице будет представлено описание службы API перевода текстов . В левом нижнем углу этой страницы нажмите кнопку Создать , чтобы создать связь с этой службой.
После нажатия кнопки Создать:
Вставьте нужное имя для этого экземпляра службы.
Выберите соответствующую подписку.
Выберите подходящую ценовую категорию . Если вы создаете службу перевода текстов впервые, вам должен быть доступен уровень "Бесплатный" (F0).
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, контроля доступа, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется сохранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.
Дополнительные сведения о группах ресурсов Azure см. в этой статье.
Определите расположение для группы ресурсов (если вы создаете новую группу ресурсов). Расположение в идеале должно находиться в регионе, где будет выполняться приложение. Некоторые ресурсы Azure доступны только в определенных регионах.
Вам также потребуется подтвердить, что вы понимаете условия, применяемые к этой Службе.
Нажмите кнопку создания.
После нажатия кнопки Создать вам придется подождать, пока служба будет создана. Это может занять минуту.
После создания экземпляра службы на портале появится уведомление.
Щелкните уведомление, чтобы просмотреть новый экземпляр службы.
Нажмите кнопку Перейти к ресурсу в уведомлении, чтобы просмотреть новый экземпляр службы. Вы перейдете к новому экземпляру службы API перевода текстов.
В рамках этого руководства приложению потребуется выполнить вызовы к службе, что выполняется с помощью ключа подписки службы.
На странице Быстрого запуска службы перевода текстов перейдите к первому шагу Захватить ключи и щелкните Ключи (для этого также можно щелкнуть синюю гиперссылку Ключи, расположенную в меню навигации Службы, обозначенную значком ключа). При этом откроются ключи службы.
Создайте копию одного из отображаемых ключей, так как она понадобится вам позже в проекте.
Глава 2. Настройка проекта Unity
Настройте и протестируйте иммерсивную гарнитуру смешанной реальности.
Примечание
Для этого курса вам не потребуются контроллеры движения. Если вам нужна поддержка по настройке иммерсивной гарнитуры, выполните следующие действия.
Ниже приведена типичная настройка для разработки со смешанной реальностью и, таким образом, хороший шаблон для других проектов.
Откройте Unity и нажмите кнопку Создать.
Теперь необходимо указать имя проекта Unity. Вставка MR_Translation. Убедитесь, что для типа проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.
При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение > параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .
Затем перейдите в раздел Параметры сборки файла > и переключите платформу на универсальная платформа Windows, нажав кнопку Переключить платформу.
Перейдите в раздел Параметры сборки файла > и убедитесь, что:
Для параметра Целевое устройство задано значение Любое устройство.
Для Microsoft HoloLens задайте для параметра Целевое устройствозначение HoloLens.
Для параметра Тип сборки задано значение D3D.
Для пакета SDK задано значение Последняя установленная
Для версии Visual Studio задано значение Последняя установленная версия
Для сборки и запуска задано значение Локальный компьютер.
Сохраните сцену и добавьте ее в сборку.
Для этого выберите Добавить открытые сцены. Появится окно сохранения.
Создайте новую папку для этой и любой будущей сцены, а затем нажмите кнопку Создать папку , чтобы создать новую папку, назовите ее Scenes.
Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла введите MR_TranslationScene, а затем нажмите кнопку Сохранить.
Имейте в виду, что сцены Unity необходимо сохранить в папке Assets , так как они должны быть связаны с проектом Unity. Создание папки scenes (и других аналогичных папок) — типичный способ структурирования проекта Unity.
Оставшиеся параметры в разделе Параметры сборки на данный момент следует оставить по умолчанию.
В окне Параметры сборки нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .
На этой панели необходимо проверить несколько параметров:
На вкладке Другие параметры :
Версия среды выполнения сценариев должна быть стабильной (эквивалентная .NET 3.5).
Серверная часть сценариев должна быть .NET
Уровень совместимости API должен быть .NET 4.6
На вкладке Параметры публикации в разделе Возможности проверка:
InternetClient;
Микрофон
Далее вниз по панели в разделе XR Settings (см. раздел Параметры публикации) установите флажок Virtual Reality Supported (Поддерживается виртуальная реальность) и убедитесь, что пакет SDK для Windows Mixed Reality добавлен.
Вернувшись в параметры сборки, проекты Unity C# больше не выделены серым цветом; Установите флажок рядом с этим.
Закройте окно Build Settings (Параметры сборки).
Сохраните сцену и проект (ФАЙЛ > СОХРАНИТЬ СЦЕНУ или ФАЙЛ > СОХРАНИТЬ ПРОЕКТ).
Глава 3. Настройка основной камеры
Важно!
Если вы хотите пропустить компонент Unity Set up этого курса и перейти непосредственно к коду, скачайте этот пакет .unitypackage, импортируйте его в проект в качестве пользовательского пакета, а затем перейдите к главе 5. Вам по-прежнему потребуется создать проект Unity.
На панели иерархии вы найдете объект с именем Main Camera. Этот объект представляет вашу "головную" точку зрения, как только вы окажетесь "внутри" приложения.
На панели мониторинга Unity выберите GameObject основной камеры. Вы заметите, что панель инспектора (обычно находится справа на панели мониторинга) будет отображать различные компоненты этого GameObject с преобразованием в верхней части, за которым следуют камера и некоторые другие компоненты. Вам потребуется сбросить преобразование основной камеры, чтобы она правильно располагалась.
Для этого щелкните значок Шестеренки рядом с компонентом Преобразование камеры и нажмите кнопку Сбросить.
Затем компонент Transform должен выглядеть следующим образом:
Для свойства Position задано значение 0, 0, 0.
Для поворота задано значение 0, 0, 0.
А для масштабирования задано значение 1, 1, 1
Затем, выбрав объект Главная камера , см. кнопку Добавить компонент в нижней части панели инспектора.
Нажмите кнопку и найдите (введите источник звука в поле поиска или перейдя по разделам) для компонента с именем Источник звука , как показано ниже, и выберите его (нажмите клавишу ВВОД).
Компонент "Источник звука " будет добавлен в основную камеру, как показано ниже.
Примечание
Для Microsoft HoloLens необходимо также изменить следующие параметры, которые являются частью компонента Камера на главной камере:
- Очистить флаги: Сплошной цвет.
- Фон "Черный, Альфа 0" — шестнадцатеричный цвет: #00000000.
Глава 4. Настройка холста отладки
Чтобы отобразить входные и выходные данные перевода, необходимо создать базовый пользовательский интерфейс. В рамках этого курса вы создадите объект canvas UI с несколькими объектами Text для отображения данных.
Щелкните правой кнопкой мыши пустую область панели иерархии, в разделе Пользовательский интерфейс добавьте холст.
Выбрав объект Canvas, на панели инспектора (в компоненте Canvas) измените режим отрисовки на World Space.
Затем измените следующие параметры в преобразовании rect панели инспектора:
POS - X 0 Y 0 Z 40
Ширина — 500
Высота - 300
Масштаб - X 0.13 Y 0.13 Z 0.13
Щелкните правой кнопкой мыши холст на панели иерархии в разделе Пользовательский интерфейс и добавьте панель. Эта панель предоставит фон для текста, который будет отображаться в сцене.
Щелкните правой кнопкой мыши панель на панели иерархии в разделе Пользовательский интерфейс и добавьте объект Text. Повторяйте тот же процесс, пока не создадим в общей сложности четыре объекта текста пользовательского интерфейса (подсказка: если выбран первый объект Text, можно просто нажать клавиши CTRL+ D, чтобы дублировать его, пока не будет четыре).
Для каждого текстового объекта выберите его и используйте приведенные ниже таблицы, чтобы задать параметры на панели инспектора.
Для компонента Rect Transform :
Имя Преобразование — положение Ширина Высота: MicrophoneStatusLabel X -80 Y 90 Z 0 300 30 AzureResponseLabel X -80 Y 30 Z 0 300 30 DictationLabel X -80 Y -30 Z 0 300 30 TranslationResultLabel X -80 Y -90 Z 0 300 30 Для компонента Текст (скрипт) выполните следующие действия:
Имя текст Размер шрифта MicrophoneStatusLabel Состояние микрофона: 20 AzureResponseLabel Веб-ответ Azure 20 DictationLabel Вы только что сказали: 20 TranslationResultLabel Перевод: 20 Кроме того, сделайте стиль шрифта полужирным. Это упростит чтение текста.
Для каждого объекта пользовательского интерфейса Text, созданного в главе 5, создайте новый дочернийобъект text пользовательского интерфейса. Эти дочерние элементы будут отображать выходные данные приложения. Создайте дочерние объекты, щелкнув правой кнопкой мыши нужный родительский объект (например, MicrophoneStatusLabel), а затем выберите пользовательский интерфейси текст.
Для каждого из этих дочерних элементов выберите его и используйте приведенные ниже таблицы, чтобы задать параметры на панели инспектора.
Для компонента Rect Transform :
Имя Преобразование — положение Ширина Высота: MicrophoneStatusText X 0 Y -30 Z 0 300 30 AzureResponseText X 0 Y -30 Z 0 300 30 DictationText X 0 Y -30 Z 0 300 30 TranslationResultText X 0 Y -30 Z 0 300 30 Для компонента Текст (скрипт) выполните следующие действия:
Имя текст Размер шрифта MicrophoneStatusText ?? 20 AzureResponseText ?? 20 DictationText ?? 20 TranslationResultText ?? 20
Затем выберите параметр выравнивания по центру для каждого текстового компонента:
Чтобы дочерние текстовые объекты пользовательского интерфейса были легко читаемыми, измените их цвет. Для этого щелкните панель (в настоящее время "Черный") рядом с полем Цвет.
Затем в новом маленьком окне Цвет измените шестнадцатеричный цвет на 0032EAFF.
Ниже показано, как должен выглядеть пользовательский интерфейс .
На панели Иерархия:
В представлениисцены и игры:
Глава 5. Создание класса Results
Первый скрипт, который необходимо создать, — это класс Results , который отвечает за предоставление способа просмотра результатов перевода. Класс хранит и отображает следующие данные:
- Результат ответа из Azure.
- Состояние микрофона.
- Результат диктовки (преобразование голоса в текст).
- Результат перевода.
Чтобы создать этот класс, выполните указанные ниже действия.
Щелкните правой кнопкой мыши панель проекта и выберите Создать > папку. Назовите папку Scripts.
Дважды щелкните папку Scripts , чтобы открыть ее. Затем в этой папке щелкните правой кнопкой мыши и выберите Создать > , а затем скрипт C#. Присвойте скрипту имя Results.
Дважды щелкните новый скрипт результатов , чтобы открыть его в Visual Studio.
Вставьте следующие пространства имен:
using UnityEngine; using UnityEngine.UI;
В класс вставьте следующие переменные:
public static Results instance; [HideInInspector] public string azureResponseCode; [HideInInspector] public string translationResult; [HideInInspector] public string dictationResult; [HideInInspector] public string micStatus; public Text microphoneStatusText; public Text azureResponseText; public Text dictationText; public Text translationResultText;
Затем добавьте метод Awake(), который будет вызываться при инициализации класса.
private void Awake() { // Set this class to behave similar to singleton instance = this; }
Наконец, добавьте методы, отвечающие за вывод различных сведений о результатах в пользовательский интерфейс.
/// <summary> /// Stores the Azure response value in the static instance of Result class. /// </summary> public void SetAzureResponse(string result) { azureResponseCode = result; azureResponseText.text = azureResponseCode; } /// <summary> /// Stores the translated result from dictation in the static instance of Result class. /// </summary> public void SetDictationResult(string result) { dictationResult = result; dictationText.text = dictationResult; } /// <summary> /// Stores the translated result from Azure Service in the static instance of Result class. /// </summary> public void SetTranslatedResult(string result) { translationResult = result; translationResultText.text = translationResult; } /// <summary> /// Stores the status of the Microphone in the static instance of Result class. /// </summary> public void SetMicrophoneStatus(string result) { micStatus = result; microphoneStatusText.text = micStatus; }
Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.
Глава 6. Создание класса MicrophoneManager
Второй класс, который вы собираетесь создать, — Это MicrophoneManager.
Этот класс отвечает за:
- Обнаружение записывающего устройства, подключенного к гарнитуре или компьютеру (в зависимости от того, какое устройство используется по умолчанию).
- Запишите звук (голос) и используйте диктовку, чтобы сохранить его в виде строки.
- После приостановки голоса отправьте диктовку в класс Переводчика.
- Разместите метод, который при необходимости может остановить захват голоса.
Чтобы создать этот класс, выполните указанные ниже действия.
Дважды щелкните папку Скрипты , чтобы открыть ее.
Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать > скрипт C#. Присвойте скрипту имя MicrophoneManager.
Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.
Обновите пространства имен, чтобы они совпадали со следующими значениями в верхней части класса MicrophoneManager :
using UnityEngine; using UnityEngine.Windows.Speech;
Затем добавьте следующие переменные в класс MicrophoneManager :
// Help to access instance of this object public static MicrophoneManager instance; // AudioSource component, provides access to mic private AudioSource audioSource; // Flag indicating mic detection private bool microphoneDetected; // Component converting speech to text private DictationRecognizer dictationRecognizer;
Теперь необходимо добавить код для методов Awake() и Start(). Они будут вызываться при инициализации класса:
private void Awake() { // Set this class to behave similar to singleton instance = this; } void Start() { //Use Unity Microphone class to detect devices and setup AudioSource if(Microphone.devices.Length > 0) { Results.instance.SetMicrophoneStatus("Initialising..."); audioSource = GetComponent<AudioSource>(); microphoneDetected = true; } else { Results.instance.SetMicrophoneStatus("No Microphone detected"); } }
Метод Update() можно удалить, так как этот класс не будет использовать его.
Теперь вам нужны методы, которые приложение использует для запуска и остановки голосового захвата и передачи его в класс Translator , который вы создадите в ближайшее время. Скопируйте приведенный ниже код и вставьте его под методом Start().
/// <summary> /// Start microphone capture. Debugging message is delivered to the Results class. /// </summary> public void StartCapturingAudio() { if(microphoneDetected) { // Start dictation dictationRecognizer = new DictationRecognizer(); dictationRecognizer.DictationResult += DictationRecognizer_DictationResult; dictationRecognizer.Start(); // Update UI with mic status Results.instance.SetMicrophoneStatus("Capturing..."); } } /// <summary> /// Stop microphone capture. Debugging message is delivered to the Results class. /// </summary> public void StopCapturingAudio() { Results.instance.SetMicrophoneStatus("Mic sleeping"); Microphone.End(null); dictationRecognizer.DictationResult -= DictationRecognizer_DictationResult; dictationRecognizer.Dispose(); }
Совет
Хотя это приложение не будет использовать его, здесь также предоставляется метод StopCapturingAudio(), если вы хотите реализовать возможность прекращения записи звука в приложении.
Теперь необходимо добавить обработчик диктовки, который будет вызываться при остановке голоса. Затем этот метод передает диктовку текста в класс Translator .
/// <summary> /// This handler is called every time the Dictation detects a pause in the speech. /// Debugging message is delivered to the Results class. /// </summary> private void DictationRecognizer_DictationResult(string text, ConfidenceLevel confidence) { // Update UI with dictation captured Results.instance.SetDictationResult(text); // Start the coroutine that process the dictation through Azure StartCoroutine(Translator.instance.TranslateWithUnityNetworking(text)); }
Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.
Предупреждение
На этом этапе на панели консоли редактора Unity появится ошибка ("Имя Переводчика не существует..."). Это связано с тем, что код ссылается на класс Translator , который вы создадите в следующей главе.
Глава 7. Вызов Azure и служба переводчика
Последний скрипт, который необходимо создать, — это класс Translator .
Этот класс отвечает за:
- Проверка подлинности приложения с помощью Azure в обмен на маркер проверки подлинности.
- Используйте маркер проверки подлинности для отправки текста (полученного из класса MicrophoneManager ) для перевода.
- Получите переведенный результат и передайте его в класс results для визуализации в пользовательском интерфейсе.
Чтобы создать этот класс, выполните указанные ниже действия.
Перейдите в папку Скрипты, созданную ранее.
Щелкните правой кнопкой мыши на панели проекта, создайте > скрипт C#. Вызовите переводчик скриптов.
Дважды щелкните новый скрипт Переводчика , чтобы открыть его в Visual Studio.
Добавьте следующие пространства имен в начало файла:
using System; using System.Collections; using System.Xml.Linq; using UnityEngine; using UnityEngine.Networking;
Затем добавьте следующие переменные в класс Translator :
public static Translator instance; private string translationTokenEndpoint = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken"; private string translationTextEndpoint = "https://api.microsofttranslator.com/v2/http.svc/Translate?"; private const string ocpApimSubscriptionKeyHeader = "Ocp-Apim-Subscription-Key"; //Substitute the value of authorizationKey with your own Key private const string authorizationKey = "-InsertYourAuthKeyHere-"; private string authorizationToken; // languages set below are: // English // French // Italian // Japanese // Korean public enum Languages { en, fr, it, ja, ko }; public Languages from = Languages.en; public Languages to = Languages.it;
Примечание
- Языки, вставленные в перечисление языков, являются лишь примерами. При желании вы можете добавить больше; API поддерживает более 60 языков (включая клингон)!
- Существует более интерактивная страница, охватывающая доступные языки, хотя имейте в виду, что страница работает только в том случае, если для сайта задано значение "" (и сайт Майкрософт, скорее всего, перенаправит на ваш родной язык). Вы можете изменить язык сайта в нижней части страницы или путем изменения URL-адреса.
- Значение authorizationKey в приведенном выше фрагменте кода должно быть ключом , полученным при подписке на API перевода текстов Azure. Это было описано в главе 1.
Теперь необходимо добавить код для методов Awake() и Start().
В этом случае код выполнит вызов в Azure с помощью ключа авторизации, чтобы получить маркер.
private void Awake() { // Set this class to behave similar to singleton instance = this; } // Use this for initialization void Start() { // When the application starts, request an auth token StartCoroutine("GetTokenCoroutine", authorizationKey); }
Примечание
Срок действия маркера истекает через 10 минут. В зависимости от сценария для приложения может потребоваться выполнить один и тот же вызов сопрограммы несколько раз.
Ниже приведена сопрограмма для получения маркера.
/// <summary> /// Request a Token from Azure Translation Service by providing the access key. /// Debugging result is delivered to the Results class. /// </summary> private IEnumerator GetTokenCoroutine(string key) { if (string.IsNullOrEmpty(key)) { throw new InvalidOperationException("Authorization key not set."); } using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(translationTokenEndpoint, string.Empty)) { unityWebRequest.SetRequestHeader("Ocp-Apim-Subscription-Key", key); yield return unityWebRequest.SendWebRequest(); long responseCode = unityWebRequest.responseCode; // Update the UI with the response code Results.instance.SetAzureResponse(responseCode.ToString()); if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) { Results.instance.azureResponseText.text = unityWebRequest.error; yield return null; } else { authorizationToken = unityWebRequest.downloadHandler.text; } } // After receiving the token, begin capturing Audio with the MicrophoneManager Class MicrophoneManager.instance.StartCapturingAudio(); }
Предупреждение
При изменении имени метода IEnumerator GetTokenCoroutine() необходимо обновить значения строки вызова StartCoroutine и StopCoroutine в приведенном выше коде. Согласно документации по Unity, чтобы остановить определенную сопрограмму, необходимо использовать метод строкового значения.
Затем добавьте сопрограмму (с методом потока поддержки прямо под ней), чтобы получить перевод текста, полученного классом MicrophoneManager . Этот код создает строку запроса для отправки в API перевода текстов Azure, а затем использует внутренний класс Unity UnityWebRequest, чтобы выполнить вызов Get к конечной точке со строкой запроса. Затем результат используется для задания перевода в объекте Results. В приведенном ниже коде показана реализация:
/// <summary> /// Request a translation from Azure Translation Service by providing a string. /// Debugging result is delivered to the Results class. /// </summary> public IEnumerator TranslateWithUnityNetworking(string text) { // This query string will contain the parameters for the translation string queryString = string.Concat("text=", Uri.EscapeDataString(text), "&from=", from, "&to=", to); using (UnityWebRequest unityWebRequest = UnityWebRequest.Get(translationTextEndpoint + queryString)) { unityWebRequest.SetRequestHeader("Authorization", "Bearer " + authorizationToken); unityWebRequest.SetRequestHeader("Accept", "application/xml"); yield return unityWebRequest.SendWebRequest(); if (unityWebRequest.isNetworkError || unityWebRequest.isHttpError) { Debug.Log(unityWebRequest.error); yield return null; } // Parse out the response text from the returned Xml string result = XElement.Parse(unityWebRequest.downloadHandler.text).Value; Results.instance.SetTranslatedResult(result); } }
Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.
Глава 8. Настройка сцены Unity
Вернитесь в редактор Unity и перетащите класс Resultsиз папки Scripts в объект Main Camera на панели иерархии.
Щелкните основную камеру и перейдите на панель инспектора. Вы заметите, что в добавленном компоненте скрипта есть четыре поля с пустыми значениями. Это выходные ссылки на свойства в коде.
Перетащите соответствующие объекты Text с панели иерархии в эти четыре слота, как показано на рисунке ниже.
Затем щелкните и перетащите класс Translator из папки Scripts в объект Main Camera на панели иерархии.
Затем щелкните и перетащите класс MicrophoneManager из папки Scripts в объект Main Camera на панели иерархии.
Наконец, щелкните основную камеру и посмотрите на панель инспектора. Вы заметите, что в перетаскиваемом скрипте есть два раскрывающихся списка, которые позволяют задать языки.
Глава 9. Тестирование в смешанной реальности
На этом этапе необходимо проверить, правильно ли реализована сцена.
Убедитесь в следующем:
- Все параметры, упомянутые в главе 1 , заданы правильно.
- Скрипты Results, Translator и MicrophoneManager присоединяются к объекту Main Camera.
- Вы поместили ключ службы API перевода текстов Azure в переменную authorizationKey в скрипте переводчика.
- Все поля на панели инспектора основной камеры назначены правильно.
- Микрофон работает при запуске сцены (если нет, проверка, что подключенный микрофон является устройством по умолчанию и что вы правильно настроили его в Windows).
Вы можете протестировать иммерсивную гарнитуру, нажав кнопку Воспроизвести в редакторе Unity. Приложение должно работать через подключенную иммерсивную гарнитуру.
Предупреждение
Если в консоли Unity отображается ошибка об изменении звукового устройства по умолчанию, сцена может работать неправильно. Это связано с тем, как портал смешанной реальности работает со встроенными микрофонами для гарнитур, на которых они есть. Если вы видите эту ошибку, просто остановите сцену и запустите ее снова, и все должно работать должным образом.
Глава 10. Создание решения UWP и загрузка неопубликованных приложений на локальном компьютере
Все необходимое для раздела Unity этого проекта завершено, поэтому пришло время создать его из Unity.
Перейдите в раздел Параметры сборки: Параметры сборки файла > ...
В окне Параметры сборки щелкните Сборка.
Если это еще не сделано, установите флажок Проекты C# для Unity.
Щелкните Построить. Unity запустит окно проводник, в котором необходимо создать, а затем выбрать папку для сборки приложения. Создайте папку и присвойте ей имя App. Затем, выбрав папку приложения , нажмите кнопку Выбрать папку.
Unity начнет сборку проекта в папку App .
После завершения сборки Unity (это может занять некоторое время), откроется окно проводник в расположении сборки (проверка панели задач, так как она может не всегда отображаться над окнами, но уведомит вас о добавлении нового окна).
Глава 11. Развертывание приложения
Чтобы развернуть приложение, выполните приведенные далее действия.
Перейдите к новой сборке Unity (папке App ) и откройте файл решения в Visual Studio.
В разделе Конфигурация решения выберите Отладка.
В окне Платформа решения выберите x86, Локальный компьютер.
Для Microsoft HoloLens может оказаться проще установить значение Удаленный компьютер, чтобы не привязаться к компьютеру. Однако вам также потребуется выполнить следующие действия.
- Узнайте IP-адрес holoLens, который можно найти в разделе Параметры > сети & Internet > Wi-Fi > Дополнительные параметры. IPv4 — это адрес, который следует использовать.
- Убедитесь, что режим разработчикавключен; находится в разделе Параметры Обновление > & безопасность > для разработчиков.
Перейдите в меню Сборка и щелкните Развернуть решение , чтобы загрузить неопубликованное приложение на компьютер.
Ваше приложение должно появиться в списке установленных приложений, готовых к запуску.
После запуска приложение предложит вам авторизовать доступ к микрофону. Не забудьте нажать кнопку ДА .
Теперь вы готовы приступить к переводу!
Готовое приложение API перевода текста
Поздравляем! Вы создали приложение смешанной реальности, которое использует API перевода текста Azure для преобразования речи в переведенный текст.
Дополнительные упражнения
Упражнение 1.
Можно ли добавить в приложение функцию преобразования текста в речь, чтобы возвращаемый текст был произнесен?
Упражнение 2
Позволяет пользователю изменять исходный и выходной языки ("с" и "на") в самом приложении, поэтому его не нужно перестраивать каждый раз, когда вы хотите изменить языки.