Поддержка нескольких языков с помощью Google Translate

Благодаря языковым настройкам Business Messages и интеллектуальному автоматическому переводу Google Translate вы можете расширить возможности своего агента, общаясь с пользователями на предпочитаемом ими языке. В этом учебном пособии вы проведете проверку концепции интеграции Google Translate с веб-перехватчиком Business Messages.

Что вам понадобится

Для начала вам потребуется подготовить следующие несколько вещей:

Получить код

В этом руководстве вы познакомитесь с примером кода веб-перехватчика, который интегрируется с Google Translate. Чтобы получить код, клонируйте репозиторий с 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

Используя мобильное устройство, отправьте несколько сообщений агенту. Попробуйте отправлять сообщения на разных языках и посмотрите, что получится.

Настройте API перевода

Пример кода поставляется с уже установленным пакетом Node для Translate API. Если вам интересно, как установить пакет 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 API для объекта перевода.

Взгляните на переменные, созданные в верхней части файла:

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

В примере кода язык сервера хранится как константа, поскольку он относительно фиксирован. Однако текущий язык беседы может измениться, поэтому он отслеживается в переменной currentLanguage .

Обнаружение входящего языка

Пример кода определяет, изменился ли входящий язык, и если да, предлагает пользователю выбрать язык, который он хотел бы использовать в разговоре. Попробуйте эту функцию на своем мобильном устройстве, набрав сообщение агенту на другом языке, кроме английского. Если вы не знаете других языков, попробуйте ввести «Hola» (это по-испански «Привет»!).

Агент отвечает запросом на переключение языков. Приглашение включает предлагаемые ответы, которые пользователь может щелкнуть, чтобы переключиться на этот язык.

Давайте сначала посмотрим на функцию определения языка.

/**
 * 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 может обнаруживать несколько языков с разным уровнем достоверности (а также поскольку он поддерживает несколько входных данных), этот метод возвращает массив результатов. Выборка берет первый результат, который является результатом с наивысшей достоверностью.

Использование разрешенной локали

Иногда Translate API не может с высокой степенью достоверности определить язык сообщений. Например, если ваш кот пробегает по вашей клавиатуре и вводит бессмысленную строку, API-интерфейс Translate все еще пытается определить язык, но обнаруженный язык, вероятно, неверен. (В конце концов, Google Translate пока не поддерживает кошачьи языки!) API Translate указывает на это, устанавливая низкое значение достоверности в результате translate.detect .

В этом сценарии пример кода возвращается к языку в разрешенной локали Business Messages , что является лучшим предположением API Business Messages в отношении языка на основе контекста сообщения. Поскольку разрешенный языковой стандарт имеет формат 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». Чтобы получить информацию о языке из его двузначного кода языка, вы можете использовать библиотеку ISO-639-1 для Node.js.

Обратите внимание на данные обратной передачи, которые отправляются на сервер, когда пользователь нажимает на это предложение. Данные обратной передачи сообщают серверу, как реагировать, и предоставляют контекст предложения.

Метод 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 вы можете использовать высококачественный машинный перевод, чтобы общаться с большим количеством пользователей на наиболее удобном для них языке. Ваш агент может вести более продуктивные и эффективные переговоры, повышая удовлетворенность клиентов и выполнение задач.