You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/hk/6-consumer/lessons/4-multiple-language-support/wio-terminal-translate-spee...

11 KiB

翻譯語音 - Wio Terminal

在本課程的這部分,你將撰寫程式碼,使用翻譯服務來翻譯文字。

使用翻譯服務將文字轉換為語音

語音服務的 REST API 不支援直接翻譯,但你可以使用翻譯服務將語音轉文字服務生成的文字,以及語音回應的文字進行翻譯。此服務提供 REST API 可用於翻譯文字,但為了更方便使用,將其包裝在函數應用程式中的另一個 HTTP 觸發器中。

任務 - 建立無伺服器函數來翻譯文字

  1. 在 VS Code 中開啟你的 smart-timer-trigger 專案,並確保虛擬環境已啟動。如果未啟動,請終止並重新建立終端機。

  2. 開啟 local.settings.json 檔案,並新增翻譯 API 金鑰和位置的設定:

    "TRANSLATOR_KEY": "<key>",
    "TRANSLATOR_LOCATION": "<location>"
    

    <key> 替換為你的翻譯服務資源的 API 金鑰。將 <location> 替換為你建立翻譯服務資源時使用的位置。

  3. 在函數應用程式專案的根目錄中,使用以下指令新增一個名為 translate-text 的 HTTP 觸發器:

    func new --name translate-text --template "HTTP trigger"
    

    這將建立一個名為 translate-text 的 HTTP 觸發器。

  4. translate-text 資料夾中的 __init__.py 檔案內容替換為以下內容:

    import logging
    import os
    import requests
    
    import azure.functions as func
    
    location = os.environ['TRANSLATOR_LOCATION']
    translator_key = os.environ['TRANSLATOR_KEY']
    
    def main(req: func.HttpRequest) -> func.HttpResponse:
        req_body = req.get_json()
        from_language = req_body['from_language']
        to_language = req_body['to_language']
        text = req_body['text']
    
        logging.info(f'Translating {text} from {from_language} to {to_language}')
    
        url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0'
    
        headers = {
            'Ocp-Apim-Subscription-Key': translator_key,
            'Ocp-Apim-Subscription-Region': location,
            'Content-type': 'application/json'
        }
    
        params = {
            'from': from_language,
            'to': to_language
        }
    
        body = [{
            'text' : text
        }]
    
        response = requests.post(url, headers=headers, params=params, json=body)
        return func.HttpResponse(response.json()[0]['translations'][0]['text'])
    

    此程式碼從 HTTP 請求中提取文字和語言,然後向翻譯 REST API 發出請求,將語言作為 URL 的參數,並將要翻譯的文字作為主體。最後返回翻譯結果。

  5. 在本地執行你的函數應用程式。你可以使用像 curl 這樣的工具來呼叫它,就像測試 text-to-timer HTTP 觸發器一樣。確保以 JSON 主體的形式傳遞要翻譯的文字和語言:

    {
        "text": "Définir une minuterie de 30 secondes",
        "from_language": "fr-FR",
        "to_language": "en-US"
    }
    

    此範例將 Définir une minuterie de 30 secondes 從法語翻譯為美式英語。它將返回 Set a 30-second timer

💁 你可以在 code/functions 資料夾中找到此程式碼。

