HoloLens(1세대) 및 Azure 301: 언어 번역


참고

Mixed Reality 아카데미 자습서는 HoloLens(1세대) 및 Mixed Reality 몰입형 헤드셋을 염두에 두고 설계되었습니다. 따라서 이러한 디바이스 개발에 대한 지침을 계속 찾고 있는 개발자를 위해 이러한 자습서를 그대로 두는 것이 중요합니다. 이러한 자습서는 HoloLens 2에 사용되는 최신 도구 집합 또는 상호 작용으로 업데이트되지 않습니다. 대신 지원되는 디바이스에서 계속 작동하도록 유지 관리됩니다. HoloLens 2 위해 개발하는 방법을 보여 줄 새로운 자습서 시리즈가 미래에 게시될 예정입니다. 이 알림은 해당 자습서가 게시될 때 해당 자습서에 대한 링크로 업데이트됩니다.


이 과정에서는 Translator Text API를 사용하여 Azure Cognitive Services를 사용하여 혼합 현실 애플리케이션에 번역 기능을 추가하는 방법을 알아봅니다.

최종 제품

Translator Text API는 거의 실시간으로 작동하는 번역 서비스입니다. 서비스는 클라우드 기반이며 REST API 호출을 사용하여 앱이 신경망 기계 번역 기술을 사용하여 텍스트를 다른 언어로 번역할 수 있습니다. 자세한 내용은 Azure Translator Text API 페이지를 참조하세요.

이 과정을 완료하면 다음을 수행할 수 있는 혼합 현실 애플리케이션이 제공됩니다.

  1. 사용자는 몰입형(VR) 헤드셋(또는 HoloLens의 기본 제공 마이크)에 연결된 마이크로 말합니다.
  2. 앱은 받아쓰기를 캡처하여 Azure Translator Text API로 보냅니다.
  3. 번역 결과는 Unity 장면의 간단한 UI 그룹에 표시됩니다.

이 과정에서는 Translator Service의 결과를 Unity 기반 샘플 애플리케이션으로 가져오는 방법을 설명합니다. 빌드할 수 있는 사용자 지정 애플리케이션에 이러한 개념을 적용하는 것은 사용자에게 달려 있습니다.

디바이스 지원

과정 HoloLens 몰입형 헤드셋
MR 및 Azure 301: 언어 번역 ✔️ ✔️

참고

이 과정은 주로 Windows Mixed Reality 몰입형(VR) 헤드셋에 중점을 두지만, 이 과정에서 배운 내용을 Microsoft HoloLens 적용할 수도 있습니다. 과정을 따라가면 HoloLens를 지원하기 위해 사용해야 할 수 있는 변경 내용에 대한 메모가 표시됩니다. HoloLens를 사용하는 경우 음성 캡처 중에 약간의 에코가 나타날 수 있습니다.

사전 요구 사항

참고

이 자습서는 Unity 및 C#에 대한 기본 경험이 있는 개발자를 위해 설계되었습니다. 또한 이 문서의 필수 구성 요소 및 서면 지침은 작성 당시 테스트 및 확인된 내용(2018년 5월)을 나타냅니다. 이 과정의 정보가 아래에 나열된 것보다 최신 소프트웨어에서 찾을 수 있는 내용과 완벽하게 일치한다고 가정해서는 안 되지만 도구 설치 문서에 나열된 대로 최신 소프트웨어를 자유롭게 사용할 수 있습니다.

이 과정에서는 다음 하드웨어 및 소프트웨어를 사용하는 것이 좋습니다.

시작하기 전에

  • 이 프로젝트를 빌드하는 데 문제가 발생하지 않도록 이 자습서에서 언급한 프로젝트를 루트 또는 루트에 가까운 폴더에 만드는 것이 좋습니다(긴 폴더 경로는 빌드 시 문제를 일으킬 수 있음).

  • 이 자습서의 코드를 사용하면 PC에 연결된 기본 마이크 디바이스에서 녹음할 수 있습니다. 기본 마이크 디바이스가 음성을 캡처하는 데 사용할 디바이스로 설정되어 있는지 확인합니다.

  • PC에서 받아쓰기를 사용하도록 허용하려면 설정 > 개인 정보 음성 > , 입력 & 입력으로 이동하여 음성 서비스 켜기 및 제안 입력 단추를 선택합니다.

  • 헤드셋에 연결된 마이크와 헤드폰을 사용하는 경우 설정 > 혼합 현실 > 오디오 및 음성에서 "헤드셋을 착용할 때 헤드셋 마이크로 전환" 옵션이 켜져 있는지 확인합니다.

    혼합 현실 설정

    마이크 설정

