跳至主要内容

翻譯語音 - 樹莓派

在本課程中,你將編寫代碼以使用翻譯服務翻譯文本。

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

語音服務 REST API 不支持直接翻譯,你可以使用翻譯服務來翻譯由語音轉文本服務生成的文本,以及語音回應的文本。此服務有一個 REST API,你可以用來翻譯文本。

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

  1. 你的智能計時器將設置兩種語言 - 用於訓練 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 翻譯上的聽翻譯按鈕

  2. speech_api_key 下方添加翻譯 API 密鑰:

    translator_api_key = '<key>'

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

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

    def translate_text(text, from_language, to_language):

    從語言和到語言將傳遞給此函數 - 你的應用需要在識別語音時從用戶語言轉換為服務器語言,並在提供語音反饋時從服務器語言轉換為用戶語言。

  4. 在此函數內,定義 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 獲取訪問令牌。

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

    params = {
    'from': from_language,
    'to': to_language
    }

    body = [{
    'text' : text
    }]

    params 定義了傳遞給 API 調用的參數,傳遞從語言和到語言。此調用將 from 語言的文本翻譯為 to 語言。

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

  6. 調用 REST API 並獲取響應:

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

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

    [
    {
    "translations": [
    {
    "text": "Set a 2 minute 27 second timer.",
    "to": "en"
    }
    ]
    }
    ]
  7. 返回數組中第一個項目中第一個翻譯的 text 屬性:

    return response.json()[0]['translations'][0]['text']
  8. 更新 while True 循環,將從用戶語言到服務器語言的 convert_speech_to_text 調用的文本進行翻譯:

    if len(text) > 0:
    print('Original:', text)
    text = translate_text(text, language, server_language)
    print('Translated:', text)

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

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

  9. 更新 say 函數,將要說的文本從服務器語言翻譯為用戶語言:

    def say(text):
    print('Original:', text)
    text = translate_text(text, server_language, language)
    print('Translated:', text)
    speech = get_speech(text)
    play_speech(speech)

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

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

    pi@raspberrypi:~/smart-timer $ python3 app.py
    Connecting
    Connected
    Using voice fr-FR-DeniseNeural
    Original: Définir une minuterie de 2 minutes et 27 secondes.
    Translated: 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/pi 文件夾中找到此代碼。

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