Compatibilidade com vários idiomas com o Google Tradutor

Com as localidades do Business Messages e o Google Tradutor inteligente e automatizado, você pode expandir o alcance do agente se comunicando com usuários no idioma de preferência. Neste tutorial, você vai aprender a usar uma integração de prova de conceito do Google Tradutor com um webhook do Business Messages.

O que é necessário

Para começar, você precisará preparar os seguintes itens:

Acessar o código

Neste tutorial, você vai ver um exemplo de código do webhook integrado ao Google Tradutor. Para receber o código, clone o repositório do GitHub:

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

Navegue até o diretório clonado e coloque a chave da sua conta de serviço no diretório de recursos:

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

DICA: se precisar de ajuda para configurar ou fazer o download da chave de serviço, consulte o Guia do Google Cloud para gerenciar contas de serviço.

Depois de fazer isso, implante o código:

gcloud app deploy

Usando seu dispositivo móvel, envie algumas mensagens para o agente. Tente enviar suas mensagens em idiomas diferentes e veja o que acontece.

Configurar a API Tradutor

O exemplo de código vem com o pacote do Node para a API Tradutor já instalado. Se você estiver interessado em instalar o pacote do Node ou como instalar a API Tradutor em uma linguagem de programação diferente, consulte os documentos da API Cloud Translate.

Para usar a API Tradutor, é necessário importar a biblioteca e criar um cliente da API Tradutor. Abra o arquivo routes/index.js. As linhas relevantes são as seguintes:

// 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 agora, você pode acessar os métodos da API Tradutor no objeto "translate".

Veja as variáveis criadas na parte superior do arquivo:

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

O exemplo de código armazena a linguagem do servidor como uma constante porque ele é relativamente fixo. No entanto, o idioma atual da conversa pode mudar, por isso ela é rastreada na variável currentLanguage.

Como detectar o idioma de entrada

O exemplo de código detecta se o idioma recebido mudou e, em caso afirmativo, solicita ao usuário que escolha o idioma que quer usar na conversa. Teste esse recurso no seu dispositivo móvel digitando uma mensagem para o agente em um idioma diferente do inglês. Se você não souber nenhum outro idioma, tente digitar "Hola" (e'espanhol para "Hello"!).

O agente responde com uma solicitação perguntando se o usuário quer alternar os idiomas. O prompt inclui respostas sugeridas em que o usuário pode clicar para mudar para esse idioma.

Primeiro, vamos analisar o recurso de detecção de idioma.

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

Esse método usa o método de detecção no cliente de tradução. Como a API Tradutor pode detectar vários idiomas com diferentes níveis de confiança e também compatível com várias entradas, esse método retorna uma matriz de resultados. A amostra considera o primeiro resultado, que é o resultado com a maior confiança.

Como usar a localidade resolvida

Às vezes, a API Tradutor não consegue determinar o idioma da mensagem com alta confiança. Por exemplo, se seu gato for executado no teclado e inserir uma string insatisfatória, a API Tradutor ainda vai tentar detectar o idioma, mas o idioma detectado provavelmente está incorreto. Afinal, o Google Tradutor ainda não oferece suporte a idiomas felinos. A API Tradutor indica isso definindo um valor de baixa confiança no resultado do translate.detect'

Nesse cenário, o código de amostra volta para o idioma na localidade resolvida do Business Messages, que é o melhor palpite para o idioma da API Business Messages com base no contexto da mensagem. Como a localidade resolvida está no formato BCP-47, você pode usar o pacote Node.js correspondente para analisar o código do idioma da localidade.

Para testar esse comportamento, digite uma longa string sem sentido para o agente. Na maioria dos casos, você não verá uma solicitação para mudar o idioma, a menos que a localidade resolvida seja diferente do idioma atual. O agente simplesmente diz que não entende sua solicitação.

Pedido para mudar o idioma

Depois de detectar que o idioma foi alterado, o agente retorna uma solicitação para mudar o 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))
          );
        });
      }

O código cria uma solicitação, a traduz para o idioma atual (mais sobre isso na seção "Saída de mensagem de saída") e envia uma resposta com respostas sugeridas. O usuário pode querer falar em um dos seguintes idiomas:

  • Idioma de entrada detectado.
  • O idioma da conversa atual.
  • O idioma integrado do servidor.

Como pode haver sobreposição nessas três linguagens (por exemplo, se a linguagem atual já for a do servidor), ele usará um objeto definido para remover cópias. Em seguida, ela cria uma resposta 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,
    },
  };
}

