HoloLens (1-го поколения) и Azure 301: перевод языка


Примечание

Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет опубликована новая серия учебников, демонстрирующих разработку для HoloLens 2. В этом уведомлении будет добавлена ссылка на эти руководства при их публикации.


В этом курсе вы узнаете, как добавить возможности перевода в приложение смешанной реальности с помощью Azure Cognitive Services с помощью API перевода текстов.

Конечный продукт

API перевода текстов — это служба перевода, которая работает практически в режиме реального времени. Служба основана на облаке, и с помощью вызова REST API приложение может использовать технологию нейронного машинного перевода для перевода текста на другой язык. Дополнительные сведения см. на странице API перевода текстов Azure.

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

  1. Пользователь будет говорить на микрофон, подключенный к иммерсивной гарнитуре (VR) (или встроенному микрофону HoloLens).
  2. Приложение будет записывать диктовку и отправлять ее в API перевода текстов Azure.
  3. Результат перевода будет отображаться в простой группе пользовательского интерфейса в сцене Unity.

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

Поддержка устройств

Курс HoloLens Иммерсивные гарнитуры
301. Смешанная реальность и Azure: перевод с одного языка на другой ✔️ ✔️

Примечание

Хотя в этом курсе основное внимание уделяется Windows Mixed Reality иммерсивным гарнитурам ( VR), вы также можете применить то, что вы узнали в этом курсе, для Microsoft HoloLens. По мере прохождения курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки HoloLens. При использовании HoloLens вы можете заметить некоторое эхо во время захвата голоса.

Предварительные требования

Примечание

Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Кроме того, имейте в виду, что предварительные требования и письменные инструкции в этом документе представляют то, что было протестировано и проверено на момент написания статьи (май 2018 г.). Вы можете использовать последнюю версию программного обеспечения, как указано в статье установка инструментов , хотя не следует предполагать, что информация в этом курсе будет полностью соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.

Для этого курса мы рекомендуем использовать следующее оборудование и программное обеспечение:

Перед началом работы

  • Чтобы избежать проблем со сборкой этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).

  • Код, приведенный в этом руководстве, позволяет выполнять запись с микрофона по умолчанию, подключенного к компьютеру. Убедитесь, что для микрофона по умолчанию задано устройство, которое вы планируете использовать для записи голоса.

  • Чтобы разрешить компьютеру включить диктовку, перейдите в раздел Параметры > Конфиденциальность > Речь, рукописный ввод & ввода и нажмите кнопку Включить службы распознавания речи и вводить предложения.

  • Если вы используете микрофон и наушники, подключенные к гарнитуре (или встроенные к ней), убедитесь, что параметр "Когда я ношу гарнитуру, переключаться на микрофон гарнитуры" включен в разделе Параметры Звук > и речь смешанной реальности>.

    Параметры смешанной реальности

    Параметр микрофона

Предупреждение

Имейте в виду, что при разработке иммерсивной гарнитуры для этого задания могут возникнуть проблемы с устройством вывода звука. Это связано с проблемой с Unity, которая исправлена в более поздних версиях Unity (Unity 2018.2). Эта проблема не позволяет Unity изменить устройство вывода звука по умолчанию во время выполнения. В качестве обходного решения убедитесь, что вы выполнили описанные выше действия, а затем закройте и снова откройте редактор, когда эта проблема появится.

Глава 1. Портал Azure

