Compatibilidad con varios idiomas con Google Traductor

Con la configuración regional de Business Messages y la herramienta inteligente traducción, puedes expandir el alcance de tu agente comunicándote con los usuarios su idioma preferido. En este instructivo, se explica una prueba de concepto de Google Traductor con un webhook de Business Messages.

Requisitos

Para empezar, debes preparar lo siguiente:

Obtén el código

En este instructivo, se explica el código de webhook de muestra que se integra en Google Traducir. Para obtener el código, clona el repositorio desde GitHub:

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

Navega al directorio clonado y coloca la clave de tu cuenta de servicio en el directorio de recursos:

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

SUGERENCIA: Si necesitas ayuda para configurar o descargar la clave de servicio, consulta el Guía de Google Cloud para administrar cuentas de servicio.

Una vez hecho esto, puedes implementar el código:

gcloud app deploy

Con tu dispositivo móvil, envía algunos mensajes al agente. Intenta enviar tu mensajes en diferentes idiomas y ver qué sucede.

Configura la API de Translate

El código de muestra ya viene con el paquete Node para la API de Translate esté instalado. Si te interesa cómo instalar el paquete de Node o cómo instalar la API de Translate en un lenguaje de programación diferente, consulta la Documentos de la API de Cloud Translate.

Para usar la API de Translate, debes importar la biblioteca y crear una instancia de Translate cliente de API. Abre el archivo routes/index.js. Las líneas relevantes son las siguientes:

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

A partir de ahora, puedes acceder a los métodos de la API de Translate.

Observa las variables creadas cerca de la parte superior del archivo:

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

El código de muestra almacena el lenguaje del servidor como una constante porque es relativamente y solucionar el problema. Sin embargo, el idioma actual de la conversación puede cambiar, por lo que se realiza un seguimiento en la variable currentLanguage

Cómo detectar el idioma entrante

El código de muestra detecta si cambió el idioma entrante y, de ser así, Le pide al usuario que elija el idioma que le gustaría usar en la conversación. Para probar esta función en tu dispositivo móvil, escribe un mensaje al agente en un idioma además del inglés. Si no sabes ningún otro idioma, intenta escribir “Hello” (que significa "¡Hola!" en español).

El agente responde con un mensaje preguntando si el usuario desea realizar el cambio. idiomas. El mensaje incluye respuestas sugeridas en las que el usuario puede hacer clic cambiar a ese idioma.

Primero, veamos la función de detección de idiomas.

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

Este método usa el método de detección en el cliente de Traductor. Porque la API de Translate puede detectar varios idiomas con distintos niveles de confianza (y también porque admite múltiples entradas), este método muestra un array de resultados. La muestra toma el primer resultado, que es el que tiene el mayor nivel de confianza.

Usa la configuración regional resuelta

A veces, la API de Translate no puede determinar el idioma de los mensajes con un confianza. Por ejemplo, si tu gato cruza tu teclado y escribe un sin sentido, la API de Translate sigue intentando detectar el idioma, pero es probable que el idioma detectado no sea el correcto. Después de todo, Google Traductor todavía no admite lenguajes felinos) La API de Translate indica esto estableciendo un valor de confianza bajo en el resultado de translate.detect.

En esta situación, el código de muestra recurre al lenguaje del Configuración regional resuelta de Business Messages, cuál es la mejor suposición de la API de Business Messages al idioma según el el contexto del mensaje. Como la configuración regional resuelta está en formato BCP-47, puedes usar el paquete de Node.js correspondiente y analizar el código de idioma de la configuración regional.

Para probar este comportamiento, escribe una larga cadena de texto incoherente en el agente. En la mayoría de los casos, no deberías ver un mensaje para cambiar el idioma (a menos que el la configuración regional resuelta sea diferente del idioma actual). El agente simplemente dice no comprende tu solicitud.

Instrucciones para cambiar el idioma

Después de detectar que el idioma ha cambiado, el agente envía un mensaje a cambiar el idioma.

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

El código crea una instrucción y la traduce al idioma actual (más información sobre ese tema). en la sección Traducción de mensajes salientes), envía una respuesta con respuestas sugeridas. El usuario podría querer hablar en cualquiera de las siguientes idiomas:

  • El idioma entrante detectado.
  • El idioma actual de la conversación.
  • El lenguaje integrado del servidor.

Debido a que puede haber una superposición en estos tres idiomas (por ejemplo, si el ya es el idioma del servidor), el servidor usa un objeto establecido para quitar o duplicados. Luego, crea una respuesta sugerida para cada idioma:

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