경고

이 랩의 몰입형 헤드셋을 개발하는 경우 오디오 출력 디바이스 문제가 발생할 수 있습니다. 이는 이후 버전의 Unity(Unity 2018.2)에서 해결된 Unity 관련 문제 때문입니다. 이 문제로 인해 Unity가 런타임에 기본 오디오 출력 디바이스를 변경할 수 없게 됩니다. 이 문제를 해결하려면 위의 단계를 완료하고 이 문제가 발생할 때 편집기를 닫고 다시 엽니다.

1장 - Azure Portal

Azure Translator API를 사용하려면 애플리케이션에서 사용할 수 있도록 서비스의 instance 구성해야 합니다.

  1. Azure Portal에 로그인합니다.

    참고

    Azure 계정이 아직 없는 경우 계정을 만들어야 합니다. 강의실 또는 랩 상황에서 이 자습서를 따르는 경우 강사 또는 감독자 중 한 명에게 새 계정 설정에 대한 도움을 요청하세요.

  2. 로그인한 후 왼쪽 위 모서리에서 새로 만들기를 클릭하고 "Translator Text API"를 검색합니다. Enter 키를 선택합니다.

    새 리소스

    참고

    New라는 단어가 최신 포털에서 리소스 만들기로 대체되었을 수 있습니다.

  3. 새 페이지에서는 Translator Text API Service에 대한 설명을 제공합니다. 이 페이지의 왼쪽 아래에서 만들기 단추를 선택하여 이 서비스와의 연결을 만듭니다.

    Translator Text API 서비스 만들기

  4. 만들기를 클릭한 후에는 다음을 수행합니다.

    1. 이 서비스 instance 원하는 이름을 삽입합니다.

    2. 적절한 구독을 선택합니다.

    3. Translator Text Service를 처음 만드는 경우 F0이라는 무료 계층을 사용할 수 있어야 하므로 적절한 가격 책정 계층을 선택합니다.

    4. 리소스 그룹을 선택하거나 새 그룹을 만듭니다. 리소스 그룹은 Azure 자산 컬렉션에 대한 액세스를 모니터링, 제어, 프로비전 및 관리하는 방법을 제공합니다. 단일 프로젝트(예: 이러한 랩)와 연결된 모든 Azure 서비스를 공통 리소스 그룹 아래에 유지하는 것이 좋습니다.

      Azure 리소스 그룹에 대해 자세히 알아보려면 리소스 그룹 문서를 방문하세요.

    5. 리소스 그룹의 위치를 결정합니다(새 리소스 그룹을 만드는 경우). 위치는 애플리케이션이 실행되는 지역에 있는 것이 가장 좋습니다. 일부 Azure 자산은 특정 지역에서만 사용할 수 있습니다.

    6. 또한 이 서비스에 적용된 사용 약관을 이해했음을 확인해야 합니다.

    7. 만들기를 선택합니다.

      만들기 단추를 선택합니다.

  5. 만들기를 클릭하면 서비스가 생성될 때까지 기다려야 합니다. 이 작업은 1분 정도 걸릴 수 있습니다.

  6. 서비스 instance 만들어지면 포털에 알림이 표시됩니다.

    Azure 서비스 만들기 알림

  7. 알림을 클릭하여 새 서비스 instance 탐색합니다.

    리소스 팝업으로 이동합니다.

  8. 알림에서 리소스로 이동 단추를 클릭하여 새 서비스 instance 탐색합니다. 새 Translator Text API Service instance 이동합니다.

    Translator Text API 서비스 페이지

  9. 이 자습서 내에서 애플리케이션은 서비스의 구독 키를 사용하여 수행되는 서비스를 호출해야 합니다.

  10. Translator Text Service의 빠른 시작 페이지에서 첫 번째 단계인 키 가져오기로 이동하고 키를 클릭합니다( 아이콘으로 표시된 서비스 탐색 메뉴에 있는 파란색 하이퍼링크 키를 클릭하여 이 작업을 수행할 수도 있음). 그러면 서비스 키가 표시됩니다.

  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 장면과 연결되어야 하므로 Unity 장면을 Assets 폴더 내에 저장해야 합니다. scenes 폴더(및 기타 유사한 폴더)를 만드는 것은 Unity 프로젝트를 구성하는 일반적인 방법입니다.

    7. 빌드 설정의 나머지 설정은 현재 기본값으로 남아 있어야 합니다.

  6. 빌드 설정 창에서 플레이어 설정 단추를 클릭하면 Inspector가 있는 공간에서 관련 패널이 열립니다.

    플레이어 설정을 엽니다.

  7. 이 패널에서 몇 가지 설정을 확인해야 합니다.

    1. 기타 설정 탭에서 다음을 수행합니다.

      1. 런타임 버전 스크립팅안정적 이어야 합니다(.NET 3.5 등가).

      2. 백 엔드 스크립팅.NET이어야 합니다.

      3. API 호환성 수준은.NET 4.6이어야 합니다.

        다른 설정을 업데이트합니다.

    2. 게시 설정 탭의 기능에서 다음을 검사.

      1. InternetClient

      2. 마이크

        게시 설정을 업데이트합니다.

    3. 패널 아래쪽의 XR 설정(게시 설정 아래에 있음)에서 Virtual Reality Supported를 체크하고 Windows Mixed Reality SDK가 추가되었는지 확인합니다.

      X R 설정을 업데이트합니다.

  8. 빌드 설정으로 돌아가면 Unity C# 프로젝트가 더 이상 회색으로 표시되지 않습니다. 이 옆에 있는 확인란을 선택합니다.

  9. 빌드 설정 창을 닫습니다.

  10. 장면 및 프로젝트를 저장합니다(파일 > 저장 장면/파일 > 저장 프로젝트).

