跳至主要内容

翻譯語音 - 虛擬物聯網設備

在本課程的這一部分中,您將編寫代碼以在使用語音服務轉換為文本時翻譯語音,然後使用翻譯服務翻譯文本,最後生成語音回應。

使用語音服務翻譯語音

語音服務不僅可以將語音轉換為相同語言的文本,還可以將輸出翻譯為其他語言。

任務 - 使用語音服務翻譯語音

  1. 在 VS Code 中打開 smart-timer 項目,並確保在終端中加載了虛擬環境。

  2. 在現有的導入語句下添加以下導入語句:

    from azure.cognitiveservices import speech
    from azure.cognitiveservices.speech.translation import SpeechTranslationConfig, TranslationRecognizer
    import requests

    這將導入用於翻譯語音的類,以及稍後在本課程中將用於調用翻譯服務的 requests 庫。

  3. 您的智能計時器將設置兩種語言 - 用於訓練 LUIS 的服務器語言(同樣的語言也用於構建與用戶對話的消息),以及用戶講的語言。將 language 變量更新為用戶講的語言,並添加一個名為 server_language 的新變量,用於訓練 LUIS 的語言:

    language = '<user language>'
    server_language = '<server language>'

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

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

    您可以在 Microsoft 文檔上的語言和語音支持文檔 中找到支持的語言及其區域名稱列表。

    💁 如果您不會多種語言,可以使用 Bing 翻譯Google 翻譯 等服務將您的首選語言翻譯成您選擇的語言。這些服務可以播放翻譯文本的音頻。請注意,語音識別器會忽略來自您設備的一些音頻輸出,因此您可能需要使用另一個設備來播放翻譯文本。

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

    Bing 翻譯上的聽翻譯按鈕

  4. 用以下內容替換 recognizer_configrecognizer 聲明:

    translation_config = SpeechTranslationConfig(subscription=speech_api_key,
    region=location,
    speech_recognition_language=language,
    target_languages=(language, server_language))

    recognizer = TranslationRecognizer(translation_config=translation_config)

    這將創建一個翻譯配置,以用戶語言識別語音,並創建用戶和服務器語言的翻譯。然後使用此配置創建一個翻譯識別器 - 一個可以將語音識別輸出翻譯成多種語言的語音識別器。

    💁 需要在 target_languages 中指定原始語言,否則您將無法獲得任何翻譯。

  5. 更新 recognized 函數,將函數的全部內容替換為以下內容:

    if args.result.reason == speech.ResultReason.TranslatedSpeech:
    language_match = next(l for l in args.result.translations if server_language.lower().startswith(l.lower()))
    text = args.result.translations[language_match]
    if (len(text) > 0):
    print(f'Translated text: {text}')

    message = Message(json.dumps({ 'speech': text }))
    device_client.send_message(message)

    此代碼檢查是否因為語音被翻譯而觸發了識別事件(此事件可能在其他時間觸發,例如語音被識別但未翻譯時)。如果語音被翻譯,它會在 args.result.translations 字典中找到與服務器語言匹配的翻譯。

    args.result.translations 字典是以區域設置的語言部分為鍵,而不是整個設置。例如,如果您請求將法語翻譯成 fr-FR,字典將包含 fr 的條目,而不是 fr-FR

    然後將翻譯文本發送到 IoT 中樞。

  6. 運行此代碼以測試翻譯。確保您的函數應用正在運行,並用用戶語言請求計時器,無論是自己講該語言,還是使用翻譯應用。

    (.venv) ➜  smart-timer python app.py
    Connecting
    Connected
    Translated text: Set a timer of 2 minutes and 27 seconds.

使用翻譯服務翻譯文本

語音服務不支持將文本翻譯回語音,您可以使用翻譯服務來翻譯文本。此服務有一個 REST API,您可以用來翻譯文本。

任務 - 使用翻譯資源翻譯文本

  1. speech_api_key 下添加翻譯 API 密鑰:

    translator_api_key = '<key>'

    <key> 替換為您的翻譯服務資源的 API 密鑰。

  2. say 函數上方定義一個 translate_text 函數,將文本從服務器語言翻譯成用戶語言:

    def translate_text(text):
  3. 在此函數內定義 REST API 調用的 URL 和標頭:

    url = f'https://api.cognitive.microsofttranslator.com/translate?api-version=3.0'

    headers = {
    'Ocp-Apim-Subscription-Key': translator_api_key,
    'Ocp-Apim-Subscription-Region': location,
    'Content-type': 'application/json'
    }

    此 API 的 URL 不是特定於位置的,而是將位置作為標頭傳遞。API 密鑰直接使用,因此與語音服務不同,無需從令牌發行 API 獲取訪問令牌。

  4. 在此下方定義調用的參數和正文:

    params = {
    'from': server_language,
    'to': language
    }

    body = [{
    'text' : text
    }]

    params 定義了傳遞給 API 調用的參數,傳遞源語言和目標語言。此調用將 from 語言的文本翻譯成 to 語言。

    body 包含要翻譯的文本。這是一個數組,因為可以在同一調用中翻譯多個文本塊。

  5. 調用 REST API,並獲取響應:

    response = requests.post(url, headers=headers, params=params, json=body)

    返回的響應是一個 JSON 數組,其中包含一個包含翻譯的項目。此項目有一個數組,用於翻譯正文中傳遞的所有項目。

    [
    {
    "translations": [
    {
    "text": "Chronométrant votre minuterie de 2 minutes 27 secondes.",
    "to": "fr"
    }
    ]
    }
    ]
  6. 返回數組中第一個翻譯的 text 屬性:

    return response.json()[0]['translations'][0]['text']
  7. 更新 say 函數,在生成 SSML 之前翻譯要說的文本:

    print('Original:', text)
    text = translate_text(text)
    print('Translated:', text)

    此代碼還將原始文本和翻譯文本打印到控制台。

  8. 運行您的代碼。確保您的函數應用正在運行,並用用戶語言請求計時器,無論是自己講該語言,還是使用翻譯應用。

    (.venv) ➜  smart-timer python app.py
    Connecting
    Connected
    Translated text: Set a timer of 2 minutes and 27 seconds.
    Original: 2 minute 27 second timer started.
    Translated: 2 minute 27 seconde minute a commencé.
    Original: Times up on your 2 minute 27 second timer.
    Translated: Chronométrant votre minuterie de 2 minutes 27 secondes.

    💁 由於不同語言中說話的方式不同,您可能會得到與您給 LUIS 的示例略有不同的翻譯。如果是這種情況,請向 LUIS 添加更多示例,重新訓練然後重新發布模型。

💁 您可以在 code/virtual-iot-device 文件夾中找到此代碼。

😀 您的多語言計時器程序成功了!