Hỗ trợ nhiều ngôn ngữ bằng Google Dịch

Với ngôn ngữ của Business Messages và các bản dịch thông minh, tự động của Google Dịch, bạn có thể mở rộng phạm vi tiếp cận của nhân viên hỗ trợ bằng cách giao tiếp với người dùng bằng ngôn ngữ họ muốn. Hướng dẫn này sẽ chỉ cho bạn cách Chứng minh khái niệm tích hợp Google Dịch với webhook Business Messages.

Những gì bạn cần

Để bắt đầu, bạn cần chuẩn bị một số việc sau:

Lấy mã

Hướng dẫn này sẽ giới thiệu cho bạn mã webhook mẫu tích hợp với Google Dịch. Để lấy mã, hãy sao chép kho lưu trữ từ GitHub:

git clone https://github.com/google-business-communications/bm-nodejs-translation-tutorial

Chuyển đến thư mục sao chép và đặt khóa tài khoản dịch vụ của bạn vào thư mục tài nguyên:

cp credentials.json bm-nodejs-translation-sample/resources/bm-agent-service-account-credentials.json

LƯU Ý: Nếu bạn cần trợ giúp về cách thiết lập hoặc tải khoá dịch vụ xuống, hãy xem Hướng dẫn quản lý tài khoản dịch vụ của Google Cloud.

Sau khi hoàn tất bước này, bạn có thể triển khai mã:

gcloud app deploy

Dùng thiết bị di động của bạn để gửi một số tin nhắn cho nhân viên hỗ trợ. Hãy thử gửi thông báo bằng nhiều ngôn ngữ và xem điều gì sẽ xảy ra.

Thiết lập API Dịch

Mã mẫu đi kèm với gói Node cho API của Dịch đã cài đặt. Nếu bạn muốn biết cách cài đặt gói Node hoặc cách cài đặt API API bằng một ngôn ngữ lập trình khác, hãy xem tài liệu về API của Google Dịch.

Để sử dụng API Dịch, bạn cần nhập thư viện và tạo một ứng dụng API Dịch. Mở tệp routes/index.js. Các dòng có liên quan là:

// Import the Translate API library.
const { Translate } = require("@google-cloud/translate").v2;
// Create a new Translate API client.
const translate = new Translate();

Từ giờ trở đi, bạn có thể truy cập vào các phương thức API Dịch trên đối tượng dịch.

Hãy xem các biến được tạo ở gần đầu tệp:

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

Mã mẫu lưu trữ ngôn ngữ máy chủ dưới dạng hằng số vì mã này tương đối cố định. Tuy nhiên, ngôn ngữ hiện tại của cuộc trò chuyện có thể thay đổi nên sẽ được theo dõi trong biến currentLanguage.

Đang phát hiện ngôn ngữ đến

Mã mẫu phát hiện xem ngôn ngữ đến có thay đổi hay không và nếu có, hãy nhắc người dùng chọn ngôn ngữ họ muốn sử dụng trong cuộc trò chuyện. Hãy thử tính năng này trên thiết bị di động bằng cách nhập nội dung tin nhắn thông qua một ngôn ngữ khác ngoài tiếng Anh cho nhân viên hỗ trợ. Nếu bạn không biết ngôn ngữ nào khác, hãy thử nhập &&tt;Hola" (tiếng Tây Ban Nha là "Hello"!).

Nhân viên hỗ trợ trả lời bằng lời nhắc hỏi xem người dùng có muốn chuyển đổi ngôn ngữ hay không. Lời nhắc bao gồm các câu trả lời được đề xuất mà người dùng có thể nhấp để chuyển sang ngôn ngữ đó.

Trước tiên, hãy xem tính năng phát hiện ngôn ngữ.

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

Phương thức này sử dụng phương thức phát hiện trên ứng dụng dịch. Vì API Dịch có thể phát hiện nhiều ngôn ngữ với độ tin cậy khác nhau (và cũng hỗ trợ nhiều dữ liệu đầu vào), nên phương thức này trả về một loạt kết quả. Mẫu lấy kết quả đầu tiên, là kết quả có độ tin cậy cao nhất.

Sử dụng ngôn ngữ đã phân giải

Đôi khi API Dịch không thể xác định ngôn ngữ thông báo với độ tin cậy cao. Ví dụ: nếu con mèo chạy trên bàn phím và nhập một chuỗi vô nghĩa, API Dịch vẫn cố gắng phát hiện ngôn ngữ, nhưng ngôn ngữ được phát hiện có thể không chính xác. (Sau cùng, Google Dịch chưa hỗ trợ ngôn ngữ của mèo). API Dịch cho biết điều này bằng cách đặt giá trị độ tin cậy thấp trong kết quả translate.detect#39;