Чтобы использовать API Azure Translator, необходимо настроить экземпляр службы, чтобы сделать его доступным для приложения.

  1. Войдите на портал Azure.

    Примечание

    Если у вас еще нет учетной записи Azure, ее необходимо создать. Если вы выполняете это руководство в учебной или лабораторной ситуации, обратитесь к преподавателю или одному из прокторов за помощью в настройке новой учетной записи.

  2. После входа щелкните Создать в левом верхнем углу и выполните поиск по запросу "API перевода текстов". Нажмите клавишу ВВОД.

    Новый ресурс

    Примечание

    На более новых порталах слово "Создать " может быть заменено на "Создать ресурс".

  3. На новой странице будет представлено описание службы API перевода текстов . В левом нижнем углу этой страницы нажмите кнопку Создать , чтобы создать связь с этой службой.

    Создание службы API перевода текстов

  4. После нажатия кнопки Создать:

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

    2. Выберите соответствующую подписку.

    3. Выберите подходящую ценовую категорию . Если вы создаете службу перевода текстов впервые, вам должен быть доступен уровень "Бесплатный" (F0).

    4. Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, контроля доступа, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется сохранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.

      Дополнительные сведения о группах ресурсов Azure см. в этой статье.

    5. Определите расположение для группы ресурсов (если вы создаете новую группу ресурсов). Расположение в идеале должно находиться в регионе, где будет выполняться приложение. Некоторые ресурсы Azure доступны только в определенных регионах.

    6. Вам также потребуется подтвердить, что вы понимаете условия, применяемые к этой Службе.

    7. Нажмите кнопку создания.

      Нажмите кнопку Создать.

  5. После нажатия кнопки Создать вам придется подождать, пока служба будет создана. Это может занять минуту.

  6. После создания экземпляра службы на портале появится уведомление.

    Уведомление о создании службы Azure

  7. Щелкните уведомление, чтобы просмотреть новый экземпляр службы.

    Перейдите во всплывающее окно ресурса.

  8. Нажмите кнопку Перейти к ресурсу в уведомлении, чтобы просмотреть новый экземпляр службы. Вы перейдете к новому экземпляру службы API перевода текстов.

    Страница службы API перевода текстов

  9. В рамках этого руководства приложению потребуется выполнить вызовы к службе, что выполняется с помощью ключа подписки службы.

  10. На странице Быстрого запуска службы перевода текстов перейдите к первому шагу Захватить ключи и щелкните Ключи (для этого также можно щелкнуть синюю гиперссылку Ключи, расположенную в меню навигации Службы, обозначенную значком ключа). При этом откроются ключи службы.

  11. Создайте копию одного из отображаемых ключей, так как она понадобится вам позже в проекте.

Глава 2. Настройка проекта Unity

Настройте и протестируйте иммерсивную гарнитуру смешанной реальности.

Примечание

Для этого курса вам не потребуются контроллеры движения. Если вам нужна поддержка по настройке иммерсивной гарнитуры, выполните следующие действия.

Ниже приведена типичная настройка для разработки со смешанной реальностью и, таким образом, хороший шаблон для других проектов.

  1. Откройте Unity и нажмите кнопку Создать.

    Запустите новый проект Unity.

  2. Теперь необходимо указать имя проекта Unity. Вставка MR_Translation. Убедитесь, что для типа проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.

    Укажите сведения о новом проекте Unity.

  3. При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение > параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .

    Обновление настроек редактора скриптов.

  4. Затем перейдите в раздел Параметры сборки файла > и переключите платформу на универсальная платформа Windows, нажав кнопку Переключить платформу.

    Окно параметров сборки, переключение платформы на UWP.

  5. Перейдите в раздел Параметры сборки файла > и убедитесь, что:

    1. Для параметра Целевое устройство задано значение Любое устройство.

      Для Microsoft HoloLens задайте для параметра Целевое устройствозначение HoloLens.

    2. Для параметра Тип сборки задано значение D3D.

    3. Для пакета SDK задано значение Последняя установленная

    4. Для версии Visual Studio задано значение Последняя установленная версия

    5. Для сборки и запуска задано значение Локальный компьютер.

    6. Сохраните сцену и добавьте ее в сборку.

      1. Для этого выберите Добавить открытые сцены. Появится окно сохранения.

        Нажмите кнопку

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

        Создание папки скриптов

      3. Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла введите MR_TranslationScene, а затем нажмите кнопку Сохранить.

        Присвойте новой сцене имя.

        Имейте в виду, что сцены Unity необходимо сохранить в папке Assets , так как они должны быть связаны с проектом Unity. Создание папки scenes (и других аналогичных папок) — типичный способ структурирования проекта Unity.

    7. Оставшиеся параметры в разделе Параметры сборки на данный момент следует оставить по умолчанию.

  6. В окне Параметры сборки нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .

    Откройте параметры проигрывателя.

  7. На этой панели необходимо проверить несколько параметров:

    1. На вкладке Другие параметры :

      1. Версия среды выполнения сценариев должна быть стабильной (эквивалентная .NET 3.5).

      2. Серверная часть сценариев должна быть .NET

      3. Уровень совместимости API должен быть .NET 4.6

        Обновите другие параметры.

    2. На вкладке Параметры публикации в разделе Возможности проверка:

      1. InternetClient;

      2. Микрофон

        Обновление параметров публикации.

    3. Далее вниз по панели в разделе XR Settings (см. раздел Параметры публикации) установите флажок Virtual Reality Supported (Поддерживается виртуальная реальность) и убедитесь, что пакет SDK для Windows Mixed Reality добавлен.

      Обновите параметры X R.

  8. Вернувшись в параметры сборки, проекты Unity C# больше не выделены серым цветом; Установите флажок рядом с этим.

  9. Закройте окно Build Settings (Параметры сборки).

  10. Сохраните сцену и проект (ФАЙЛ > СОХРАНИТЬ СЦЕНУ или ФАЙЛ > СОХРАНИТЬ ПРОЕКТ).

