翻譯語音 - 樹莓派
在本課程中,你將編寫代碼以使用翻譯服務翻譯文本。
使用翻譯服務將文本轉換為語音
語音服務 REST API 不支持直接翻譯,你可以使用翻譯服務來翻譯由語音轉文本服務生成的文本,以及語音回應的文本。此服務有一個 REST API,你可以用來翻譯文本。
任務 - 使用翻譯資源翻譯文本
-
你的智能計時器將設置兩種語言 - 用於訓練 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" 從英語翻譯成法語,然後使用 聽翻譯 按鈕將翻譯語音說入麥克風。
-
在
speech_api_key
下方添加翻譯 API 密鑰:translator_api_key = '<key>'
將
<key>
替換為你的翻譯服務資源的 API 密鑰。 -
在
say
函數上方定義一個translate_text
函數,將文本從服務器語言翻譯為用戶語言:def translate_text(text, from_language, to_language):
從語言和到語言將傳遞給此函數 - 你的應用需要在識別語音時從用戶語言轉換為服務器語言,並在提供語音反饋時從服務器語言轉換為用戶語言。
-
在此函數內,定義 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 獲取訪問令牌。
-
在此下方定義調用的參數和正文:
params = {
'from': from_language,
'to': to_language
}
body = [{
'text' : text
}]params
定義了傳遞給 API 調用的參數,傳遞從語言和到語言。此調用將from
語言的文本翻譯為to
語言。body
包含要翻譯的文本。這是一個數組,因為可以在同一調用中翻譯多個文本塊。 -
調用 REST API 並獲取響應:
response = requests.post(url, headers=headers, params=params, json=body)
返回的響應是一個 JSON 數組,其中包含一個項目,該項目包含翻譯。此項目有一個數組,包含所有在正文中傳遞的項目的翻譯。
[
{
"translations": [
{
"text": "Set a 2 minute 27 second timer.",
"to": "en"
}
]
}
] -
返回數組中第一個項目中第一個翻譯的
text
屬性:return response.json()[0]['translations'][0]['text']
-
更新
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)此代碼還將原始文本和翻譯文本打印到控制台。
-
更新
say
函數,將要說的文本從服務器語言翻譯為用戶語言:def say(text):
print('Original:', text)
text = translate_text(text, server_language, language)
print('Translated:', text)
speech = get_speech(text)
play_speech(speech)此代碼還將原始文本和翻譯文本打印到控制台。
-
運行你的代碼。確保你的函數應用正在運行,並用用戶語言請求計時器,無論是自己講該語言,還是使用翻譯應用。
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 文件夾中找到此代碼。
😀 你的多語言計時器程序成功了!