HoloLens (第 1 代) 和 Azure 301:語言翻譯


注意

混合實境學院教學課程的設計是以 HoloLens (第 1 代) 和混合實境沉浸式頭戴裝置為準。 因此,對於仍在尋找這些裝置開發指引的開發人員而言,我們覺得這些教學課程很重要。 這些教學課程不會使用用於 HoloLens 2 的最新工具組或互動進行更新。 系統會保留這些資訊,以繼續在支援的裝置上運作。 未來將會張貼一系列新的教學課程,示範如何開發 HoloLens 2。 發佈這些教學課程時,將會更新此通知的連結。


在此課程中,您將瞭解如何使用 Azure 認知服務搭配翻譯工具文字 API,將翻譯功能新增至混合實境應用程式。

最終產品

翻譯工具文字 API 是近乎實時運作的翻譯服務。 服務是以雲端為基礎,而且使用 REST API 呼叫時,應用程式可以使用類神經機器翻譯技術將文字翻譯成其他語言。 如需詳細資訊,請流覽 Azure 翻譯工具文字 API 頁面

完成本課程之後,您將擁有混合實境應用程式,其將能夠執行下列動作:

  1. 使用者會說出連線到沉浸式 (VR) 頭戴式裝置 (或 HoloLens) 內建麥克風的麥克風。
  2. 應用程式會擷取聽寫,並將其傳送至 Azure 翻譯工具文字 API。
  3. 翻譯結果會顯示在 Unity 場景的簡單 UI 群組中。

本課程將教導您如何從翻譯工具服務取得結果,以 Unity 為基礎的範例應用程式。 您必須將這些概念套用至您可能要建置的自定義應用程式。

裝置支援

課程 HoloLens 沉浸式頭戴裝置
MR 和 Azure 301:語言翻譯 ✔️ ✔️

注意

雖然本課程主要著重於 Windows Mixed Reality 沉浸式 (VR) 頭戴式裝置,但您也可以將此課程中學到的內容套用至 Microsoft HoloLens。 當您跟著課程進行時,您會看到可能需要採用以支援 HoloLens 之任何變更的附注。 使用 HoloLens 時,您可能會在語音擷取期間注意到一些回應。

必要條件

注意

本教學課程專為具備 Unity 和 C# 基本經驗的開發人員所設計。 另請注意,本檔中的必要條件和書面指示代表在 2018 年 5 月撰寫 () 時已經過測試及驗證的內容。 您可以免費使用最新的軟體,如 安裝工具 一文中所列,但不應假設本課程中的資訊會完全符合您在較新軟體中找到的內容,而不是下面所列的內容。

針對本課程,我們建議使用下列硬體和軟體:

開始之前

  • 為了避免建置此專案時發生問題,強烈建議您在根資料夾或近根資料夾中建立本教學課程中所提及的專案, (長資料夾路徑可能會導致建置時間) 的問題。

  • 本教學課程中的程式代碼可讓您從連線到計算機的預設麥克風裝置錄製。 請確定預設麥克風裝置已設定為您打算用來擷取語音的裝置。

  • 若要允許您的計算機啟用聽寫,請移至 [ 設定 > 隱私權 > 語音]、筆跡 & 輸入 ,然後選取 [ 開啟語音服務和輸入建議] 按鈕。

  • 如果您使用連線到 (或內建的麥克風和耳機來) 您的頭戴式裝置,請確定在 [設定混合實境>音訊和語音] 中>開啟 [當我戴上頭戴式裝置時,切換至頭戴式裝置麥克風] 選項。

    混合實境設定

    麥克風設定

警告

請注意,如果您要為此實驗室開發沉浸式頭戴裝置,可能會遇到音訊輸出裝置問題。 這是因為 Unity 的問題,在較新版本的 Unity (Unity 2018.2) 中修正此問題。 此問題可防止 Unity 在運行時間變更預設音訊輸出裝置。 作為因應措施,請確定您已完成上述步驟,並在此問題出現時關閉並重新開啟編輯器。

第 1 章 – Azure 入口網站

