Obsługa wielu języków w Tłumaczu Google

Funkcja wiadomości biznesowych i inteligentne, automatyczne tłumaczenie w Tłumaczu Google pozwalają zwiększyć zasięg agenta, komunikując się z użytkownikami w wybranym przez nich języku. Ten samouczek przedstawia model koncepcyjny integracji Tłumacza Google z webhookiem Business Messages.

Czego potrzebujesz

Aby rozpocząć, przygotuj kilka rzeczy:

Pobierz kod

W tym samouczku poznasz przykładowy kod webhooka zintegrowanego z Tłumaczem Google. Aby pobrać kod, skopiuj repozytorium z GitHuba:

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

Przejdź do sklonowanego katalogu i umieść klucz konta usługi w katalogu zasobów:

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

WSKAZÓWKA: jeśli potrzebujesz pomocy przy konfigurowaniu lub pobieraniu klucza usługi, przeczytaj przewodnik dotyczący Google Cloud na potrzeby zarządzania kontami usługi.

Gdy to zrobisz, możesz wdrożyć kod:

gcloud app deploy

Na urządzeniu mobilnym wyślij wiadomości do agenta. Spróbuj wysłać wiadomości w różnych językach i sprawdź, co się stanie.

Konfigurowanie interfejsu Translate API

Przykładowy kod jest dołączony do pakietu węzłów interfejsu Translate API, który jest już zainstalowany. Jeśli chcesz się dowiedzieć, jak zainstalować pakiet węzłów lub jak zainstalować interfejs Translate API w innym języku programowania, zapoznaj się z dokumentacją interfejsu Cloud Translate API.

Aby korzystać z interfejsu Translate API, musisz zaimportować bibliotekę i utworzyć klienta tej usługi. Otwórz plik routes/index.js. Odpowiednie wiersze to:

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

Od teraz masz dostęp do metod interfejsu Translate API w obiekcie tłumaczenia.

Przyjrzyj się zmiennym utworzonym u góry pliku:

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

Przykładowy kod przechowuje jako stały, ponieważ jest względnie stały. Bieżący język rozmowy może się jednak zmienić, dlatego jest monitorowany w zmiennej currentLanguage.

Wykrywanie języka przychodzącego

Przykładowy kod wykrywa, czy zmieniony język przychodzi, a jeśli tak, prosi użytkownika o wybranie języka, którego chce użyć w rozmowie. Wypróbuj tę funkcję na urządzeniu mobilnym, wpisując wiadomość do agenta w języku innym niż angielski. Jeśli nie znasz żadnego innego języka, spróbuj wpisać „Hola” (to po hiszpańsku „&&tt;Hello"!”).

Pracownik obsługi klienta wyświetli pytanie, czy chce zmienić język. Panel zawiera sugerowane odpowiedzi, które użytkownik może kliknąć, by przełączyć się na ten język.

Spójrzmy najpierw na funkcję wykrywania języka.

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

Ta metoda wykorzystuje metodę wykrywania w kliencie tłumaczenia. Ponieważ interfejs Translate API może wykrywać wiele języków z różnym poziomem ufności (oraz obsługuje wiele określeń wejściowych), ta metoda zwraca cały szereg wyników. W próbce występuje pierwszy wynik, czyli wynik o największym stopniu ufności.

Używanie rozwiązanego języka

Czasami interfejs Translate API nie potrafi z dużym prawdopodobieństwem określić języka wiadomości. Jeśli na przykład kot działa przy użyciu klawiatury i wpisuje niejasny ciąg znaków, interfejs Translate API nadal próbuje wykryć język, ale wykryty język jest prawdopodobnie nieprawidłowy. (W końcu Tłumacz Google nie obsługuje języków kociej) Interfejs Translate API pokazuje tę wartość, ustawiając niski poziom ufności w wyniku translate.detect&#39.

W tym scenariuszu przykładowy kod przywraca język w języku Rozstrzygnięty problem z wiadomościami biznesowymi, który jest językiem interfejsa Business Messages API na podstawie kontekstu wiadomości. Rozpatrzony język jest w formacie BCP-47, więc możesz użyć odpowiedniego pakietu Node.js, aby przeanalizować kod języka z języka.

Aby przetestować to działanie, wpisz długi ciąg znaków bezużytecznego agenta. W większości przypadków powinien wyświetlić się komunikat z prośbą o zmianę języka (chyba że rozpoznany język różni się od bieżącego). Pracownik obsługi klienta po prostu nie rozumie Twojego żądania.

Pytanie o zmianę języka

Gdy wykryjemy, że język się zmienił, pracownik obsługi klienta wyśle Ci prośbę o jego zmianę.

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

Kod tworzy komunikat, tłumaczy go na język bieżący (więcej informacji na ten temat można znaleźć w sekcji Tłumaczenie wiadomości wychodzących), a następnie wysyła odpowiedź z sugerowanymi odpowiedziami. Użytkownik może chcieć rozmawiać w dowolnym z tych języków:

  • Wykryty język przychodzący.
  • Aktualny język rozmowy.
  • Wbudowany język serwera.

Ponieważ te 3 języki mogą się pokrywać (np. jeśli obecny język jest już językiem serwera), serwer usuwa określone duplikaty za pomocą ustawionego obiektu. Tworzy sugerowaną odpowiedź w każdym języku:

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

Sugerowana odpowiedź zawiera nazwę języka we własnym języku. Na przykład hiszpański – „"Español.&quot” Aby uzyskać informacje o języku z jego dwucyfrowego kodu języka, możesz użyć biblioteki ISO 639-1 dla środowiska Node.js.

Zwróć uwagę na dane wywołania zwrotnego, które są wysyłane do serwera po kliknięciu tej sugestii. Dane wywołania zwrotnego wskazują serwer, jak ma na nie odpowiedzieć, i udostępnia kontekst dotyczący sugestii.

Metoda sendResponse dołącza do odpowiedzi te obiekty sugestii:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

Zmiana języka rozmowy

Wróć do urządzenia mobilnego i kliknij przycisk nowego języka w wyświetlonym komunikacie. Jeśli na przykład wpiszesz "Hola," kliknij "Español" w sugerowanych odpowiedziach.

Pracownik obsługi klienta odpowie w nowym języku. W dalszej części omówimy sposób tłumaczenia odpowiedzi wychodzących. Na razie przyjrzymy się kodowi, który odbiera i przetwarza sugerowaną odpowiedź.

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

Jeśli żądanie zawiera odpowiedź na sugestię, serwer używa danych wywołania zwrotnego do określenia działania. W tym prostym przypadku serwer obsługuje tylko jeden typ danych wywołania zwrotnego: SWITCH_LANGUAGE_POSTBACK, co oznacza, że rozmowa powinna zostać zmieniona na język bezpośrednio w kodzie języka. Po przeanalizowaniu kodu języka serwer wysyła wiadomość, aby poinformować użytkownika o zmianie języka.

Tłumaczenie wiadomości przychodzących

Gdy język się zmieni, możesz wysłać żądanie do agenta w tym języku na urządzeniu mobilnym. Spróbuj wysłać słowo &&tt;help" w nowym języku. Jeśli zmienisz język na hiszpański, wpisz "ayuda" i wyślij wiadomość.

Serwer rozumie Twoje żądanie pomocy i odpowiada na nie za pomocą menu opcji. Wypróbuj dowolną z tych opcji, aby zobaczyć zakodowaną na stałe przykładową odpowiedź.

Przykładowy kod używa metody translateText do tłumaczenia wiadomości przychodzących i wychodzących. Sprawdź to:

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

Jeśli język źródłowy jest taki sam jak język docelowy, nie musisz nic robić. W przeciwnym razie serwer wywoła metodę tłumaczenia w kliencie Translate API. Tak jak w przypadku metody wykrywania, metoda tłumaczenia może przyjmować wiele danych wejściowych. Serwer dostarcza tylko 1 wpis wejściowy, dlatego wybiera pierwszy wynik z interfejsu Translate API.

Spójrz na sekcję metody wywołania zwrotnego, która odpowiada na wiadomości przychodzące w bieżącym języku:

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

Serwer używa danych wyjściowych z translateText do wybierania wiadomości odpowiedzi. W kolejnej sekcji omawiamy proces wyboru wiadomości i jej przetłumaczenia.

Tłumaczenie wiadomości wychodzących

Gdy serwer przetłumaczy wiadomość przychodzącą na swój język ojczysty, musi wybrać, przetłumaczyć i wysłać odpowiednią odpowiedź na żądanie użytkownika. Przykładowy kod używa prostego schematu, który mapuje słowa kluczowe na odpowiedzi. Spójrz na metodę 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.";
}

