Supporto di più lingue con Google Traduttore

Con le impostazioni internazionali di Business Messages e la tecnologia intelligente e automatizzata di Google Traduttore puoi espandere la portata dell'agente comunicando con gli utenti nella loro lingua preferita. Questo tutorial illustra una proof of concept integrazione di Google Traduttore con un webhook Business Messages.

Che cosa ti serve

Per iniziare, avrai bisogno di quanto segue:

Ottieni il codice

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

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

Passa 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 assistenza per configurare o scaricare la chiave di servizio, consulta le Guida di Google Cloud per la gestione degli account di servizio.

Al termine, puoi eseguire il deployment del codice:

gcloud app deploy

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

Configura l'API Traduttore

Il codice di esempio viene già fornito con il pacchetto Node per l'API Traduttore installato. Se ti interessa installare il pacchetto Node o sapere come installare l'API Traduttore in un linguaggio di programmazione diverso, consulta le Documentazione sull'API Cloud Translate.

Per usare l'API Traduttore, devi importare la libreria e creare un file Traduttore client API. 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, puoi accedere ai metodi dell'API Traduttore nell'oggetto Translate.

Osserva le variabili create nella parte superiore del file:

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

Nel codice di esempio il linguaggio del server viene memorizzato come costante perché è relativamente corretti. Tuttavia, la lingua corrente della conversazione può cambiare, quindi verrà tracciata nella variabile currentLanguage.

Rilevamento della lingua in arrivo

Il codice campione rileva se la lingua in arrivo è stata modificata e, in tal caso, Chiede all'utente di scegliere la lingua da usare nella conversazione. Prova questa funzione sul tuo dispositivo mobile digitando un messaggio per l'agente in un diversa dall'inglese. Se non conosci altre lingue, prova a digitare "Hola" (in spagnolo significa "Hello").

L'agente risponde con un prompt chiedendo all'utente se vuole cambiare lingue diverse. Il prompt include risposte suggerite su cui l'utente può fare clic a quella lingua.

Diamo prima 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 potrebbe rilevare più lingue con diversi livelli di confidenza (oltre che perché supporta più ), questo metodo restituisce un array di risultati. Il campione prende la prima risultato, ovvero il risultato con la confidenza più alta.

Utilizzo delle impostazioni internazionali risolte

A volte l'API Traduttore non è in grado di determinare la lingua del messaggio con sicurezza. Ad esempio, se il tuo gatto corre sulla tastiera e digita una stringa senza senso, l'API Traduttore tenta ancora di rilevare la lingua, ma la lingua rilevata è probabilmente errata. (Dopotutto, Google Traduttore non supporta ancora le lingue feline!) L'API Translate lo indica impostando un valore di confidenza basso nel risultato di translate.detect.

In questo scenario, il codice campione utilizza il linguaggio specificato Impostazioni internazionali risolte di Business Messages, che è la migliore ipotesi dell'API Business Messages per la lingua in base al contesto del messaggio. Poiché le impostazioni internazionali risolte sono nel formato BCP-47, puoi utilizzare del pacchetto Node.js corrispondente a e analizzare il codice della lingua dalle impostazioni internazionali.

Puoi testare questo comportamento digitando all'agente una lunga stringa di contenuti senza senso. Nella nella maggior parte dei casi, non dovresti visualizzare un messaggio che ti chiede di cambiare la lingua (a meno che le impostazioni internazionali risolte sono diverse dalla lingua corrente). L'agente dice semplicemente non comprende la tua richiesta.

Richiesta di cambiare lingua

Dopo aver rilevato che la lingua è stata modificata, l'agente invia un prompt all'indirizzo e cambiarla.

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 prompt, lo traduce nella lingua corrente (ulteriori informazioni nella sezione Traduzione messaggi in uscita), quindi invia una risposta con risposte suggerite. L'utente potrebbe voler parlare in uno dei seguenti modi lingue:

  • La lingua in arrivo rilevata.
  • Lingua corrente della conversazione.
  • La lingua integrata del server.