任務 - 使用翻譯函數來翻譯文字

  1. 如果尚未開啟,請在 VS Code 中開啟 smart-timer 專案。

  2. 你的智慧計時器將設定兩種語言——用於訓練 LUIS 的伺服器語言(同時也用於構建與使用者對話的訊息),以及使用者說的語言。在 config.h 標頭檔案中,將 LANGUAGE 常數更新為使用者將使用的語言,並新增一個名為 SERVER_LANGUAGE 的常數,用於訓練 LUIS 的語言:

    const char *LANGUAGE = "<user language>";
    const char *SERVER_LANGUAGE = "<server language>";
    

    <user language> 替換為你將使用的語言的區域名稱,例如法語為 fr-FR,或粵語為 zn-HK

    <server language> 替換為用於訓練 LUIS 的語言的區域名稱。

    你可以在 Microsoft Docs 的語言和語音支援文件 中找到支援的語言及其區域名稱的清單。

    💁 如果你不會多種語言,可以使用像 Bing 翻譯Google 翻譯 這樣的服務,將你的首選語言翻譯成其他語言。這些服務還可以播放翻譯後的文字音頻。

    例如,如果你用英語訓練 LUIS但希望使用法語作為使用者語言你可以使用 Bing 翻譯將 "set a 2 minute and 27 second timer" 從英語翻譯成法語,然後使用 聆聽翻譯 按鈕將翻譯語音說入麥克風。

    Bing 翻譯上的聆聽翻譯按鈕

  3. SPEECH_LOCATION 下方新增翻譯 API 金鑰和位置:

    const char *TRANSLATOR_API_KEY = "<KEY>";
    const char *TRANSLATOR_LOCATION = "<LOCATION>";
    

    <KEY> 替換為你的翻譯服務資源的 API 金鑰。將 <LOCATION> 替換為你建立翻譯服務資源時使用的位置。

  4. VOICE_URL 下方新增翻譯觸發器的 URL

    const char *TRANSLATE_FUNCTION_URL = "<URL>";
    

    <URL> 替換為函數應用程式中 translate-text HTTP 觸發器的 URL。這將與 TEXT_TO_TIMER_FUNCTION_URL 的值相同,但函數名稱為 translate-text 而非 text-to-timer

  5. src 資料夾中新增一個名為 text_translator.h 的檔案。

  6. 此新的 text_translator.h 標頭檔案將包含一個用於翻譯文字的類別。在此檔案中新增以下內容以宣告此類別:

    #pragma once
    
    #include <Arduino.h>
    #include <ArduinoJson.h>
    #include <HTTPClient.h>
    #include <WiFiClient.h>
    
    #include "config.h"
    
    class TextTranslator
    {
    public:   
    private:
        WiFiClient _client;
    };
    
    TextTranslator textTranslator;
    

    這宣告了 TextTranslator 類別,以及此類別的一個實例。該類別有一個用於 WiFi 客戶端的欄位。

  7. 在此類別的 public 區域中,新增一個用於翻譯文字的方法:

    String translateText(String text, String from_language, String to_language)
    {
    }
    

    此方法接收要翻譯的來源語言和目標語言。在處理語音時,語音將從使用者語言翻譯為 LUIS 伺服器語言,而在提供回應時,則從 LUIS 伺服器語言翻譯為使用者語言。

  8. 在此方法中,新增程式碼以構建包含要翻譯文字和語言的 JSON 主體:

    DynamicJsonDocument doc(1024);
    doc["text"] = text;
    doc["from_language"] = from_language;
    doc["to_language"] = to_language;
    
    String body;
    serializeJson(doc, body);
    
    Serial.print("Translating ");
    Serial.print(text);
    Serial.print(" from ");
    Serial.print(from_language);
    Serial.print(" to ");
    Serial.print(to_language);
    
  9. 在此下方,新增以下程式碼以將主體發送到無伺服器函數應用程式:

    HTTPClient httpClient;
    httpClient.begin(_client, TRANSLATE_FUNCTION_URL);
    
    int httpResponseCode = httpClient.POST(body);
    
  10. 接下來,新增程式碼以獲取回應:

    String translated_text = "";
    
    if (httpResponseCode == 200)
    {
        translated_text = httpClient.getString();
        Serial.print("Translated: ");
        Serial.println(translated_text);
    }
    else
    {
        Serial.print("Failed to translate text - error ");
        Serial.println(httpResponseCode);
    }
    
  11. 最後,新增程式碼以關閉連線並返回翻譯後的文字:

    httpClient.end();
    
    return translated_text;
    

任務 - 翻譯識別的語音和回應

  1. 開啟 main.cpp 檔案。

  2. 在檔案頂部新增一個包含 TextTranslator 類別標頭檔案的指令:

    #include "text_translator.h"
    
  3. 設定計時器或計時器到期時說出的文字需要被翻譯。為此,在 say 函數的第一行新增以下內容:

    text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
    

    這將把文字翻譯成使用者語言。

  4. processAudio 函數中,透過 String text = speechToText.convertSpeechToText(); 呼叫從捕獲的音頻中檢索文字。在此呼叫之後,翻譯文字:

    String text = speechToText.convertSpeechToText();
    text = textTranslator.translateText(text, LANGUAGE, SERVER_LANGUAGE);
    

    這將把文字從使用者語言翻譯成伺服器使用的語言。

  5. 建置此程式碼,將其上傳到你的 Wio Terminal並透過序列監視器進行測試。一旦你在序列監視器中看到 Ready,按下 C 按鈕(左側靠近電源開關的按鈕),然後說話。確保你的函數應用程式正在執行,並用使用者語言請求計時器,可以是你自己說該語言,或者使用翻譯應用程式。

    Connecting to WiFi..
    Connected!
    Got access token.
    Ready.
    Starting recording...
    Finished recording
    Sending speech...
    Speech sent!
    {"RecognitionStatus":"Success","DisplayText":"Définir une minuterie de 2 minutes 27 secondes.","Offset":9600000,"Duration":40400000}
    Translating Définir une minuterie de 2 minutes 27 secondes. from fr-FR to en-US
    Translated: Set a timer of 2 minutes 27 seconds.
    Set a timer of 2 minutes 27 seconds.
    {"seconds": 147}
    Translating 2 minute 27 second timer started. from en-US to fr-FR
    Translated: 2 minute 27 seconde minute a commencé.
    2 minute 27 seconde minute a commencé.
    Translating Times up on your 2 minute 27 second timer. from en-US to fr-FR
    Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.
    Chronométrant votre minuterie de 2 minutes 27 secondes.
    

💁 你可以在 code/wio-terminal 資料夾中找到此程式碼。

😀 你的多語言計時器程式大功告成!


免責聲明
本文件已使用人工智能翻譯服務 Co-op Translator 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。