若要使用 Azure Translator API,您必須設定可供您的應用程式使用的服務實例。

  1. 登入 Azure 入口網站

    注意

    如果您還沒有 Azure 帳戶,則必須建立一個帳戶。 如果您在教室或實驗室情況中遵循本教學課程,請詢問講師或其中一個專業課程,以協助設定您的新帳戶。

  2. 登入之後,按兩下左上角的 [ 新增 ],然後搜尋 「翻譯工具文字 API」。選取 Enter

    新增資源

    注意

    在較新的入口網站中, [新增 ] 這個字可能已取代為 建立資源

  3. 新頁面將提供 翻譯工具文字 API 服務的描述。 在此頁面左下方,選取 [ 建立 ] 按鈕,以建立與此服務的關聯。

    建立翻譯工具文字 API 服務

  4. 按兩下 [ 建立]:

    1. 插入此服務實例所需的 Name

    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 專案相關聯。 建立場景資料夾 (和其他類似的資料夾) 是建構 Unity 專案的一般方式。

    7. 建置 設定中的其餘設定現在應該保留為預設值。

  6. 在 [ 建置設定 ] 視窗中,按兩下 [ 播放程序設定 ] 按鈕,這會在 Inspector 所在的空間中開啟相關的面板。

    開啟播放機設定。

  7. 在此面板中,必須驗證一些設定:

    1. 在 [ 其他設定] 索引 標籤中:

      1. 腳本運行時間版本 應該是 穩定 (.NET 3.5 對等) 。

      2. 腳本後端 應該是 .NET

      3. API 相容性層級 應該是 .NET 4.6

        更新其他設定。

    2. 在 [ 發佈設定] 索引標籤的 [ 功能] 底下,檢查:

      1. InternetClient

      2. Microphone (麥克風)

        更新發佈設定。

    3. 進一步在面板下方的 [XR 設定] (找到 [發佈設定]) ,勾選 [支援的虛擬實境],確定已新增 Windows Mixed Reality SDK

      更新 X R 設定。

  8. 回到 [建置設定], Unity C# 專案 不再呈現灰色;勾選此旁的複選框。

  9. 關閉 [建置設定] 視窗。

  10. 儲存場景和專案 (檔案 > 儲存場景/檔案 > 儲存專案) 。

第 3 章 – 主要相機設定

重要

如果您想要略過本課程的 Unity 設定 元件,並直接進入程式碼,請隨意 下載此 .unitypackage、將它匯入您的專案作為 自定義套件,然後從 第 5 章繼續進行。 您仍然需要建立 Unity 專案。

  1. [階層面板] 中,您會發現名為 Main Camera 的物件,此物件代表一旦您在應用程式內“內部”時,代表您的「頭部」檢視點。

  2. 在 Unity 儀錶板前面,選取 主要相機 GameObject。 您會發現偵測 器面板 (通常位於右側,儀錶板) 會顯示 該 GameObject 的各種元件,並在頂端顯示 Transform ,後面接著 Camera 和其他元件。 您必須重設主要相機的轉換,使其正確定位。

  3. 若要這樣做,請選取相機轉換元件旁齒輪圖示,然後選取 [重設]。

    重設主要相機轉換。

  4. 轉換 元件看起來 應該像這樣:

    1. Position 設定為 0、0、0

    2. 旋轉 設定為 0、0、0

    3. Scale 設定為 1、1、1

      相機的轉換資訊

  5. 接下來,選取 [主要相機] 物件時,請參閱位於 [偵測器面板] 底部的 [新增元件] 按鈕。

  6. 選取該按鈕,然後在 (搜尋欄位中輸入 音訊來源 ,或流覽名為 音訊來源 之元件的區段) ,然後選取它 (按下 enter 鍵,也可以) 運作) 。

  7. 音訊來源元件將會新增至主要相機,如下所示。

    新增音訊來源元件。

    注意

    針對 Microsoft HoloLens,您也必須變更下列專案,這是主要相機相機元件的一部分:

    • 清除旗標: 純色。
    • 背景 'Black, Alpha 0' – 十六進位色彩: #000000000。

第 4 章 – 設定偵錯畫布

