使用 Business Messages 的語言代碼和 Google 翻譯的智慧自動翻譯功能,就能以偏好的語言與使用者交流,擴大虛擬服務專員的觸及範圍。這個教學課程會引導您使用 Business Messages Webhook 進行 Google 翻譯的概念驗證。
軟硬體需求
您必須符合以下條件,才能開始使用這項服務:
- 透過 Business Messages 功能完成完整的合作夥伴註冊。請參閱註冊成為合作夥伴指南。
- Business Messages 代理程式,包括服務帳戶金鑰。如要建立代理程式,請參閱建立您的第一個代理程式指南。
- 已安裝 Google Cloud SDK 和 Node.js (10 以上版本) 的電腦。確認您已在 Google Cloud SDK 中登入並設定使用的專案 ID。
- 用於測試的 Android 或 iOS 裝置。
取得程式碼
本教學課程會逐步說明與 Google 翻譯整合的 Webhook 程式碼範例。如要取得程式碼,請從 GitHub 複製存放區:
git clone https://github.com/google-business-communications/bm-nodejs-translation-tutorial
前往複製的目錄,並將服務帳戶金鑰放入資源目錄:
cp credentials.json bm-nodejs-translation-sample/resources/bm-agent-service-account-credentials.json
提示:如需設定或下載服務金鑰的相關協助,請參閱管理服務帳戶的 Google Cloud 指南。
完成之後,您可以部署程式碼:
gcloud app deploy
使用行動裝置將部分訊息傳送給服務專員。請嘗試使用不同語言傳送訊息,看看會發生什麼事。
設定 Translate API
程式碼範例中包含已安裝 Translation API 的節點套件。如果您對安裝節點套件或如何安裝 Translation API 不同程式設計語言感興趣,請參閱 Cloud Translate API 文件。
如要使用 Translate API,您必須匯入程式庫並建立 Translation API 用戶端。開啟 routes/index.js
檔案。相關線條如下:
// Import the Translate API library.
const { Translate } = require("@google-cloud/translate").v2;
// Create a new Translate API client.
const translate = new Translate();
從現在起,您可以存取 Translation 物件的 Translation API 方法。
查看檔案頂端附近的變數:
const SERVER_LANGUAGE = "en";
let currentLanguage = SERVER_LANGUAGE;
程式碼範例會將伺服器語言儲存為常數,因為此程式碼相對固定。不過,對話目前的語言可能會變更,因此 currentLanguage
變數會追蹤該語言。
偵測傳入語言
程式碼範例會偵測傳入語言是否已變更,如果有的話,會提示使用者選擇要在對話中使用的語言。如要在行動裝置上試用這項功能,請以英文以外的語言輸入服務專員的訊息。如果你不知道任何其他語言,請嘗試輸入「Hola」等於「quot;Hello"!」的西班牙文。
代理程式的回應會詢問使用者是否想切換語言。提示內容包含建議回覆,讓使用者可以點開該語言。
首先來看看語言偵測功能。
/**
* Detects input text language.
*
* @param {string} text The text received from the consumer.
* @param {Context} context The user message request context.
* @return A Promise with the detected language code.
*/
async function detectLanguage(text, context) {
return new Promise(function (resolve, reject) {
translate
.detect(text)
.then((result) => {
if (result && result.length > 0) {
if (result[0].confidence > CONFIDENCE_THRESHOLD) {
resolve(result[0].language);
}
resolve(bcp47.parse(context.resolvedLocale).language);
} else {
reject("No language detected");
}
})
.catch((err) => {
console.error("ERROR:", err);
reject(err);
});
});
}
此方法使用翻譯用戶端上的偵測方法。由於 Translation API 可能會偵測到多種不同程度的信賴程度 (而且也支援多個輸入內容),因此這個方法會傳回一系列結果。範例會擷取第一個結果,也就是可信度最佳的結果。
使用已解析的語言代碼
有時候,Translation API 無法判斷可信度較高的訊息語言。舉例來說,您的貓咪在鍵盤上執行時,輸入了可疑字串,翻譯 API 仍會嘗試偵測語言,但偵測到的語言可能不正確。(畢竟 Google 翻譯目前仍不支援貓咪語言!)Translate API 會在 translate.detect
' 的結果中設定較低的可信度值,以表示這個問題。
在此情況下,程式碼範例會回到 Business Messages 解析語言代碼中的語言,這是 Business Messages API 會根據訊息的結構定義來推測語言。#39;由於解析的語言代碼是 BCP-47 格式,所以您可以使用對應的 Node.js 套件剖析語言代碼中的語言代碼。
若要測試這個行為,請在代理程式中輸入一長串的胡言亂語。在大部分情況下,您不應看到變更語言的提示 (除非解析的語言代碼與目前的語言不同)。服務專員簡單來說並不瞭解你的要求。
透過提示變更語言
代理程式偵測到語言變更之後,就會傳回變更語言的提示。
if (detectedLanguage != currentLanguage) {
translateText(
"Which language would you like to use?",
SERVER_LANGUAGE,
currentLanguage
).then((normalizedTranslationNotice) => {
sendResponse(
normalizedTranslationNotice,
conversationId,
[
...new Set([detectedLanguage, currentLanguage, SERVER_LANGUAGE]),
].map((x) => createSuggestedReply(x))
);
});
}
程式碼會建立提示,並將其翻譯成目前的語言 (詳情請參閱「外寄郵件」一節中的回覆),然後傳送包含建議回覆的回應。使用者可能會以下列任一種語言對話:
- 偵測到的外語。
- 目前的對話語言。
- 伺服器內建的語言。
由於這三種語言可能重疊 (例如目前的語言已經是伺服器語言),因此伺服器會使用已設定的物件移除重複項目。然後針對每個語言建立建議的回覆:
/**
* Create a suggested reply for a language code.
* @param {string} languageCode A ISO 6391 language code.
* @return {Suggestion} The suggestion object for switching to the language.
*/
function createSuggestedReply(languageCode) {
return {
reply: {
text: ISO6391.getNativeName(languageCode),
postbackData: SWITCH_LANGUAGE_POSTBACK + languageCode,
},
};
}
建議的回覆內容會以各自的語言顯示語言名稱。例如,西班牙文會顯示為「Español」。如要取得雙碼語言的相關資訊,您可以使用 Node.js 的 ISO-639-1 程式庫。
請注意,當使用者點選這個建議時,回傳資料會傳送到伺服器。回傳資料會通知伺服器如何回應,並提供建議的背景資訊。
sendResponse
方法會將這些建議物件附加至回覆中:
let messageObject = {
…
suggestions: suggestedReplies,
};
變更對話的語言
現在請返回行動裝置,並嘗試在先前顯示的提示中按一下新的語言選項。舉例來說,如果您輸入了「Hola」,
服務專員會以新的語言回覆。我們將在後續步驟中說明如何翻譯傳出回覆。現在,請查看接收並處理您點擊的建議回覆的程式碼。
if (requestBody.suggestionResponse !== undefined) {
let postbackData = requestBody.suggestionResponse.postbackData;
if (postbackData.startsWith(SWITCH_LANGUAGE_POSTBACK)) {
let languageCode = postbackData.substr(SWITCH_LANGUAGE_POSTBACK.length);
currentLanguage = languageCode;
translateText(
"The language was set to " +
ISO6391.getName(languageCode) +
". Please repeat your request.",
SERVER_LANGUAGE,
languageCode
).then((translationNotice) => {
sendResponse(translationNotice, conversationId, []);
});
}
}
如果要求含有建議的回覆內容,伺服器會使用回傳資料來決定該怎麼做。在這個簡單的情況下,伺服器僅支援一種回傳資料 SWITCH_LANGUAGE_POSTBACK,這表示對話應立即變更為語言代碼之後的語言。剖析這個語言代碼後,伺服器會傳送訊息通知使用者語言已變更。
內送郵件翻譯
現在語言會變更,因此您可以在行動裝置上用該語言將要求傳送給語言。嘗試以新語言傳送「help」的說明。如果您已將語言改成西班牙文,請輸入「ayuda」並傳送訊息。
伺服器會透過選項選單瞭解您的說明及回覆要求。請嘗試使用其中一種來檢視硬式編碼的範例回應。
程式碼範例會使用 translateText
方法翻譯傳入和傳出的訊息。立即瞭解:
/**
* Translates text to a given target language. No translation if source and
* target language match.
*
* @param {string} text the text to translate
* @param {string} sourceLanguage The language of the source text.
* @param {string} targetLanguage The target language.
* @return A Promise with the translated text.
*/
async function translateText(text, sourceLanguage, targetLanguage) {
if (sourceLanguage === targetLanguage) {
return new Promise(function (resolve, reject) {
resolve(text);
});
}
return new Promise(function (resolve, reject) {
translate
.translate(text, targetLanguage)
.then((result) => {
if (result && result.length > 0) {
resolve(result[0]);
} else {
reject("Could not translate message");
}
})
.catch((err) => {
console.error("ERROR:", err);
reject(err);
});
});
}
如果原文語言與目標語言相同,就無須採取任何行動。否則,伺服器會呼叫 Translation API 用戶端上的 translate 方法。如同偵測方法,翻譯方法可包含多個輸入內容。由於伺服器只提供一個輸入,因此會從 Translation API 取得第一個結果。
查看回呼方法的一個部分,以目前語言回應傳入訊息:
translateText(incomingMessage, currentLanguage, SERVER_LANGUAGE).then(
(normalizedMessage) => {
let serverResponse = chooseResponseMessage(normalizedMessage);
…
}
);
伺服器會使用 translateText
的輸出內容選擇回應訊息。下一節將討論選擇回應訊息及翻譯的過程。
外寄郵件翻譯
伺服器將傳入訊息翻譯成母語後,必須選擇、翻譯,並傳送適當的回應給使用者的要求。程式碼範例會使用非常簡單的架構,將關鍵字對應至回應。請看 chooseResponseMessage
方法。
/**
* Select a topically appropriate response based on the message
* content that the user sent to the agent.
*
* @param {string} incomingMessage The content of the message that the user typed in.
* @param {string} conversationId The unique id for this user and agent.
* @return {string} A response message.
*/
function chooseResponseMessage(incomingMessage) {
let responseMapping = {
balance: "Your current balance is $500.",
deposit: "Please enter your deposit amount.",
transfer:
"Please enter the account number where you wish to transfer the funds.",
withdraw: "Please enter the amount you wish to withdraw.",
help: "Please choose what you'd like to do: balance, deposit, transfer, or withdraw.",
};
for (const [key, value] of Object.entries(responseMapping)) {
if (incomingMessage.toLowerCase().includes(key)) {
return value;
}
}
return "I didn't understand your request. Please try again.";
}
這個配置在伺服器上只支援英文,這表示伺服器必須翻譯所有內送和外寄郵件。更複雜的系統可能會支援多種語言,並以原生方式回應其他語言的要求。舉例來說,如果您的代理程式支援西班牙文,或許已在回應對應中已有「ayuda」的鍵。更複雜的系統可能也會仰賴其他方法來選擇適當的回應,例如機器學習或計分演算法。透過 Business Messages 建立更聰明的回應方式之一,就是與 Dialogflow 整合。
現在,請查看將所選訊息傳回給使用者的程式碼。
let serverResponse = chooseResponseMessage(normalizedMessage);
translateText(
serverResponse,
SERVER_LANGUAGE,
currentLanguage
).then((normalizedResponse) => {
sendResponse(normalizedResponse, conversationId, []);
});
程式碼範例會重複使用 translateText
方法,將所選回應翻譯成目前的對話語言。接著,sendResponse
方法會負責建立新的 Message 物件,並傳送給使用者。
摘要
在這個教學課程中,您已瞭解如何建立與 Cloud Translation API 的簡易整合,以及如何透過 Business Messages 的語言代碼功能觸及更多使用者。如有需要,您可以使用本教學課程中的程式碼範例做為自有整合的起點,也可以試用新功能!不妨參考下列建議:
- 傳送雙語訊息,其中包含原始訊息內容和自動翻譯的內容。
- 在對話開始時,向使用者顯示完整的支援語言選單。
- 利用詞彙表等進階 Translation API 功能,以可靠的方式翻譯企業專用字詞。
整合 Translation API 後,您就能利用高品質的機器翻譯,以最舒適的語言與更多使用者溝通交流。服務專員能以更有效率的方式執行對話,提升客戶滿意度和工作完成率。