A resposta sugerida mostra o nome do próprio idioma. Por exemplo, o espanhol aparece como "Español." Para receber informações sobre um idioma pelo código de dois dígitos dele, use a biblioteca ISO-639-1 para Node.js (em inglês).

Observe os dados de postback, que são enviados ao servidor quando o usuário clica nessa sugestão. Os dados de postback informam ao servidor como responder e apresentam contexto sobre a sugestão.

O método sendResponse anexa esses objetos de sugestão à resposta:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

Como mudar o idioma da conversa

Agora, volte para seu dispositivo móvel e tente clicar em uma nova opção de idioma no prompt. Por exemplo, se você digitou "Hola," tente clicar em "Español" nas respostas sugeridas.

O agente responde no novo idioma. Falaremos sobre como traduzir respostas enviadas em uma etapa posterior. Por enquanto, observe o código que recebe e processa a resposta sugerida em que você clicou.

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

Se a solicitação contiver uma resposta a uma sugestão, o servidor usará os dados de postback para determinar o que fazer. Nesse caso simples, o servidor aceitará apenas um tipo de dados de postback, o SWITCH_LANGUAGE_POSTBACK, o que significa que a conversa mudará para o idioma no código de idioma imediatamente seguinte. Após analisar esse código de idioma, o servidor envia uma mensagem para notificar o usuário de que o idioma foi alterado.

Tradução de mensagens recebidas

Agora, com o idioma alterado, é possível enviar uma solicitação ao agente nesse idioma no seu dispositivo móvel. Tente enviar a palavra para "quot;help" no novo idioma. Se você mudou o idioma para espanhol, digite "ayuda" e envie a mensagem.

O servidor entende sua solicitação de ajuda e responde com o menu de opções. Tente qualquer um deles para ver um exemplo de resposta codificada.

O exemplo de código usa o método translateText para traduzir mensagens recebidas e enviadas. Dê uma olhada agora:

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

Se o idioma de origem for o mesmo que o idioma de destino, não haverá nada a ser feito. Caso contrário, o servidor chamará o método de tradução no cliente da API Tradutor. Assim como o método de detecção, o método de tradução pode receber várias entradas. Como o servidor fornece apenas uma entrada, ele usa o primeiro resultado da API Tradutor.

Veja a seção do método de callback que responde às mensagens recebidas no idioma atual:

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

O servidor usa a saída de translateText para escolher uma mensagem de resposta. A próxima seção analisa o processo de escolha da mensagem de resposta e tradução dela.

Tradução de mensagens de saída

Depois que o servidor traduzir a mensagem recebida para o inglês nativo, ele precisará escolher, traduzir e enviar uma resposta apropriada para a solicitação do usuário. O exemplo de código usa um esquema muito simples que associa palavras-chave a respostas. Veja o 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.";
}

Esse esquema só aceita inglês no servidor, o que significa que o servidor precisa traduzir todas as mensagens de entrada e saída. Um sistema mais sofisticado pode oferecer suporte a vários idiomas e responder nativamente a solicitações em outros idiomas. Por exemplo, se o agente aceita o espanhol, é possível que ele já tenha uma chave para "quot;ayuda" no mapa de resposta. Sistemas mais sofisticados também podem depender de outras metodologias para escolher uma resposta adequada, como ML ou algoritmos de pontuação. Uma maneira de criar respostas mais inteligentes com o Business Messages é fazer a integração com o Dialogflow.

Agora veja o código que envia a mensagem escolhida de volta para o usuário.

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

O exemplo de código reutiliza o método translateText para traduzir a resposta escolhida para o idioma de conversa atual. O método sendResponse, em seguida, cuida da criação do novo objeto Message e o envio ao usuário.

Resumo

Neste tutorial, você aprendeu a criar uma integração simples com a API Cloud Tradutor e a usar os recursos de localidade do Business Messages para alcançar mais usuários. Se você quiser, use o exemplo de código neste tutorial como ponto de partida para sua integração ou teste algo novo. Veja algumas ideias:

  • Envie mensagens bilíngues com conteúdo original da mensagem e o conteúdo traduzido automaticamente.
  • Apresentar ao usuário um menu completo de idiomas com suporte quando ele iniciar uma conversa.
  • Use os recursos avançados da API Tradutor, como glossários, para traduzir palavras específicas de maneira confiável para sua empresa.

Ao se integrar às APIs do Google Tradutor, você aproveita a tradução automática de alta qualidade para se comunicar com mais usuários no idioma mais confortável por eles. Seu agente pode ter conversas mais produtivas e eficientes, aumentando a satisfação do cliente e a conclusão de tarefas.