Глава 3. Настройка основной камеры

Важно!

Если вы хотите пропустить компонент Unity Set up этого курса и перейти непосредственно к коду, скачайте этот пакет .unitypackage, импортируйте его в проект в качестве пользовательского пакета, а затем перейдите к главе 5. Вам по-прежнему потребуется создать проект Unity.

  1. На панели иерархии вы найдете объект с именем Main Camera. Этот объект представляет вашу "головную" точку зрения, как только вы окажетесь "внутри" приложения.

  2. На панели мониторинга Unity выберите GameObject основной камеры. Вы заметите, что панель инспектора (обычно находится справа на панели мониторинга) будет отображать различные компоненты этого GameObject с преобразованием в верхней части, за которым следуют камера и некоторые другие компоненты. Вам потребуется сбросить преобразование основной камеры, чтобы она правильно располагалась.

  3. Для этого щелкните значок Шестеренки рядом с компонентом Преобразование камеры и нажмите кнопку Сбросить.

    Сброс преобразования основной камеры.

  4. Затем компонент Transform должен выглядеть следующим образом:

    1. Для свойства Position задано значение 0, 0, 0.

    2. Для поворота задано значение 0, 0, 0.

    3. А для масштабирования задано значение 1, 1, 1

      Сведения о преобразовании для камеры

  5. Затем, выбрав объект Главная камера , см. кнопку Добавить компонент в нижней части панели инспектора.

  6. Нажмите кнопку и найдите (введите источник звука в поле поиска или перейдя по разделам) для компонента с именем Источник звука , как показано ниже, и выберите его (нажмите клавишу ВВОД).

  7. Компонент "Источник звука " будет добавлен в основную камеру, как показано ниже.

    Добавьте компонент

    Примечание

    Для Microsoft HoloLens необходимо также изменить следующие параметры, которые являются частью компонента Камера на главной камере:

    • Очистить флаги: Сплошной цвет.
    • Фон "Черный, Альфа 0" — шестнадцатеричный цвет: #00000000.