챕터 3 - 기본 카메라 설정

중요

이 과정의 Unity 설정 구성 요소를 건너뛰고 코드를 계속 진행하려면 이 .unitypackage를 자유롭게 다운로드하고 프로젝트에 사용자 지정 패키지로 가져온 다음 5장에서 계속 진행하세요. 여전히 Unity 프로젝트를 만들어야 합니다.

  1. 계층 구조 패널에서 주 카메라라는 개체를 찾을 수 있습니다. 이 개체는 애플리케이션을 "내부"로 설정하면 "헤드" 관점을 나타냅니다.

  2. Unity 대시보드를 앞에 두고 주 카메라 GameObject를 선택합니다. 검사기 패널(일반적으로 대시보드 내에서 오른쪽에 표시됨)에는 해당 GameObject의 다양한 구성 요소가 표시되고, 위쪽에는 변환, 카메라 및 기타 구성 요소가 표시됩니다. 기본 카메라의 변환을 다시 설정해야 올바르게 배치됩니다.

  3. 이렇게 하려면 카메라의 변환 구성 요소 옆에 있는 기어 아이콘을 선택하고 다시 설정을 선택합니다.

    주 카메라 변환을 다시 설정합니다.

  4. 그런 다음 변환 구성 요소는 다음과 같이 표시됩니다.

    1. Position0, 0, 0으로 설정됩니다.

    2. 회전0, 0, 0으로 설정됩니다.

    3. 크기 조정1, 1, 1로 설정됩니다.

      카메라에 대한 정보 변환

  5. 다음으로 주 카메라 개체를 선택한 상태에서 검사기 패널 맨 아래에 있는 구성 요소 추가 단추를 참조하세요.

  6. 해당 단추를 선택하고 아래와 같이 오디오 원본 이라는 구성 요소에 대해 검색 필드에 오디오 원본을 입력하거나 섹션을 탐색하여 검색하고 선택합니다(Enter 키를 누르면 작동).

  7. 아래와 같이 오디오 원본 구성 요소가 주 카메라에 추가됩니다.

    오디오 원본 구성 요소를 추가합니다.

    참고

    Microsoft HoloLens 경우 기본 카메라카메라 구성 요소에 포함된 다음도 변경해야 합니다.

    • 플래그 지우기: 단색.
    • 배경 'Black, Alpha 0' – 16진수 색: #00000000.

4장 - 디버그 캔버스 설정

