通过谷歌翻译支持多种语言

使用 Business Messages 的语言区域和谷歌翻译的智能自动化功能 你可以使用 Google Cloud 中的 用户的首选语言。本教程将引导您完成概念验证 将 Google 翻译与 Business Messages 网络钩子集成。

所需条件

首先,您需要做好以下准备:

获取代码

本教程将为您介绍 翻译。如需获取代码,请从 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

示例代码随附了适用于 Translate API 的 Node 软件包 已安装。如果您想要了解如何安装 Node 软件包或 使用其他编程语言安装 Translate API,请参阅 Cloud Translate API 文档

如需使用 Translate API,您需要导入该库并创建 Translate 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();

从现在开始,您可以在 translate 对象上访问 Translate API 方法。

请查看在文件顶部附近创建的变量:

const SERVER_LANGUAGE = "en";
let currentLanguage = SERVER_LANGUAGE;

示例代码将服务器语言存储为常量,因为它相对来说 已修复。不过,对话的当前语言可能会发生变化,因此系统会跟踪对话 (位于 currentLanguage 变量中)。

检测传入语言

示例代码会检测传入语言是否已更改,如果已更改, 提示用户选择要在对话中使用的语言。 要在移动设备上试用此功能,只需在 英语以外的语言。如果您不懂任何其他语言,请尝试输入 “你好!”(这是西班牙语的“您好”!)。

代理会以提示询问用户是否要切换 语言。提示包含建议的回复,用户可以点击这些回复 切换到该语言。

我们先来看看语言检测功能。

/**
 * 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);
      });
  });
}

此方法使用检测方法 翻译客户端上的语言。由于 Translate API 可能会检测多种语言, 以及不同的置信度(这还在于它支持 则此方法会返回一个结果数组。该样本首先 也就是置信度最高的结果。

使用经过解析的语言区域

有时,翻译 API 无法确定 自信。例如,如果你的猫在键盘上跑来跑去输入 无意义字符串,Translate API 仍会尝试检测语言, 检测到的语言可能不正确。(毕竟,谷歌翻译 目前尚不支持猫科动物语言!)Translate API 会用 为 translate.detect 的结果设置较低的置信度值。

在这种情况下,示例代码会回退到 Business Messages 已解析的语言区域、 这是 Business Messages API 根据 消息上下文。由于已解析的语言区域采用 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))
          );
        });
      }

代码会创建一个提示,将其翻译成当前语言(有关 ),然后将 建议的回复。用户可能希望采用以下任意一种方式交谈 语言:

  • 检测到的传入语言。
  • 当前对话语言。
  • 服务器的内置语言。

由于这三种语言可能会有重叠(例如,如果当前的 语言已经是服务器语言),服务器会使用 set 对象删除 重复。然后,它会针对每种语言创建建议的回复:

/**
 * 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”请尝试点击“Español”在 建议的回复。

代理会使用新语言进行响应。我们将介绍如何翻译外发 回复。现在,我们来看一下用于接收和处理 已点击的建议回复。

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,它表示 对话应改为下列语言 代码。解析完该语言代码后,服务器将发送消息 用户语言已更改。

入站邮件翻译

更改语言后,您就可以向客服人员发送请求, 设置语言。试试发送“帮助”一词新的 语言。如果您已将语言更改为西班牙语,请输入“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);
      });
  });
}

如果源语言与目标语言相同,则系统不会 用途。否则,服务器会调用 translate 方法 翻译 API。与检测方法一样,翻译方法 接受多项输入。由于服务器只提供一个输入,因此它会获取 来自 Translate 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 Translate API 并利用 Business Messages 语言区域功能覆盖更多用户。如果您 可以参考本教程中的示例代码来着手开发 也可以尝试一些新的功能!以下是一些建议:

  • 发送包含原始邮件内容和 自动翻译的内容。
  • 在用户开始 对话。
  • 使用 Translate API 高级功能 例如术语库,可靠地翻译您的业务特有的字词。

通过集成 Translate API,您可以充分利用高质量机器翻译服务, 以便用他们最熟悉的语言与更多用户进行交流。 您的代理可以进行更高效、更高效的对话, 客户满意度和任务完成情况。