Trong trường hợp này, mã mẫu sẽ chuyển về ngôn ngữ ngôn ngữ Business Messages đã phân giải. Đây là phỏng đoán tốt nhất của API Business Messages về ngôn ngữ dựa trên ngữ cảnh của thông báo. Vì ngôn ngữ được phân giải ở định dạng BCP-47, nên bạn có thể sử dụng gói Node.js tương ứng để phân tích cú pháp mã ngôn ngữ từ ngôn ngữ đó.

Bạn có thể kiểm tra hành vi này bằng cách nhập một chuỗi dài vô nghĩa cho tác nhân. Trong hầu hết trường hợp, bạn sẽ không thấy lời nhắc thay đổi ngôn ngữ (trừ khi ngôn ngữ được phân giải khác với ngôn ngữ hiện tại). Nhân viên hỗ trợ chỉ nói rằng họ không hiểu yêu cầu của bạn.

Nhắc thay đổi ngôn ngữ

Sau khi phát hiện ngôn ngữ đã thay đổi, nhân viên hỗ trợ sẽ gửi lại lời nhắc để thay đổi ngôn ngữ.

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

Mã này sẽ tạo lời nhắc, dịch sang ngôn ngữ hiện tại (xem thêm thông tin đó trong phần Dịch tin nhắn đi), sau đó gửi phản hồi kèm theo các phản hồi đề xuất. Người dùng có thể muốn nói bằng bất kỳ ngôn ngữ nào sau đây:

  • Ngôn ngữ được phát hiện.
  • Ngôn ngữ trò chuyện hiện tại.
  • Ngôn ngữ tích hợp sẵn của máy chủ.

Vì có thể trùng lặp ở ba ngôn ngữ này (ví dụ: nếu ngôn ngữ hiện tại đã là ngôn ngữ máy chủ), máy chủ sẽ sử dụng một đối tượng đã đặt để xoá các bản sao. Sau đó, hệ thống sẽ tạo một câu trả lời đề xuất cho từng ngôn ngữ:

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

Câu trả lời đề xuất cho thấy tên ngôn ngữ bằng ngôn ngữ của chính ngôn ngữ đó. Ví dụ: Tiếng Tây Ban Nha xuất hiện dưới dạng "Español." Để nhận thông tin về một ngôn ngữ bằng mã ngôn ngữ gồm hai chữ số, bạn có thể sử dụng thư viện ISO-639-1 cho Node.js.

Lưu ý dữ liệu đăng lại sẽ được gửi đến máy chủ khi người dùng nhấp vào đề xuất này. Dữ liệu đăng lại cho máy chủ biết cách phản hồi và cung cấp ngữ cảnh về đề xuất.

Phương thức sendResponse sẽ đính kèm các đối tượng đề xuất này vào nội dung trả lời:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

Thay đổi ngôn ngữ của cuộc trò chuyện

Bây giờ, hãy quay lại thiết bị di động của bạn và thử nhấp vào một tuỳ chọn ngôn ngữ mới trong lời nhắc trước đó. Ví dụ: nếu bạn đã nhập "Hola," thử nhấp vào "Español" trong các câu trả lời được đề xuất.

Nhân viên hỗ trợ sẽ trả lời bằng ngôn ngữ mới. Chúng tôi sẽ trình bày cách dịch câu trả lời đi trước ở bước sau. Bây giờ, hãy xem mã nhận và xử lý câu trả lời đề xuất mà bạn nhấp vào.

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, []);
      });
    }
  }

Nếu yêu cầu chứa câu trả lời cho một đề xuất, máy chủ sẽ sử dụng dữ liệu đăng lại để xác định việc cần làm. Trong trường hợp đơn giản này, máy chủ chỉ hỗ trợ một loại dữ liệu đăng lại, CHUYỂN ĐỔINGÔN NGỮ_POST_ để cho biết rằng cuộc trò chuyện sẽ thay đổi sang ngôn ngữ bằng mã ngôn ngữ ngay sau đó. Sau khi phân tích cú pháp mã ngôn ngữ này, máy chủ sẽ gửi thông báo cho người dùng về việc ngôn ngữ đã thay đổi.

Dịch thư đến

Sau khi thay đổi ngôn ngữ, bạn có thể gửi yêu cầu cho tác nhân bằng ngôn ngữ đó trên thiết bị di động. Hãy thử gửi từ cho "help" bằng ngôn ngữ mới. Nếu bạn đã thay đổi ngôn ngữ thành tiếng Tây Ban Nha, hãy nhập "ayuda" và gửi thông báo.