Глава 4. Настройка холста отладки

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

  1. Щелкните правой кнопкой мыши пустую область панели иерархии, в разделе Пользовательский интерфейс добавьте холст.

    Добавьте новый объект пользовательского интерфейса Canvas.

  2. Выбрав объект Canvas, на панели инспектора (в компоненте Canvas) измените режим отрисовки на World Space.

  3. Затем измените следующие параметры в преобразовании rect панели инспектора:

    1. POS - X 0 Y 0 Z 40

    2. Ширина — 500

    3. Высота - 300

    4. Масштаб - X 0.13 Y 0.13 Z 0.13

      Обновите преобразование rect для холста.

  4. Щелкните правой кнопкой мыши холст на панели иерархии в разделе Пользовательский интерфейс и добавьте панель. Эта панель предоставит фон для текста, который будет отображаться в сцене.

  5. Щелкните правой кнопкой мыши панель на панели иерархии в разделе Пользовательский интерфейс и добавьте объект Text. Повторяйте тот же процесс, пока не создадим в общей сложности четыре объекта текста пользовательского интерфейса (подсказка: если выбран первый объект Text, можно просто нажать клавиши CTRL+ D, чтобы дублировать его, пока не будет четыре).

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

    1. Для компонента 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
    2. Для компонента Текст (скрипт) выполните следующие действия:

      Имя текст Размер шрифта
      MicrophoneStatusLabel Состояние микрофона: 20
      AzureResponseLabel Веб-ответ Azure 20
      DictationLabel Вы только что сказали: 20
      TranslationResultLabel Перевод: 20

      Введите соответствующие значения для меток пользовательского интерфейса.

    3. Кроме того, сделайте стиль шрифта полужирным. Это упростит чтение текста.

      Полужирный шрифт.

  7. Для каждого объекта пользовательского интерфейса Text, созданного в главе 5, создайте новый дочернийобъект text пользовательского интерфейса. Эти дочерние элементы будут отображать выходные данные приложения. Создайте дочерние объекты, щелкнув правой кнопкой мыши нужный родительский объект (например, MicrophoneStatusLabel), а затем выберите пользовательский интерфейси текст.

  8. Для каждого из этих дочерних элементов выберите его и используйте приведенные ниже таблицы, чтобы задать параметры на панели инспектора.

    1. Для компонента 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
    2. Для компонента Текст (скрипт) выполните следующие действия:

      Имя текст Размер шрифта
      MicrophoneStatusText ?? 20
      AzureResponseText ?? 20
      DictationText ?? 20
      TranslationResultText ?? 20
  9. Затем выберите параметр выравнивания по центру для каждого текстового компонента:

    выравнивание текста.

  10. Чтобы дочерние текстовые объекты пользовательского интерфейса были легко читаемыми, измените их цвет. Для этого щелкните панель (в настоящее время "Черный") рядом с полем Цвет.

    Введите соответствующие значения для текстовых выходных данных пользовательского интерфейса.

  11. Затем в новом маленьком окне Цвет измените шестнадцатеричный цвет на 0032EAFF.

    Измените цвет на синий.

  12. Ниже показано, как должен выглядеть пользовательский интерфейс .

    1. На панели Иерархия:

      Укажите иерархию в предоставленной структуре.

    2. В представлениисцены и игры:

      Представления сцены и игры имеют одинаковую структуру.

Глава 5. Создание класса Results

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

  • Результат ответа из Azure.
  • Состояние микрофона.
  • Результат диктовки (преобразование голоса в текст).
  • Результат перевода.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Щелкните правой кнопкой мыши панель проекта и выберите Создать > папку. Назовите папку Scripts.

    Создайте папку скриптов.

    Откройте папку scripts.

  2. Дважды щелкните папку Scripts , чтобы открыть ее. Затем в этой папке щелкните правой кнопкой мыши и выберите Создать > , а затем скрипт C#. Присвойте скрипту имя Results.

    Создайте первый скрипт.

  3. Дважды щелкните новый скрипт результатов , чтобы открыть его в Visual Studio.

  4. Вставьте следующие пространства имен:

        using UnityEngine;
        using UnityEngine.UI;
    
  5. В класс вставьте следующие переменные:

        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;
    
  6. Затем добавьте метод Awake(), который будет вызываться при инициализации класса.

        private void Awake() 
        { 
            // Set this class to behave similar to singleton 
            instance = this;           
        } 
    
  7. Наконец, добавьте методы, отвечающие за вывод различных сведений о результатах в пользовательский интерфейс.

        /// <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;
        }
    
  8. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