번역의 입력 및 출력을 표시하려면 기본 UI를 만들어야 합니다. 이 과정에서는 데이터를 표시하는 여러 'Text' 개체가 있는 Canvas UI 개체를 만듭니다.

  1. 계층 패널의 빈 영역을 마우스 오른쪽 단추로 클릭하고 UI 아래에서 캔버스를 추가합니다.

    새 Canvas UI 개체를 추가합니다.

  2. Canvas 개체를 선택한 상태에서 검사기 패널 ('Canvas' 구성 요소 내)에서 렌더링 모드월드 공간으로 변경합니다.

  3. 다음으로, 검사기 패널의 Rect Transform에서 다음 매개 변수를 변경합니다.

    1. Pos - X 0 Y 0 Z 40

    2. 너비 - 500

    3. 높이 - 300

    4. 규모 - X 0.13 Y 0.13 Z 0.13

      캔버스의 사각형 변환을 업데이트합니다.

  4. 계층 패널의 UI 아래에서 캔버스를 마우스 오른쪽 단추로 클릭하고 패널을 추가합니다. 이 패널은 장면에 표시할 텍스트에 대한 배경을 제공합니다.

  5. 계층 패널의 UI 아래에서 패널 마우스 오른쪽 단추로 클릭하고 Text 개체를 추가합니다. 총 4개의 UI Text 개체를 만들 때까지 동일한 프로세스를 반복합니다(힌트: 첫 번째 'Text' 개체를 선택한 경우 'Ctrl' + 'D'를 눌러 총 4개가 될 때까지 복제할 수 있습니다).

  6. Text 개체에 대해 해당 개체를 선택하고 아래 표를 사용하여 검사기 패널에서 매개 변수를 설정합니다.

    1. Rect Transform 구성 요소의 경우:

      Name 변환 - 위치 너비 높이
      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. 텍스트(스크립트) 구성 요소의 경우:

      Name 텍스트 글꼴 크기
      MicrophoneStatusLabel 마이크 상태: 20
      AzureResponseLabel Azure 웹 응답 20
      DictationLabel 당신은 방금 말했다 : 20
      TranslationResultLabel 변환: 20

      UI 레이블에 해당하는 값을 입력합니다.

    3. 또한 글꼴 스타일을 굵게 만듭니다. 이렇게 하면 텍스트를 더 쉽게 읽을 수 있습니다.

      굵은 글꼴입니다.

  7. 5장에서 만든 각 UI Text 개체에 대해 새 자식UI Text 개체를 만듭니다. 이러한 자식은 애플리케이션의 출력을 표시합니다. 원하는 부모(예: MicrophoneStatusLabel)를 마우스 오른쪽 단추로 클릭하여 자식 개체를 만든 다음 UI를 선택한 다음 텍스트를 선택합니다.

  8. 이러한 각 자식에 대해 이를 선택하고 아래 표를 사용하여 검사기 패널에서 매개 변수를 설정합니다.

    1. Rect Transform 구성 요소의 경우:

      Name 변환 - 위치 너비 높이
      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. 텍스트(스크립트) 구성 요소의 경우:

      Name 텍스트 글꼴 크기
      MicrophoneStatusText ?? 20
      AzureResponseText ?? 20
      DictationText ?? 20
      TranslationResultText ?? 20
  9. 다음으로 각 텍스트 구성 요소에 대해 '가운데' 맞춤 옵션을 선택합니다.

    텍스트를 정렬합니다.

  10. 자식 UI Text 개체를 쉽게 읽을 수 있도록 Color를 변경합니다. 색 옆에 있는 막대(현재 '검은색')를 클릭하여 이 작업을 수행 합니다.

    UI 텍스트 출력에 해당하는 값을 입력합니다.

  11. 그런 다음 새 작은 창에서 16진수 색0032EAFF로 변경합니다.

    색을 파란색으로 업데이트합니다.

  12. UI의 모양은 다음과 같습니다.

    1. 계층 패널에서 다음을 수행합니다.

      제공된 구조에 계층 구조가 있습니다.

    2. 장면 및 게임 보기에서 다음을 수행합니다.

      장면과 게임 보기를 동일한 구조로 갖습니다.

5장 - Results 클래스 만들기

만들어야 하는 첫 번째 스크립트는 번역 결과를 확인하는 방법을 제공하는 Results 클래스입니다. 클래스는 다음을 저장하고 표시합니다.

  • Azure의 응답 결과입니다.
  • 마이크가 상태.
  • 받아쓰기의 결과입니다(음성 텍스트 변환).
  • 번역의 결과입니다.

이 클래스를 만들려면 다음을 수행합니다.

  1. 프로젝트 패널을 마우스 오른쪽 단추로 클릭한 다음 폴더 만들기>를 클릭합니다. 폴더 이름을 Scripts로 지정합니다.

    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. 마지막으로 다양한 결과 정보를 UI에 출력하는 메서드를 추가합니다.

        /// <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입니다.

