Unterstützung mehrerer Sprachen mit Google Übersetzer

Mit Sprachen, die für Business Messages und Google Übersetzer geeignet sind, kannst du die Reichweite deines Agents erweitern, indem du mit Nutzern in ihrer bevorzugten Sprache kommunizierst. Diese Anleitung führt Sie durch eine Proof of Concept-Integration von Google Übersetzer in einen Business Messages-Webhook.

Voraussetzungen

Für den Einstieg benötigen Sie Folgendes:

  • Eine vollständige, genehmigte Partnerregistrierung bei Business Messages Weitere Informationen findest du im Leitfaden für die Registrierung als Partner.
  • Ein Business Messages-Agent, einschließlich Dienstkontoschlüssel. Informationen zum Erstellen eines Agents finden Sie unter Ersten Agent erstellen.
  • Einen Computer mit installiertem Google Cloud SDK und Node.js (Version 10 oder höher) Achten Sie darauf, dass Sie sich angemeldet und Ihre aktive Projekt-ID im Google Cloud SDK festgelegt haben.
  • Ein Android- oder iOS-Gerät zum Testen.

Code abrufen

In dieser Anleitung wird anhand eines Beispiel-Webhook-Codes erläutert, der in Google Übersetzer eingebunden ist. Klonen Sie das Repository von GitHub, um den Code abzurufen:

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

Wechseln Sie zum geklonten Verzeichnis und platzieren Sie Ihren Dienstkontoschlüssel im Ressourcenverzeichnis:

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

TIPP: Wenn Sie Hilfe beim Einrichten oder Herunterladen Ihres Dienstkontoschlüssels benötigen, lesen Sie den Google Cloud-Leitfaden zum Verwalten von Dienstkonten.

Anschließend können Sie den Code bereitstellen:

gcloud app deploy

Senden Sie über Ihr Mobilgerät Nachrichten an den Agent. Sende deine Nachrichten in verschiedenen Sprachen und schaue, was passiert.

Übersetzer API einrichten

Der Beispielcode enthält das Node-Paket für die Translate API. Informationen zur Installation des Node-Pakets oder zur Installation der Translate API in einer anderen Programmiersprache finden Sie in den Cloud Translate API-Dokumenten.

Wenn Sie die Übersetzer API verwenden möchten, müssen Sie die Bibliothek importieren und einen Übersetzer API-Client erstellen. Öffnen Sie die Datei routes/index.js. Die relevanten Zeilen sind:

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

Von nun an können Sie auf die Translate API-Methoden für das Objekt „translate“ zugreifen.

Sehen Sie sich die Variablen an, die oben in der Datei erstellt wurden:

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

Im Beispielcode wird die Serversprache als Konstante gespeichert, da sie relativ fest ist. Da sich jedoch die aktuelle Sprache der Unterhaltung ändern kann, wird sie in der Variablen currentLanguage erfasst.

Eingehende Sprache erkennen

Der Beispielcode erkennt, ob die eingehende Sprache geändert wurde. Wenn ja, wird der Nutzer aufgefordert, die Sprache auszuwählen, die er in der Unterhaltung verwenden möchte. Testen Sie diese Funktion auf Ihrem Mobilgerät, indem Sie eine Nachricht an den Agent in einer anderen Sprache als Englisch eingeben. Wenn du keine andere Sprache beherrschst, kannst du „Hola“ eingeben (das Spanisch für „Hallo“)!

Der Agent antwortet mit einer Frage, ob der Nutzer die Sprache wechseln möchte. Die Aufforderung enthält Antwortvorschläge, auf die der Nutzer klicken kann, um zu dieser Sprache zu wechseln.

Sehen wir uns zuerst die Funktion zur Spracherkennung an.

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

Diese Methode verwendet die Erkennungsmethode auf dem Übersetzer-Client. Da die Übersetzer API mehrere Sprachen mit unterschiedlicher Konfidenz erkennt und mehrere Eingaben unterstützt, gibt diese Methode ein Array von Ergebnissen zurück. Im Beispiel wird das erste Ergebnis verwendet, also das Ergebnis mit der höchsten Konfidenz.

Aufgelöstes Gebietsschema verwenden