若要顯示翻譯的輸入和輸出,必須建立基本 UI。 在此課程中,您將建立 Canvas UI 物件,其中包含數個 「文字」對象來顯示數據。

  1. [階層面板] 的空白區域中按兩下滑鼠右鍵,在 [UI] 底下新增 Canvas

    新增 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

      更新畫布的 Rect 轉換。

  4. 以滑鼠右鍵按兩下 [階層面板] 下的 [畫布],然後在 [UI] 底下新增 [面板]。 此 面板 會將背景提供給您將在場景中顯示的文字。

  5. 在 [階層面板] 的 [面板] 下,以滑鼠右鍵按兩下 [面板],然後新增 Text 物件。 重複相同的程式,直到您已在 (提示中建立四個 UI 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. 針對 Text (Script) 元件:

      名稱 Text 字型大小
      MicrophoneStatusLabel 麥克風狀態: 20
      AzureResponseLabel Azure Web 回應 20
      DictationLabel 您剛剛說過: 20
      TranslationResultLabel 轉譯: 20

      輸入UI標籤的對應值。

    3. 此外,將 [字型樣式] 設為 粗體。 這可讓文字更容易閱讀。

      粗體字型。

  7. 針對第 5 章中建立的每個 UI Text 物件,建立新的UI Text 物件。 這些子系會顯示應用程式的輸出。 透過以滑鼠右鍵按兩下您預期的父系 (建立 物件,例如 MicrophoneStatusLabel) ,然後選取 [UI ],然後選取 [ 文字]。

  8. 針對這些子系,請選取它,並使用下表在 [偵測器面板] 中設定參數。

    1. 針對 Rect Transform 元件:

      名稱 轉換 - 位置 寬度 高度
      MicrophoneStatusText X 0 Y -30 Z 0 300 30
      AzureResponseText X 0 Y -30 Z 0 300 30
      聽寫文字 X 0 Y -30 Z 0 300 30
      TranslationResultText X 0 Y -30 Z 0 300 30
    2. 針對 Text (Script) 元件:

      名稱 Text 字型大小
      MicrophoneStatusText ?? 20
      AzureResponseText ?? 20
      聽寫文字 ?? 20
      TranslationResultText ?? 20
  9. 接下來,針對每個文字元件選取 [中心] 對齊選項:

    對齊文字。

  10. 若要確保 子 UI 文字 物件易於閱讀,請變更其 Color。 按兩下 [ 色彩] 旁的列 (目前為 「黑色」) ,即可執行此動作。

    輸入UI文字輸出的對應值。

  11. 然後,在新的 [小數 色彩 ] 視窗中,將 十六進位色彩 變更為: 0032EAFF

    將色彩更新為藍色。

  12. 以下是 UI 的外觀。

    1. [階層] 面板中

      在提供的結構中具有階層。

    2. 場景遊戲檢視中:

      在相同的結構中擁有場景和遊戲檢視。

第 5 章 - 建立結果類別

您需要建立的第一個腳本是 Results 類別,負責提供查看翻譯結果的方法。 類別會儲存並顯示下列專案:

  • 來自 Azure 的回應結果。
  • 麥克風狀態。
  • 聽寫 (文字) 的結果。
  • 翻譯的結果。

若要建立此類別:

  1. [項目面板] 中按下滑鼠右鍵,然後按兩下 [ 建立 > 資料夾]。 將資料夾命名為 Scripts

    建立文稿資料夾。

    開啟文稿資料夾。

  2. 建立 [腳本 ] 資料夾后,按兩下即可開啟。 然後在該資料夾中,以滑鼠右鍵按兩下,然後選取 [ 建立 > ] 和 [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. 請務必先將變更儲存在 Visual Studio 中,再返回 Unity

第 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. 現在您需要App用來啟動和停止語音擷取的方法,並將它傳遞給 翻譯工具 類別,您很快就會建置。 複製下列程序代碼,並將其貼到 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. 請務必先將變更儲存在Visual Studio中,再返回 Unity。

警告

此時,您會注意到 Unity 編輯器控制台 面板中出現錯誤, (「名稱 』Translator' 不存在...」) 。 這是因為程式代碼會參考 翻譯工具 類別,您將在下一章中建立。

第 7 章 – 呼叫 Azure 和翻譯工具服務

您需要建立的最後一個腳本是 Translator 類別。

此類別負責:

  • 使用 Azure 驗證應用程式,以交換 驗證令牌
  • 使用 驗證令牌 提交從 MicrophoneManager 類別收到的文字 () 進行翻譯。
  • 接收翻譯的結果,並將它傳遞給 結果 類別,以在UI中可視化。

若要建立此類別:

  1. 移至您先前建立的 Scripts 資料夾。

  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 種語言 (,包括 Klingon) !
    • 有一個 涵蓋可用語言的互動式頁面,不過請注意,當網站語言設定為 '' (且 Microsoft 網站可能會重新導向至您的原生語言) 時,頁面才會運作。 您可以變更頁面底部的網站語言,或變更URL。
    • 上述代碼段中的 authorizationKey 值必須是您訂閱 Azure 翻譯工具文字 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 翻譯工具文字 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. 請務必先將變更儲存在 Visual Studio 中,再返回 Unity

第 8 章 – 設定 Unity 場景

  1. 回到 Unity 編輯器,按兩下 [結果] 類別,然後將 [腳本] 資料夾拖曳至 [階層面板] 中的 [主要相機] 物件。

  2. 按兩下 [主要相機 ],然後查看 [偵測器面板]。 您會注意到,在新增的 腳本 元件中,有四個字段具有空白值。 這些是程式代碼中屬性的輸出參考。

  3. 將適當的 Text 物件從 [階層面板 ] 拖曳到這四個位置,如下圖所示。

    使用指定的值更新目標參考。

  4. 接下來,按兩下翻譯工具類別,並將其從 [腳稿] 資料夾拖曳至 [階層] 面板中的主相機物件。

  5. 然後,按兩下 [Scripts] 資料夾並將 MicrophoneManager 類別拖曳至 [階層] 面板中的主相機物件。

  6. 最後,按兩下 [主相機 ],然後查看 [偵測器面板]。 您會發現,在您拖曳的腳本中,有兩個下拉式方塊可讓您設定語言。

    請確定預期的翻譯語言為輸入。

第 9 章 – 在混合實境中測試

此時,您必須測試場景是否已正確實作。

請確定:

  • 第 1 章中所述的所有設定都已正確設定。
  • 結果翻譯工具MicrophoneManager 腳本會附加至主要相機物件。
  • 您已將 Azure Translator Text API 服務密鑰放在翻譯工具腳本的 authorizationKey 變數內。
  • [主要相機偵測器] 面板中的所有欄位都會正確指派。
  • 如果不是,執行場景 (麥克風時,您的麥克風會正常運作,請檢查連結的麥克風是否為 默認 裝置,且您已 在 Windows) 中正確設定

您可以按下 Unity 編輯器中的 [播放] 按鈕來測試沉浸式頭戴式裝置。 應用程式應該透過附加的沉浸式頭戴式裝置運作。

警告

如果您在 Unity 控制台中看到有關預設音訊裝置變更的錯誤,場景可能無法如預期般運作。 這是因為混合實境入口網站處理內建麥克風的方式,適用於具有它們的頭戴式裝置。 如果您看到此錯誤,只要停止場景並再次啟動,項目應該如預期般運作。

第 10 章 – 建置 UWP 解決方案,並在本機計算機上側載

此專案的 Unity 區段所需的所有項目現在都已完成,因此是時候從 Unity 建置它了。

  1. 流覽至 [組建設定檔案 > 組建設定...

  2. 從 [ 建置設定] 視窗中,按兩下 [ 建置]。

    建置 Unity 場景。

  3. 如果尚未這麼做,請勾選 Unity C# 專案

  4. 按一下 [建置]。 Unity 會啟動 檔案總管 視窗,您需要在其中建立,然後選取要建置應用程式的資料夾。 立即建立該資料夾,並將它命名為 應用程式。 然後選取 [應用程式 ] 資料夾,然後按 [選取資料夾]。

  5. Unity 會開始將專案建置至 [應用程式 ] 資料夾。

  6. 一旦 Unity 完成建置 (可能需要一些時間) ,它會在組建的位置開啟 檔案總管 視窗, (檢查您的任務列,因為它可能不一定會出現在您的視窗上方,但會通知您新增視窗) 。

第 11 章 – 部署您的應用程式

若要部署您的應用程式:

  1. 流覽至新的 Unity 組建 (應用程式 資料夾) ,並使用 Visual Studio 開啟方案檔。

  2. 在 [方案組態] 中,選取 [ 偵錯]。

  3. 在 [解決方案平臺] 中,選取 [x86]、[ 本機計算機]。

    針對 Microsoft HoloLens,您可能會發現更容易將此設定為遠端電腦,因此您不會與計算機連線。 不過,您也必須執行下列動作:

    • 瞭解 HoloLens 的 IP 位址,您可以在設定網路 & 因特網 > Wi-Fi > 進階選項中找到>;IPv4 是您應該使用的位址。
    • 確定開發人員模式開啟;可在適用於開發人員的設定>更新 & 安全性>中找到。

    從 Visual Studio 部署解決方案。

  4. 移至 [建置] 功能表 ,然後按下 [ 部署解決方案 ] 將應用程式側載至您的電腦。

  5. 您的應用程式現在應該會出現在已安裝的應用程式清單中,並準備好啟動。

  6. 啟動之後,應用程式會提示您授權存取麥克風。 請務必按兩下 [ ] 按鈕。

  7. 您現在已準備好開始翻譯!

您已完成的翻譯文字 API 應用程式

恭喜,您已建置混合實境應用程式,利用 Azure 翻譯文字 API 將語音轉換成翻譯的文字。

最終產品。

額外練習

練習 1

您可以將文字到語音轉換功能新增至應用程式,以便說出傳回的文字嗎?

練習 2

讓使用者能夠變更來源和輸出語言, (『from』 和 『to』) 應用程式本身內,因此每次您想要變更語言時,都不需要重建應用程式。