이 클래스는 다음을 담당합니다.

  • 헤드셋 또는 컴퓨터에 연결된 기록 디바이스 감지(기본값 중).
  • 오디오(음성)를 캡처하고 받아쓰기를 사용하여 문자열로 저장합니다.
  • 음성이 일시 중지되면 받아쓰기를 Translator 클래스에 제출합니다.
  • 원하는 경우 음성 캡처를 중지할 수 있는 메서드를 호스트합니다.

이 클래스를 만들려면 다음을 수행합니다.

  1. Scripts 폴더를 두 번 클릭하여 엽니다.

  2. Scripts 폴더 내부를 마우스 오른쪽 단추로 클릭하고 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'가 존재하지 않음..."). 코드가 다음 챕터에서 만들 Translator 클래스를 참조하기 때문입니다.

7장 - Azure 및 Translator 서비스 호출

만들어야 하는 마지막 스크립트는 Translator 클래스입니다.

이 클래스는 다음을 담당합니다.

  • 인증 토큰에 대한 대가로 Azure를 사용하여 앱을 인증합니다.
  • 인증 토큰을 사용하여 번역할 텍스트(MicrophoneManager 클래스에서 받은)를 제출합니다.
  • 번역된 결과를 수신하고 결과 클래스에 전달하여 UI에서 시각화합니다.

이 클래스를 만들려면 다음을 수행합니다.

  1. 이전에 만든 Scripts 폴더로 이동합니다.

  2. 프로젝트 패널, C# 스크립트 만들기>를 마우스 오른쪽 단추로 클릭합니다. 스크립트 Translator를 호출 합니다.

  3. Translator 스크립트를 두 번 클릭하여 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는 Klingon을 포함하여 60개 이상의 언어를 지원합니다 .
    • 사용 가능한 언어를 다루는 대화형 페이지가 있지만 사이트 언어가 ''로 설정된 경우에만 페이지가 작동하는 것처럼 보입니다(Microsoft 사이트는 모국어로 리디렉션될 수 있음). 페이지 아래쪽에서 또는 URL을 변경하여 사이트 언어를 변경할 수 있습니다.
    • 위의 코드 조각에서 authorizationKey 값은 Azure Translator Text API를 구독할 때 받은 여야 합니다. 이 내용은 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()의 이름을 편집하는 경우 위의 코드에서 StartCoroutineStopCoroutine 호출 문자열 값을 업데이트해야 합니다. Unity 설명서에 따라 특정 코루틴을 중지하려면 문자열 값 메서드를 사용해야 합니다.

  9. 다음으로 코루틴(바로 아래에 "지원" 스트림 메서드 포함)을 추가하여 MicrophoneManager 클래스에서 받은 텍스트의 번역을 가져옵니다. 이 코드는 Azure Translator Text API로 보낼 쿼리 문자열을 만든 다음, 내부 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 편집기로 돌아가서 Scripts 폴더 Results 클래스 클릭하고 계층 구조 패널주 카메라 개체로 끌어옵니다.

  2. 주 카메라를 클릭하고 검사기 패널을 확인합니다. 새로 추가된 스크립트 구성 요소 내에 빈 값이 있는 4개의 필드가 있음을 알 수 있습니다. 코드의 속성에 대한 출력 참조입니다.

  3. 아래 이미지와 같이 계층 패널에서 해당 4개의 슬롯으로 적절한 Text 개체를 끕니다.

    지정된 값으로 대상 참조를 업데이트합니다.

  4. 그런 다음 Translator 클래스를 클릭하여 Scripts 폴더에서 계층 패널의 Main Camera 개체로 끌어 옵니다.

  5. 그런 다음, Scripts 폴더에서 Hierarchy PanelMain Camera 개체로 MicrophoneManager 클래스를 클릭하고 끕니다.

  6. 마지막으로 주 카메라를 클릭하고 검사기 패널을 확인합니다. 끌어온 스크립트에는 언어를 설정할 수 있는 두 개의 드롭다운 상자가 있습니다.

    의도한 번역 언어가 입력인지 확인합니다.

9장 - 혼합 현실에서 테스트

이 시점에서 장면이 제대로 구현되었는지 테스트해야 합니다.