Ten schemat obsługuje tylko język angielski na serwerze, co oznacza, że serwer musi tłumaczyć wszystkie wiadomości przychodzące i wychodzące. Bardziej zaawansowany system może obsługiwać wiele języków i odpowiadać na pytania w innych językach. Jeśli na przykład Twój agent obsługuje język hiszpański, może mieć już klucz w polu „ayuda"”. Bardziej zaawansowane systemy mogą też opierać się na innych metodach wyboru odpowiednich odpowiedzi, takich jak systemy uczące się lub algorytmy oceniania. Jednym ze sposobów tworzenia bardziej inteligentnych odpowiedzi przy użyciu Business Messages jest integracja z Dialogflow.

Teraz spójrz na kod, który wysyła wybraną wiadomość z powrotem do użytkownika.

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

Przykładowy kod ponownie wykorzystuje metodę translateText do tłumaczenia wybranej odpowiedzi na bieżący język rozmowy. Metoda sendResponse pozwala następnie utworzyć nowy obiekt Message i wysłać go do użytkownika.

Podsumowanie

Z tego samouczka dowiesz się, jak utworzyć prostą integrację z Cloud Translate API i korzystać z funkcji regionalnych Business Messages, aby docierać do większej liczby użytkowników. Jeśli chcesz, możesz wykorzystać przykładowy kod z tego samouczka, który pomoże Ci rozpocząć integrację, lub wypróbować coś nowego. Oto kilka pomysłów:

  • Wysyłaj wiadomości w dwóch językach, które zawierają treść oryginalnej wiadomości oraz treść przetłumaczoną automatycznie.
  • Przedstaw użytkownikowi pełne menu obsługiwanych języków, gdy rozpoczyna rozmowę.
  • Możesz korzystać z zaawansowanych funkcji Tłumacza Google, takich jak glosariusze, aby prawidłowo tłumaczyć słowa kluczowe związane z Twoją firmą.

Dzięki integracji z interfejsami Translate API możesz korzystać z wysokiej jakości funkcji tłumaczenia maszynowego, które pozwalają komunikować się z większą liczbą użytkowników w najwygodniejszym języku. Przedstawiciel może prowadzić bardziej produktywne i efektywne rozmowy, zwiększając zadowolenie klientów i wykonując zadania.