Máy chủ sẽ hiểu yêu cầu trợ giúp và trả lời của bạn qua trình đơn tuỳ chọn. Hãy thử một trong các cách sau để xem phản hồi mẫu được mã hóa cứng.

Mã mẫu sử dụng phương thức translateText để dịch cả tin nhắn đến và đi. Hãy xem ngay:

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

Nếu ngôn ngữ nguồn giống với ngôn ngữ đích, bạn không cần làm gì cả. Nếu không, máy chủ sẽ gọi phương thức dịch trên ứng dụng dịch API. Giống như phương thức phát hiện, phương thức dịch có thể sử dụng nhiều thông tin đầu vào. Vì máy chủ chỉ cung cấp một dữ liệu đầu vào, nên kết quả đầu tiên sẽ được lấy từ API Dịch.

Xem phần phương thức gọi lại phản hồi tin nhắn đến bằng ngôn ngữ hiện tại:

translateText(incomingMessage, currentLanguage, SERVER_LANGUAGE).then(
          (normalizedMessage) => {
            let serverResponse = chooseResponseMessage(normalizedMessage);
            …
          }
        );

Máy chủ sử dụng kết quả từ translateText để chọn thư phản hồi. Phần tiếp theo sẽ đi sâu vào quy trình chọn thông báo phản hồi và dịch thông báo đó.

Dịch tin nhắn đi

Sau khi máy chủ dịch thông báo đến sang tiếng Anh gốc, máy chủ phải chọn, dịch và gửi phản hồi thích hợp cho yêu cầu của người dùng. Mã mẫu sử dụng lược đồ rất đơn giản để ánh xạ từ khóa tới nội dung phản hồi. Hãy xem phương thức 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.";
}

Lược đồ này chỉ hỗ trợ tiếng Anh trên máy chủ, nghĩa là máy chủ phải dịch tất cả các thư đến và đi. Một hệ thống phức tạp hơn có thể hỗ trợ nhiều ngôn ngữ và phản hồi mọi yêu cầu bằng các ngôn ngữ khác. Ví dụ: nếu nhân viên hỗ trợ của bạn hỗ trợ tiếng Tây Ban Nha, thì nhân viên hỗ trợ đó có thể đã có khóa cho "ayuda" trong bản đồ phản hồi. Các hệ thống phức tạp hơn cũng có thể dựa vào các phương pháp khác để chọn phản hồi thích hợp, chẳng hạn như công nghệ máy học hoặc thuật toán tính điểm. Một cách để tạo câu trả lời thông minh hơn bằng Business Messages là tích hợp với Dialogflow.

Bây giờ, hãy xem xét mã gửi lại thông báo đã chọn cho người dùng.

let serverResponse = chooseResponseMessage(normalizedMessage);
            translateText(
              serverResponse,
              SERVER_LANGUAGE,
              currentLanguage
            ).then((normalizedResponse) => {
              sendResponse(normalizedResponse, conversationId, []);
            });

Mã mẫu sử dụng lại phương thức translateText để dịch phản hồi đã chọn sang ngôn ngữ trò chuyện hiện tại. Sau đó, phương thức sendResponse sẽ đảm nhận việc tạo đối tượng Tin nhắn mới và gửi đối tượng đó đến người dùng.

Tóm tắt

Trong hướng dẫn này, bạn đã tìm hiểu cách tích hợp đơn giản với API Cloud Dịch và sử dụng các tính năng ngôn ngữ Business Messages để tiếp cận nhiều người dùng hơn. Nếu muốn, bạn có thể sử dụng mã mẫu trong hướng dẫn này làm điểm khởi đầu cho quá trình tích hợp của riêng bạn, hoặc bạn có thể thử mã mới! Dưới đây là một số ý tưởng:

  • Gửi tin nhắn song ngữ chứa cả nội dung tin nhắn gốc và nội dung đã dịch tự động.
  • Trình bày cho người dùng một trình đơn đầy đủ các ngôn ngữ được hỗ trợ khi họ bắt đầu cuộc trò chuyện.
  • Sử dụng các tính năng API Dịch nâng cao như bảng chú giải thuật ngữ để dịch các từ dành riêng cho doanh nghiệp của bạn một cách đáng tin cậy.

Bằng cách tích hợp với API Dịch, bạn có thể tận dụng bản dịch máy chất lượng cao để giao tiếp với nhiều người dùng hơn bằng ngôn ngữ phù hợp nhất. Nhân viên hỗ trợ của bạn có thể có các cuộc trò chuyện hiệu quả hơn và hiệu quả hơn, làm tăng mức độ hài lòng của khách hàng và hoàn thành công việc.