다음 사항을 확인합니다.

  • 1장에 언급된 모든 설정이 올바르게 설정됩니다.
  • Results, TranslatorMicrophoneManager 스크립트는 Main Camera 개체에 연결됩니다.
  • Translator 스크립트 내authorizationKey 변수 내에 Azure Translator Text API 서비스 키를 배치했습니다.
  • 주 카메라 검사기 패널의 모든 필드가 올바르게 할당됩니다.
  • 마이크는 장면을 실행할 때 작동합니다(그렇지 않은 경우 연결된 마이크가 기본 디바이스이고 Windows 내에서 올바르게 설정했음을 검사).

Unity 편집기에서 재생 단추를 눌러 몰입형 헤드셋을 테스트할 수 있습니다. 앱은 연결된 몰입형 헤드셋을 통해 작동해야 합니다.

경고

Unity 콘솔에서 기본 오디오 디바이스 변경에 대한 오류가 표시되면 장면이 예상대로 작동하지 않을 수 있습니다. 이는 혼합 현실 포털이 헤드셋이 있는 헤드셋용 기본 제공 마이크를 처리하는 방식 때문입니다. 이 오류가 표시되면 장면을 중지하고 다시 시작하면 예상대로 작동합니다.

10장 - 로컬 머신에서 UWP 솔루션 빌드 및 테스트용 로드

이제 이 프로젝트의 Unity 섹션에 필요한 모든 항목이 완료되었으므로 Unity에서 빌드해야 합니다.

  1. 빌드 설정: 파일 > 빌드 설정으로 이동합니다.

  2. 빌드 설정 창에서 빌드를 클릭합니다.

    Unity 장면을 빌드합니다.

  3. 아직 없는 경우 Unity C# 프로젝트를 선택합니다.

  4. 빌드를 클릭한 다음 Unity는 파일 탐색기 창을 시작합니다. 여기서 앱을 만든 다음, 앱을 빌드할 폴더를 선택해야 합니다. 이제 해당 폴더를 만들고 이름을 앱으로 지정 합니다. 그런 다음 , App 폴더를 선택한 상태에서 폴더 선택을 누릅니다.

  5. Unity는 App 폴더에 프로젝트 빌드를 시작합니다.

  6. Unity가 빌드를 완료하면(시간이 걸릴 수 있음) 빌드 위치에 파일 탐색기 창이 열립니다(작업 표시줄을 검사 항상 창 위에 표시되지는 않지만 새 창이 추가되었음을 알려 줍니다).

11장 - 애플리케이션 배포

애플리케이션을 배포하려면 다음을 수행합니다.

  1. 새 Unity 빌드( App 폴더)로 이동하여 Visual Studio를 사용하여 솔루션 파일을 엽니다.

  2. 솔루션 구성에서 디버그를 선택합니다.

  3. 솔루션 플랫폼에서 x86, 로컬 머신을 선택합니다.

    Microsoft HoloLens 컴퓨터에 연결되지 않도록 원격 컴퓨터로 설정하는 것이 더 쉬울 수 있습니다. 하지만 다음을 수행해야 합니다.

    • 설정 > 네트워크 & 인터넷 >> Wi-Fi 고급 옵션 내에서 찾을 수 있는 HoloLens의 IP 주소를 알고 있습니다. IPv4는 사용해야 하는 주소입니다.
    • 개발자 모드가 켜지도록 합니다.개발자를 위한 설정 > 업데이트 & 보안 > 에서 찾을 수 있습니다.

    Visual Studio에서 솔루션을 배포합니다.

  4. 빌드 메뉴로 이동하여 솔루션 배포를 클릭하여 애플리케이션을 PC에 테스트용으로 로드합니다.

  5. 이제 앱이 설치된 앱 목록에 표시되고 시작할 준비가 되었습니다.

  6. 시작되면 앱에서 마이크에 대한 액세스 권한을 부여하라는 메시지를 표시합니다. 단추를 클릭해야 합니다.

  7. 이제 번역을 시작할 준비가 되었습니다!

완성된 번역 텍스트 API 애플리케이션

축하합니다. Azure Translation Text API를 활용하여 음성을 번역된 텍스트로 변환하는 혼합 현실 앱을 빌드했습니다.

최종 제품.

보너스 연습

연습 1

반환된 텍스트가 음성으로 표시되도록 앱에 텍스트 음성 변환 기능을 추가할 수 있나요?

연습 2

사용자가 앱 자체 내에서 원본 및 출력 언어('from' 및 'to')를 변경할 수 있도록 하므로 언어를 변경할 때마다 앱을 다시 작성할 필요가 없습니다.