Supporto di più lingue con Google Traduttore

Con le impostazioni internazionali di Business Messages e la traduzione intelligente e automatica di Google Traduttore, puoi espandere la copertura degli agenti comunicando con gli utenti nella loro lingua preferita. Questo tutorial illustra un'integrazione di proof of concept di Google Traduttore con un webhook di Business Messages.

Che cosa ti serve

Per iniziare, devi preparare quanto segue:

Ottieni il codice

Questo tutorial illustra un codice webhook di esempio che si integra con Google Traduttore. Per ottenere il codice, clona il repository da GitHub:

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

Vai alla directory clonata e inserisci la chiave dell'account di servizio nella directory delle risorse:

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

SUGGERIMENTO: se hai bisogno di aiuto per configurare o scaricare la tua chiave di servizio, consulta la guida di Google Cloud per la gestione degli account di servizio.

Una volta completata questa operazione, puoi eseguire il deployment del codice:

gcloud app deploy

Utilizzando il tuo dispositivo mobile, invia alcuni messaggi all'agente. Prova a inviare i messaggi in diverse lingue e guarda cosa succede.

Configurare l'API Traduttore

Il codice campione è incluso nel pacchetto del nodo per l'API Translate già installata. Se vuoi installare il pacchetto nodo o installare l'API Traduttore in un linguaggio di programmazione diverso, consulta la documentazione dell'API Cloud Translate.

Per utilizzare l'API Traduttore, devi importare la libreria e creare un client API Translate. Apri il file routes/index.js. Le righe pertinenti sono:

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

D'ora in poi, potrai accedere ai metodi dell'API Traduttore sull'oggetto Traduttore.

Dai un'occhiata alle variabili create nella parte superiore del file:

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

Il codice campione archivia il linguaggio del server come costante perché è relativamente fisso. Tuttavia, la lingua corrente della conversazione può cambiare, quindi viene monitorata nella variabile currentLanguage.

Rilevamento della lingua in arrivo

Il codice di esempio rileva se la lingua in arrivo è cambiata e, in tal caso, suggerisce all'utente di scegliere la lingua che vuole utilizzare nella conversazione. Prova questa funzionalità sul tuo dispositivo mobile digitando un messaggio per l'agente in una lingua diversa dall'inglese. Se non conosci altre lingue, prova a digitare "Hola". (Quello è lo spagnolo per "Ciao").

L'agente risponde con una richiesta chiedendo se l'utente vuole cambiare lingua. Il messaggio include risposte suggerite su cui l'utente può fare clic per passare a quella lingua.

Diamo anzitutto un'occhiata alla funzionalità di rilevamento della lingua.

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

Questo metodo utilizza il metodo di rilevamento sul client di traduzione. Poiché l'API Traduttore può rilevare più lingue con diversi livelli di affidabilità (e anche perché supporta più input), questo metodo restituisce una serie di risultati. Il campione prende il primo risultato, ovvero quello con la massima affidabilità.

Utilizzo delle impostazioni internazionali risolte

A volte l'API Traduttore non è in grado di determinare il linguaggio del messaggio con un'elevata affidabilità. Ad esempio, se il tuo gatto corre attraverso la tastiera e inserisce una stringa senza senso, l'API Translate prova comunque a rilevare la lingua, ma probabilmente la lingua rilevata è sbagliata. Dopo tutto, Google Traduttore non supporta ancora le lingue feline. L'API Translate indica questo valore impostando un valore di confidenza basso nel risultato di translate.detect.

In questo scenario, il codice campione torna alla lingua nella area geografica risolta di Business Messages, che è la migliore ipotesi dell'API Business Messages nella lingua in base al contesto del messaggio. Poiché le impostazioni internazionali risolte sono in formato BCP-47, puoi utilizzare il pacchetto Node.js corrispondente per analizzare il codice lingua dalle impostazioni internazionali.

Puoi verificare questo comportamento digitando una lunga stringa di contenuto senza senso per l'agente. Nella maggior parte dei casi, non dovresti ricevere un messaggio che ti chiede di cambiare la lingua (a meno che il testo risolto sia diverso dalla lingua corrente). L'agente dice semplicemente che non comprende la tua richiesta.

Richiesta di modifica della lingua

Dopo aver rilevato che la lingua è cambiata, l'agente restituisce una richiesta di modifica della lingua.

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

Il codice crea un messaggio, lo traduce nella lingua corrente (ulteriori informazioni in merito nella sezione Traduzione in uscita), quindi invia una risposta con le risposte suggerite. L'utente potrebbe voler parlare in una delle seguenti lingue:

  • La lingua in arrivo rilevata.
  • La lingua corrente della conversazione.
  • Il linguaggio integrato del server.

Poiché potrebbero esserci sovrapposizioni in queste tre lingue (ad esempio, se la lingua corrente è già la lingua del server), il server utilizza un oggetto impostato per rimuovere i duplicati. In seguito, viene creata una risposta suggerita per ogni lingua:

/**
 * 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 risposta suggerita mostra il nome della lingua nella sua lingua. Ad esempio, lo spagnolo viene visualizzato come "Español." Per ottenere informazioni su una lingua dal suo codice lingua di due cifre, puoi utilizzare la libreria ISO-639-1 per Node.js.

Osserva i dati postback, che vengono inviati al server quando l'utente fa clic su questo suggerimento. I dati postback indicano al server come rispondere e forniscono il contesto sul suggerimento.

Il metodo sendResponse allega questi oggetti suggerimento alla risposta:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

Modifica della lingua della conversazione

Ora torna al tuo dispositivo mobile e prova a fare clic su una nuova opzione della lingua nel messaggio visualizzato in precedenza. Ad esempio, se hai digitato "Hola", prova a fare clic su "Español" nelle risposte suggerite.

L'agente risponde nella nuova lingua. Vedremo come tradurre le risposte in uscita in un passaggio successivo. Per ora, controlla il codice che riceve ed elabora la risposta suggerita su cui hai fatto 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, []);
      });
    }
  }

Se la richiesta contiene una risposta a un suggerimento, il server utilizza i dati postback per determinare cosa fare. In questo semplice caso, il server supporta solo un tipo di dati postback, SWITCH_LANGUAGE_POSTBACK, il che significa che la conversazione dovrebbe passare alla lingua nel codice lingua immediatamente successivo. Dopo aver analizzato il codice della lingua, il server invia un messaggio per informare l'utente che la lingua è stata modificata.

Traduzione di messaggi in entrata

Ora che la lingua è cambiata, puoi inviare una richiesta all'agente in quella lingua sul tuo dispositivo mobile. Prova a inviare la parola "help" (guida) nella nuova lingua. Se hai cambiato la lingua in spagnolo, digita "ayuda" e invia il messaggio.

Il server comprende la tua richiesta di assistenza e risponde con un menu di opzioni. Prova uno di questi esempi per visualizzare una risposta di esempio impostata come hardcoded.

Il codice campione utilizza il metodo translateText per tradurre sia i messaggi in entrata che in uscita. Dai un'occhiata ora:

/**
 * 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 la lingua di origine corrisponde alla lingua di destinazione, non devi fare nulla. In caso contrario, il server chiama il metodo di traduzione sul client dell'API Traduttore. Come il metodo Detect, il metodo di traduzione può assumere più input. Poiché il server fornisce un solo input, prende il primo risultato dall'API Translate.

Consulta la sezione del metodo di callback che risponde ai messaggi in arrivo nella lingua corrente:

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

Il server utilizza l'output di translateText per scegliere un messaggio di risposta. La sezione successiva illustra il processo di scelta del messaggio di risposta e di traduzione.

Traduzione di messaggi in uscita

Dopo aver tradotto il messaggio in arrivo nell'inglese nativo, il server deve scegliere, tradurre e inviare una risposta appropriata alla richiesta dell'utente. Il codice campione utilizza uno schema molto semplice che mappa le parole chiave alle risposte. Dai un'occhiata al metodo 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.";
}

Questo schema supporta solo l'inglese sul server, il che significa che il server deve tradurre tutti i messaggi in entrata e in uscita. Un sistema più sofisticato potrebbe supportare più lingue e rispondere in modo nativo alle richieste in altre lingue. Ad esempio, se l'agente supporta lo spagnolo, potrebbe già avere una chiave per "ayuda" nella mappa di risposta. Sistemi più sofisticati potrebbero affidarsi anche ad altre metodologie per scegliere una risposta appropriata, come ML o algoritmi di punteggio. Un modo per creare risposte più intelligenti con Business Messages è l'integrazione con Dialogflow.

Ora guarda il codice che invia il messaggio scelto all'utente.

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

Il codice campione riutilizza il metodo translateText per tradurre la risposta scelta nella lingua attuale della conversazione. Il metodo sendResponse si occupa quindi di creare il nuovo oggetto Message e di inviarlo all'utente.

Riepilogo

In questo tutorial, hai imparato a creare una semplice integrazione con l'API Cloud Traduttore e a utilizzare le funzionalità delle impostazioni internazionali di Business Messages per raggiungere più utenti. Se vuoi, puoi utilizzare il codice campione in questo tutorial come punto di partenza per la tua integrazione o provare qualcosa di nuovo. Ecco alcuni esempi:

  • Invia messaggi bilingue che includono sia contenuti dei messaggi originali sia contenuti tradotti automaticamente.
  • Presenta all'utente un menu completo delle lingue supportate quando inizia una conversazione.
  • Utilizza le funzionalità avanzate dell'API Translate come i glossari per tradurre in modo affidabile parole specifiche per la tua attività.

Grazie all'integrazione con le API Traduttore, puoi sfruttare la traduzione automatica di alta qualità per comunicare con più utenti nella loro lingua. Il tuo agente può avere conversazioni più produttive ed efficienti, aumentando la soddisfazione dei clienti e il completamento delle attività.