Глава 6. Создание класса MicrophoneManager

Второй класс, который вы собираетесь создать, — Это MicrophoneManager.

Этот класс отвечает за:

  • Обнаружение записывающего устройства, подключенного к гарнитуре или компьютеру (в зависимости от того, какое устройство используется по умолчанию).
  • Запишите звук (голос) и используйте диктовку, чтобы сохранить его в виде строки.
  • После приостановки голоса отправьте диктовку в класс Переводчика.
  • Разместите метод, который при необходимости может остановить захват голоса.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Дважды щелкните папку Скрипты , чтобы открыть ее.

  2. Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать > скрипт C#. Присвойте скрипту имя MicrophoneManager.

  3. Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.

  4. Обновите пространства имен, чтобы они совпадали со следующими значениями в верхней части класса MicrophoneManager :

        using UnityEngine; 
        using UnityEngine.Windows.Speech;
    
  5. Затем добавьте следующие переменные в класс 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; 
    
  6. Теперь необходимо добавить код для методов 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"); 
            } 
        } 
    
  7. Метод Update() можно удалить, так как этот класс не будет использовать его.

  8. Теперь вам нужны методы, которые приложение использует для запуска и остановки голосового захвата и передачи его в класс 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(), если вы хотите реализовать возможность прекращения записи звука в приложении.

  9. Теперь необходимо добавить обработчик диктовки, который будет вызываться при остановке голоса. Затем этот метод передает диктовку текста в класс 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));   
        }
    
  10. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

Предупреждение

На этом этапе на панели консоли редактора Unity появится ошибка ("Имя Переводчика не существует..."). Это связано с тем, что код ссылается на класс Translator , который вы создадите в следующей главе.

Глава 7. Вызов Azure и служба переводчика

Последний скрипт, который необходимо создать, — это класс Translator .

Этот класс отвечает за:

  • Проверка подлинности приложения с помощью Azure в обмен на маркер проверки подлинности.
  • Используйте маркер проверки подлинности для отправки текста (полученного из класса MicrophoneManager ) для перевода.
  • Получите переведенный результат и передайте его в класс results для визуализации в пользовательском интерфейсе.

Чтобы создать этот класс, выполните указанные ниже действия.

  1. Перейдите в папку Скрипты, созданную ранее.

  2. Щелкните правой кнопкой мыши на панели проекта, создайте > скрипт C#. Вызовите переводчик скриптов.

  3. Дважды щелкните новый скрипт Переводчика , чтобы открыть его в Visual Studio.

  4. Добавьте следующие пространства имен в начало файла:

        using System;
        using System.Collections;
        using System.Xml.Linq;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Затем добавьте следующие переменные в класс 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.
  6. Теперь необходимо добавить код для методов Awake() и Start().

  7. В этом случае код выполнит вызов в 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 минут. В зависимости от сценария для приложения может потребоваться выполнить один и тот же вызов сопрограммы несколько раз.

  8. Ниже приведена сопрограмма для получения маркера.

        /// <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, чтобы остановить определенную сопрограмму, необходимо использовать метод строкового значения.

  9. Затем добавьте сопрограмму (с методом потока поддержки прямо под ней), чтобы получить перевод текста, полученного классом 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);
            }
        }
    
  10. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

Глава 8. Настройка сцены Unity

  1. Вернитесь в редактор Unity и перетащите класс Resultsиз папки Scripts в объект Main Camera на панели иерархии.

  2. Щелкните основную камеру и перейдите на панель инспектора. Вы заметите, что в добавленном компоненте скрипта есть четыре поля с пустыми значениями. Это выходные ссылки на свойства в коде.

  3. Перетащите соответствующие объекты Text с панели иерархии в эти четыре слота, как показано на рисунке ниже.

    Обновление целевых ссылок с указанными значениями.

  4. Затем щелкните и перетащите класс Translator из папки Scripts в объект Main Camera на панели иерархии.

  5. Затем щелкните и перетащите класс MicrophoneManager из папки Scripts в объект Main Camera на панели иерархии.

  6. Наконец, щелкните основную камеру и посмотрите на панель инспектора. Вы заметите, что в перетаскиваемом скрипте есть два раскрывающихся списка, которые позволяют задать языки.

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