La respuesta sugerida muestra el nombre del idioma en su propio idioma. Por ejemplo: El idioma español aparece como "Español". Para obtener información sobre un idioma a partir de su código de idioma de dos dígitos, puedes usar la biblioteca ISO-639-1 para Node.js.

Observa los datos de notificación de conversión, que se envían al servidor cuando el usuario hace clic en esta sugerencia. Los datos de notificación de conversión le indican al servidor cómo responder y proporciona contexto sobre la sugerencia.

El método sendResponse adjunta estos elementos: objetos de sugerencia a la respuesta:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

Cambiar el idioma de la conversación

Ahora vuelve a tu dispositivo móvil e intenta hacer clic en una opción de idioma nuevo en la que mencionamos antes. Por ejemplo, si escribiste "Hola", haz clic en "Español" en las respuestas sugeridas.

El agente responderá en el idioma nuevo. Abordaremos cómo traducir mensajes respuestas en un paso posterior. Por ahora, observa el código que recibe y procesa la respuesta sugerida en la que hiciste clic.

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

Si la solicitud contiene una respuesta a una sugerencia, el servidor usa la notificación de conversión. para determinar qué hacer. En este caso simple, el servidor solo admite una de notificación de conversión, el SWITCH_LANGUAGE_POSTBACK, que significa que el conversación debe cambiar al idioma que aparece inmediatamente a continuación. código. Después de analizar este código de idioma, el servidor envía un mensaje para notificar al usuario de que el idioma ha cambiado.

Traducción de mensajes entrantes

Ahora que el idioma cambió, puedes enviar una solicitud al agente en ese idioma en tu dispositivo móvil. Intenta enviar la palabra "ayuda" en la nueva idioma. Si cambiaste el idioma a español, escribe "ayuda" y envía el mensaje.

El servidor entiende tu solicitud de ayuda y responde con el menú de opciones de estado. Prueba cualquiera de las siguientes para ver una respuesta de muestra hard-coded.

El código de muestra usa el método translateText para traducir mensajes entrantes y los mensajes salientes. Míralo ahora:

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

Si el idioma de origen es el mismo que el idioma objetivo, no se requiere tareas. De lo contrario, el servidor llama al método de traducción en el cliente de la API de Translate. Al igual que el método de detección, el método de traducción puede pueden tomar múltiples entradas. Como el servidor proporciona una sola entrada, toma la primer resultado de la API de Translate.

Observa la sección del método de devolución de llamada que responde a los mensajes entrantes en el idioma actual:

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

El servidor usa la salida de translateText para elegir un mensaje de respuesta. La siguiente sección profundiza en el proceso de elección del mensaje de respuesta y traducirlo.

Traducción de mensajes salientes

Una vez que el servidor traduce el mensaje entrante a su inglés nativo, para elegir, traducir y enviar una respuesta adecuada a la solicitud del usuario. El código de muestra utiliza un esquema muy simple que asigna palabras clave a las respuestas. Tener observa el método 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.";
}

Este esquema solo admite el idioma inglés en el servidor, lo que significa que este debe traducir todos los mensajes entrantes y salientes. Un sistema más sofisticado podría admiten varios idiomas y responden de forma nativa a las solicitudes en otros idiomas. Por ejemplo, si tu agente admite español, es posible que ya tenga una clave para "ayuda" en el mapa de respuestas. Los sistemas más sofisticados también pueden basarse en otras metodologías para elegir una respuesta adecuada, como el AA o la puntuación con algoritmos criptográficos eficaces. Una forma de crear respuestas más inteligentes con Business Messages es integrarlo en Dialogflow.

Ahora observa el código que devuelve el mensaje elegido al usuario.

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

El código de muestra reutiliza el método translateText para traducir la selección respuesta al idioma actual de la conversación. Luego, el método sendResponse se encarga de crear el nuevo objeto Message y enviarlo al usuario.

Resumen

En este instructivo, aprendiste a crear una integración simple en la API de Cloud Translate y aprovecha las funciones de configuración regional de Business Messages para llegar a más usuarios. Si por ejemplo, puedes usar el código de muestra de este instructivo como punto de partida para tu tu propia integración o puedes probar algo nuevo. A continuación, le proponemos algunas ideas:

  • Envía mensajes bilingües que incluyan tanto el contenido del mensaje original como el el contenido traducido automáticamente.
  • Ofrecer al usuario un menú completo de idiomas compatibles cuando comience un conversación.
  • Usar las funciones avanzadas de la API de Translate como glosarios para traducir de forma confiable palabras específicas de su empresa.

Con la integración de las APIs de Translate, puedes aprovechar para comunicarse con más usuarios en su idioma más cómodo. Tu agente puede tener conversaciones más productivas y eficientes, lo que aumenta la satisfacción del cliente y la realización de tareas.