Manchmal kann die Übersetzer API die Nachrichtensprache nicht mit hoher Sicherheit ermitteln. Wenn beispielsweise Ihre Katze über die Tastatur läuft und einen unpassenden String eingibt, versucht die Übersetzer API trotzdem, die Sprache zu erkennen, aber die erkannte Sprache ist wahrscheinlich falsch. Katzensprache wird von Google Übersetzer noch nicht unterstützt. Die Übersetzer API zeigt dies durch Festlegen eines niedrigen Konfidenzwerts im Ergebnis translate.detect an.

In diesem Szenario greift der Beispielcode auf die Sprache unter Aufgelöste Sprache der Business Messages zurück. Das ist die Business Messages API, die anhand des Kontexts der Nachricht am besten geschätzt wird. Da das aufgelöste Gebietsschema im BCP-47-Format vorliegt, können Sie das entsprechende Node.js-Paket verwenden, um den Sprachcode aus der Sprache zu parsen.

Sie können dieses Verhalten testen, indem Sie dem Agent einen langen unsinnigen String eingeben. In den meisten Fällen sollte keine Aufforderung zum Ändern der Sprache angezeigt werden, es sei denn, die aufgelöste Sprache unterscheidet sich von der aktuellen Sprache. Der Kundenservicemitarbeiter sagt einfach, dass er deine Anfrage nicht versteht.

Aufforderung zum Ändern der Sprache

Nachdem der Agent erkannt hat, dass sich die Sprache geändert hat, wird er aufgefordert, die Sprache zu ändern.

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

Der Code erstellt eine Aufforderung, übersetzt sie in die aktuelle Sprache (mehr dazu im Abschnitt „Übersetzung von ausgehenden Nachrichten“) und sendet dann eine Antwort mit Antwortvorschlägen. Der Nutzer möchte in einer der folgenden Sprachen sprechen:

  • Die erkannte eingehende Sprache.
  • Die aktuelle Sprache der Unterhaltung.
  • Die integrierte Sprache des Servers.

Da es in diesen drei Sprachen Überschneidungen geben kann (z. B. wenn die aktuelle Sprache bereits die Serversprache ist), verwendet der Server ein festgelegtes Objekt, um Duplikate zu entfernen. Anschließend wird für jede Sprache ein Antwortvorschlag erstellt:

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

Die vorgeschlagene Antwort enthält den Namen der Sprache in der jeweiligen Sprache. Zum Beispiel wird Spanisch als "Español." angezeigt. Informationen zu einer Sprache aus ihrem zweistelligen Sprachcode erhalten Sie in der ISO-639-1-Bibliothek für Node.js.

Beachten Sie die Postback-Daten, die an den Server gesendet werden, wenn der Nutzer auf diesen Vorschlag klickt. Die Postback-Daten geben an, wie der Server reagieren soll, und liefern Kontext zum Vorschlag.

Die Methode sendResponse hängt diese Vorschlagsobjekte an die Antwort an:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

Sprache der Unterhaltung ändern

Kehren Sie nun zu Ihrem Mobilgerät zurück und klicken Sie in der Aufforderung auf eine andere Sprache. Wenn Sie beispielsweise „Hola“ eingegeben haben, klicken Sie in den vorgeschlagenen Antworten auf „Español“.

Der Agent antwortet in der neuen Sprache. Wie Sie ausgehende Antworten übersetzen, erfahren Sie in einem späteren Schritt. Sehen Sie sich den Code an, der die vorgeschlagene Antwort empfängt und verarbeitet, auf die Sie geklickt haben.

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

Wenn die Anfrage eine Antwort auf einen Vorschlag enthält, bestimmt der Server anhand der Postback-Daten, was zu tun ist. In diesem einfachen Fall unterstützt der Server nur einen Typ von Postback-Daten: SWITCH_LANGUAGE_POSTBACK. Dies bedeutet, dass die Unterhaltung in die Sprache im unmittelbar darauffolgenden Sprachcode geändert werden soll. Nach dem Parsen dieses Sprachcodes sendet der Server eine Nachricht, um den Nutzer über die geänderte Sprache zu informieren.

Übersetzung eingehender Nachrichten

