Google 翻譯支援多種語言

使用 Business Messages 的語言代碼和 Google 翻譯的智慧自動翻譯功能,就能以偏好的語言與使用者交流,擴大虛擬服務專員的觸及範圍。這個教學課程會引導您使用 Business Messages Webhook 進行 Google 翻譯的概念驗證。

軟硬體需求

您必須符合以下條件,才能開始使用這項服務:

取得程式碼

本教學課程會逐步說明與 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 後,您就能利用高品質的機器翻譯,以最舒適的語言與更多使用者溝通交流。服務專員能以更有效率的方式執行對話,提升客戶滿意度和工作完成率。