Глава 9. Тестирование в смешанной реальности

На этом этапе необходимо проверить, правильно ли реализована сцена.

Убедитесь в следующем:

  • Все параметры, упомянутые в главе 1 , заданы правильно.
  • Скрипты Results, Translator и MicrophoneManager присоединяются к объекту Main Camera.
  • Вы поместили ключ службы API перевода текстов Azure в переменную authorizationKey в скрипте переводчика.
  • Все поля на панели инспектора основной камеры назначены правильно.
  • Микрофон работает при запуске сцены (если нет, проверка, что подключенный микрофон является устройством по умолчанию и что вы правильно настроили его в Windows).

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

Предупреждение

Если в консоли Unity отображается ошибка об изменении звукового устройства по умолчанию, сцена может работать неправильно. Это связано с тем, как портал смешанной реальности работает со встроенными микрофонами для гарнитур, на которых они есть. Если вы видите эту ошибку, просто остановите сцену и запустите ее снова, и все должно работать должным образом.

Глава 10. Создание решения UWP и загрузка неопубликованных приложений на локальном компьютере

Все необходимое для раздела Unity этого проекта завершено, поэтому пришло время создать его из Unity.

  1. Перейдите в раздел Параметры сборки: Параметры сборки файла > ...

  2. В окне Параметры сборки щелкните Сборка.

    Создание сцены Unity.

  3. Если это еще не сделано, установите флажок Проекты C# для Unity.

  4. Щелкните Построить. Unity запустит окно проводник, в котором необходимо создать, а затем выбрать папку для сборки приложения. Создайте папку и присвойте ей имя App. Затем, выбрав папку приложения , нажмите кнопку Выбрать папку.

  5. Unity начнет сборку проекта в папку App .

  6. После завершения сборки Unity (это может занять некоторое время), откроется окно проводник в расположении сборки (проверка панели задач, так как она может не всегда отображаться над окнами, но уведомит вас о добавлении нового окна).

Глава 11. Развертывание приложения

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

  1. Перейдите к новой сборке Unity (папке App ) и откройте файл решения в Visual Studio.

  2. В разделе Конфигурация решения выберите Отладка.

  3. В окне Платформа решения выберите x86, Локальный компьютер.

    Для Microsoft HoloLens может оказаться проще установить значение Удаленный компьютер, чтобы не привязаться к компьютеру. Однако вам также потребуется выполнить следующие действия.

    • Узнайте IP-адрес holoLens, который можно найти в разделе Параметры > сети & Internet > Wi-Fi > Дополнительные параметры. IPv4 — это адрес, который следует использовать.
    • Убедитесь, что режим разработчикавключен; находится в разделе Параметры Обновление > & безопасность > для разработчиков.

    Разверните решение из Visual Studio.

  4. Перейдите в меню Сборка и щелкните Развернуть решение , чтобы загрузить неопубликованное приложение на компьютер.

  5. Ваше приложение должно появиться в списке установленных приложений, готовых к запуску.

  6. После запуска приложение предложит вам авторизовать доступ к микрофону. Не забудьте нажать кнопку ДА .

  7. Теперь вы готовы приступить к переводу!

Готовое приложение API перевода текста

Поздравляем! Вы создали приложение смешанной реальности, которое использует API перевода текста Azure для преобразования речи в переведенный текст.

Конечный продукт.

Дополнительные упражнения

Упражнение 1.

Можно ли добавить в приложение функцию преобразования текста в речь, чтобы возвращаемый текст был произнесен?

Упражнение 2

Позволяет пользователю изменять исходный и выходной языки ("с" и "на") в самом приложении, поэтому его не нужно перестраивать каждый раз, когда вы хотите изменить языки.