Poiché queste tre lingue potrebbero sovrapporsi (ad esempio, se la lingua lingua è già la lingua del server), il server utilizza un oggetto impostato per rimuovere duplicati. Quindi crea 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 propria lingua. Ad esempio: Lo spagnolo viene visualizzato come "Español". Per ottenere informazioni su una lingua dal suo codice lingua a 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 questo suggerimento. I dati dei postback indicano al server come rispondere e contesto relativo al suggerimento.

Il metodo sendResponse allega questi oggetti suggerimento alla risposta:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

Modifica della lingua della conversazione

Ora torna sul tuo dispositivo mobile e prova a fare clic su un'opzione della nuova lingua nella precedente. Ad esempio, se hai digitato "Hola", prova a fare clic su "Español" nel le risposte suggerite.

L'agente risponde nella nuova lingua. Vedremo come tradurre i messaggi in uscita risposte in un passaggio successivo. Per ora, guarda 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 il postback per stabilire cosa fare. In questo caso semplice, il server supporta solo tipo di dati postback, SWITCH_LANGUAGE_POSTBACK, che indica che conversazione deve essere impostata nella lingua nella lingua immediatamente successiva le API nel tuo codice. Dopo aver analizzato questo codice lingua, il server invia un messaggio per informare il che la lingua è cambiata.

Traduzione dei messaggi in entrata

Ora che la lingua è cambiata, puoi inviare una richiesta all'agente lingua sul tuo dispositivo mobile. Prova a inviare la parola "aiuto" nel nuovo lingua. Se hai impostato lo spagnolo, digita "ayuda" e invia .

Il server comprende la tua richiesta di assistenza e risponde con il menu di le opzioni di CPU e memoria disponibili. Prova una di queste azioni per visualizzare una risposta di esempio hardcoded.

Il codice campione utilizza il metodo translateText per tradurre sia i dati 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 è la stessa della lingua di destinazione, non c'è nulla da che possono fare. In caso contrario, il server chiama metodo di traduzione sul client dell'API Traduttore. Come il metodo di rilevamento, il metodo di traduzione può ricevono più input. Poiché il server fornisce un solo input, prende la primo risultato dall'API Traduttore.

Osserva la sezione del metodo di callback che risponde ai messaggi in arrivo in 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. Nella sezione successiva viene illustrato il processo di scelta del messaggio di risposta. e la traduciamo.

Traduzione dei messaggi in uscita

Dopo che il server ha tradotto il messaggio in arrivo nella sua lingua madre inglese, di scegliere, tradurre e inviare una risposta appropriata alla richiesta dell'utente. Il codice di esempio utilizza uno schema molto semplice che mappa le parole chiave alle risposte. Hai consulta il 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 supporta più lingue e risponde in modo nativo alle richieste in altre lingue. Ad esempio, se il tuo agente supporta lo spagnolo, potrebbe avere già una chiave per "ayuda" nella mappa delle risposte. Anche i sistemi più sofisticati possono basarsi metodologie per scegliere una risposta appropriata, come l'ML o la valutazione degli algoritmi. Un modo per creare risposte più intelligenti con Business Messages prevede l'integrazione con Dialogflow.

Ora osserva 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 il testo scelto risposta nella lingua corrente della conversazione. Il metodo sendResponse, quindi crea il nuovo oggetto Message e lo invia all'utente.

Riepilogo

In questo tutorial hai imparato a creare una semplice integrazione con l'API Cloud Translate e sfruttare le funzionalità internazionali di Business Messages per raggiungere più utenti. Se puoi usare il codice campione di questo tutorial come punto di partenza per integrazione oppure puoi provare qualcosa di nuovo. Ecco alcuni esempi:

  • Invia messaggi bilingue contenenti sia i contenuti originali sia i contenuti tradotti automaticamente.
  • Presenta all'utente un menu completo delle lingue supportate quando inizia una conversazione.
  • Utilizzare le funzionalità avanzate dell'API Traduttore ad esempio i glossari, per tradurre in modo affidabile le parole specifiche della tua attività.

Grazie all'integrazione con le API Traduttore, puoi sfruttare per comunicare con più utenti nella lingua più a loro agio. L'agente può avere conversazioni più produttive ed efficienti, aumentando la soddisfazione del cliente e il completamento delle attività.