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 月)。 您可以自由使用最新的軟體,如安裝工具文章中所列,不過不應該假設本課程中的資訊會完全符合您在較新的軟體中找到的內容,而不是下面所列的內容。

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

在您開始使用 Intune 之前

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

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

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

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

    混合實境設定

    麥克風設定

警告

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

第 1 章 – Azure 入口網站

若要使用 Azure 翻譯工具 API,您必須將服務的實例設定為可供您的應用程式使用。

  1. 登入 Azure 入口網站。

    注意

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

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

    新增資源

    注意

    [新增] 一詞可能已取代為在較新的入口網站中建立資源。

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

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

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

    開啟播放機設定。

  7. 在此面板中,需要驗證一些設定:

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

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

      2. 腳本後端 應該是 .NET

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

        更新其他設定。

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

      1. InternetClient

      2. 麥克風

        更新發佈設定。

    3. 在面板的下方,在 [XR 設定] 中,勾選 [支援虛擬現實] 中的 [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. 選取該按鈕,然後在搜尋欄位中輸入 音訊來源 或瀏覽區段來搜尋名為 Audio Source 的元件,如下所示,並加以選取(按 Enter 鍵也可以運作)。

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

    新增音訊來源元件。

    注意

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

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

第 4 章 – 設定偵錯畫布

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

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

    新增 Canvas UI 物件。

  2. 選取 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. 以滑鼠右鍵按兩下 [階層面板] 中的 [面板],然後在 [UI] 底下,新增 Text 物件。 重複相同的程式,直到您總共建立四個UI文字物件(提示:如果您已選取第一個 '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。 按兩下 [色彩] 旁的列 (目前為 'Black') 即可執行此動作。

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

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

    將色彩更新為藍色。

  12. 以下是UI的外觀。

    1. 在 [階層面板] 中:

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

    2. 在 場景 和 遊戲檢視中:

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

第 5 章 – 建立 Results 類別

您需要建立的第一個腳本是 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。

此類別負責:

  • 偵測連接到頭戴式裝置或機器的錄製裝置(無論預設值為哪一種)。
  • 擷取音訊(語音),並使用聽寫將其儲存為字串。
  • 語音暫停之後,請將聽寫提交至 Translator 類別。
  • 裝載方法,可視需要停止語音擷取。

若要建立此類別:

  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. 現在,您需要應用程式用來啟動和停止語音擷取的方法,並將它傳遞至 翻譯工具 類別,您很快就會建置。 複製下列程序代碼,並將其貼到 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; 
    

    注意

  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 類別所接收之文字的翻譯。 此程式代碼會建立查詢字串以傳送至 Azure 翻譯工具文字 API,然後使用內部 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. 請務必先在Visual Studio中儲存變更,再返回 Unity。

第 8 章 – 設定 Unity 場景

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

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

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

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

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

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

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

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

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

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

請確定:

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

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

警告

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

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

此專案的 Unity 區段已全部完成,因此是時候從 Unity 建置它了。

  1. 瀏覽至 [ 建置設定: 檔案 > 建置設定...

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

    建置 Unity 場景。

  3. 如果還沒這麼做,請勾選 Unity C# 專案。

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

  5. Unity 將會開始將您的專案建置至 App 資料夾。

  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'),因此每次您想要變更語言時,都不需要重建應用程式。