Wenn die Sprache geändert wurde, können Sie auf Ihrem Mobilgerät eine Anfrage an den Agent in dieser Sprache senden. Versuchen Sie, das Wort für „Hilfe“ in der neuen Sprache zu senden. Wenn Sie die Sprache in Spanisch geändert haben, geben Sie "ayuda" ein und senden Sie die Nachricht.

Der Server versteht deine Anfrage nach Hilfe und antwortet mit dem Optionsmenü. Probieren Sie diese aus, um eine hartcodierte Beispielantwort zu erhalten.

Der Beispielcode verwendet die Methode translateText, um eingehende und ausgehende Nachrichten zu übersetzen. Jetzt ansehen:

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

Wenn die Ausgangssprache mit der Zielsprache identisch ist, müssen Sie nichts tun. Andernfalls ruft der Server die Übersetzungsmethode im Übersetzer API-Client auf. Wie die Erkennungsmethode kann die Übersetzungsmethode mehrere Eingaben annehmen. Da der Server nur eine Eingabe bereitstellt, übernimmt er das erste Ergebnis der Übersetzer API.

Sehen Sie sich den Abschnitt der Callback-Methode an, der auf eingehende Nachrichten in der aktuellen Sprache antwortet:

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

Der Server verwendet die Ausgabe von translateText, um eine Antwortnachricht auszuwählen. Im nächsten Abschnitt wird die Auswahl der Antwortnachricht und die Übersetzung beschrieben.

Ausgehende Nachrichten übersetzen

Nachdem der Server die eingehende Nachricht ins Englische übersetzt hat, muss er die Anfrage des Nutzers auswählen, übersetzen und eine entsprechende Antwort senden. Im Beispielcode wird ein sehr einfaches Schema verwendet, mit dem Keywords Antworten zugeordnet werden. Sehen Sie sich die Methode chooseResponseMessage an.

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

Dieses Schema unterstützt nur Englisch auf dem Server. Dies bedeutet, dass der Server alle eingehenden und ausgehenden Nachrichten übersetzen muss. Ein ausgereifteres System kann mehrere Sprachen unterstützen und Anfragen nativ in anderen Sprachen beantworten. Wenn der Agent beispielsweise Spanisch unterstützt, hat er möglicherweise bereits einen Schlüssel für „ayuda"“ in der Antwortzuordnung. Komplexere Systeme können auch andere Methoden nutzen, um eine geeignete Antwort auszuwählen, z. B. ML oder Bewertungsalgorithmen. Eine Möglichkeit, mit Business Messages intelligentere Antworten zu erhalten, ist die Einbindung in Dialogflow.

Sehen Sie sich nun den Code an, durch den die ausgewählte Nachricht an den Nutzer zurückgesendet wird.

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

Der Beispielcode verwendet die Methode translateText, um die ausgewählte Antwort in die aktuelle Unterhaltungssprache zu übersetzen. Mit der Methode sendResponse wird dann das neue Message-Objekt erstellt und an den Nutzer gesendet.

Zusammenfassung

In dieser Anleitung haben Sie erfahren, wie Sie eine einfache Integration mit der Cloud Translate API erstellen und die Gebietsschema-Funktionen von Business Messages verwenden, um mehr Nutzer zu erreichen. Sie können den Beispielcode in dieser Anleitung als Ausgangspunkt für Ihre eigene Integration verwenden. Alternativ können Sie auch etwas Neues ausprobieren. Hier einige Vorschläge:

  • Zweisprachige Nachrichten senden, die sowohl den ursprünglichen Nachrichteninhalt als auch den automatisch übersetzten Inhalt enthalten.
  • Präsentieren Sie dem Nutzer zu Beginn einer Unterhaltung ein vollständiges Menü mit unterstützten Sprachen.
  • Mit erweiterten Translate API-Funktionen wie Glossaren lassen sich Wörter, die für Ihr Unternehmen spezifisch sind, zuverlässig übersetzen.

Durch die Einbindung in die Übersetzer APIs können Sie hochwertige maschinelle Übersetzungen nutzen, um mit mehr Nutzern in ihrer vertrauten Sprache zu kommunizieren. Der Agent kann produktivere und effizientere Unterhaltungen führen, was die Kundenzufriedenheit und die Erledigung von Aufgaben erhöht.