Google 翻訳で複数の言語に対応

ビジネス メッセージの言語 / 地域と Google 翻訳のインテリジェントで 会話でやり取りすることでエージェントのリーチを広げることができます。 表示言語を設定できます。このチュートリアルでは、概念実証について説明します。 Google 翻訳とビジネス メッセージ Webhook の統合。

必要なもの

まず、次のものを用意する必要があります。

コードを取得する

このチュートリアルでは、Google Cloud と統合された Webhook のサンプルコードについて説明します。 翻訳。コードを取得するには、GitHub からリポジトリのクローンを作成します。

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

クローンを作成したディレクトリに移動し、サービス アカウント キーをリソース ディレクトリに配置します。

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

ヒント: サービスキーの設定やダウンロードについてサポートが必要な場合は、 サービス アカウントを管理するための Google Cloud ガイド

これが完了したら、コードをデプロイできます。

gcloud app deploy

モバイル デバイスを使用して、エージェントにメッセージを送信します。次を メッセージをさまざまな言語で表示して、処理状況を確認します。

Translate API を設定する

サンプルコードには、Translate API の Node パッケージがすでに含まれています。 インストールされています。Node パッケージのインストール方法や 別のプログラミング言語で Translate API をインストールする方法については、 Cloud Translate API のドキュメント

Translate API を使用するには、ライブラリをインポートして、Translate API を作成する必要があります。 API クライアント。routes/index.js ファイルを開きます。関連する行は次のとおりです。

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

今後は、Translate オブジェクトで Translate API のメソッドにアクセスできます。

ファイルの先頭付近に作成された変数を確認します。

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

このサンプルコードでは、サーバーの言語を定数として保存しています。これは、 あります。ただし、会話の現在の言語は変更される可能性があるため、 currentLanguage 変数で指定する必要があります。

着信言語の検出

このサンプルコードでは、受信言語が変更されたかどうかが検出されます。変更されている場合は、 会話で使用する言語の選択をユーザーに促します。 モバイル デバイスでエージェントへのメッセージを入力して、この機能を試してみてください。 対応しています。他の言語がわからない場合は、次のように入力してください "Hola"(これはスペイン語で「Hello!」を意味します)。

エージェントは、ユーザーが切り替えたいかどうかを尋ねるプロンプトで応答します。 対応しています。メッセージには返信文の候補が含まれており、ユーザーはそれをクリックしてクリックできます。 その言語に切り替えます。

まず、言語検出機能について説明します。

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

このメソッドは、detect メソッドを使用します。 必要があります。Translate API は複数の言語を検出する場合があるため、 (また、複数のルールがサポートされているため、 入力など)、このメソッドは結果の配列を返します。サンプルでは、最初の 最も信頼度の高い結果です

解決済みの言語 / 地域の使用

Translate API は、高レベルのメッセージ言語を判定できない できます。たとえば猫がキーボードを横切って走って 意味をなさない文字列である場合、Translate API は引き続き言語を検出しようとしますが、 検出された言語が正しくない可能性があります。(結局、Google 翻訳は まだ猫語には対応していません)。Translate API は、これを translate.detect の結果の信頼値を低く設定している。

このシナリオでは、サンプルコードは、 ビジネス メッセージの解決済みの言語 / 地域、 これは、Business Messages API で コンテキストで識別されます。解決されたロケールは BCP-47 形式であるため、 対応する Node.js パッケージを ロケールの言語コードを解析します。

この動作をテストするには、意味不明な内容の長い文字列をエージェントに入力します。イン ほとんどの場合、言語の変更を求めるメッセージは表示されません( 解決された言語 / 地域が現在の言語と異なる)。エージェントは リクエストを認識できません。

言語の変更を求めるメッセージ

言語の変更を検出すると、エージェントはプロンプトを 言語を変更します。

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

コードはプロンプトを作成し、それを現在の言語に翻訳します(詳しくは 「送信メッセージの翻訳」セクションに)を入力すると、 定型返信文。お客様は、以下のいずれかの方法で話したいと望んでいる可能性があります。 言語:

  • 検出された着信言語。
  • 現在の会話の言語。
  • サーバーの組み込み言語。

これら 3 つの言語は重複することがあるため(たとえば、現在の言語が サーバーの言語がすでにサーバーの言語である場合、サーバーは set オブジェクトを使用して あります。次に、言語ごとに返信文の候補が作成されます。

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

定型返信文には、言語の名前がそれ自身の言語で表示されます。たとえば スペイン語は「Español」と表示されます。言語に関する情報を取得するには、 Node.js 用 ISO-639-1 ライブラリを使用できます。

ポストバック データは、ユーザーが おすすめします。ポストバック データはサーバーに応答方法を指示し、 提案に関するコンテキストです。

sendResponse メソッドはこれらをアタッチします。 候補オブジェクト 返信します。

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

会話の言語の変更

モバイル デバイスに戻り、Google Chat で 確認します。たとえば「Hola」と入力すると[Español]をクリックして 返信文の候補が表示されます。

エージェントは新しい言語で回答します。送信内容を翻訳する方法を 返信は後ほど行います。ここでは、メッセージを受け取って処理するコードを クリックした返信文の候補が表示されます。

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

リクエストに候補に対する返信が含まれている場合、サーバーはポストバックを使用します。 どうすればよいか判断できますこの単純なケースでは、サーバーでサポートされるのは SWITCH_LANGUAGE_POSTBACK が返されます。これは、 その直後の言語に切り替わります。 できます。この言語コードを解析すると、サーバーは 言語が変更されたことをユーザーに知らせます。

受信メッセージの翻訳

言語を変更したら、その言語でエージェントにリクエストを送信できます。 言語を選択します。「ヘルプ」という言葉を送信してみてください新しい あります。言語をスペイン語に変更した場合は、「ayuda」と入力します。送信し、 表示されます。

サーバーはリクエストを理解し、次のメニューで応答します: 。ハードコードされたサンプル レスポンスを確認するには、次のいずれかを試してください。

サンプルコードでは、translateText メソッドを使用して、受信と受信の両方を 制限します。実際に試してみましょう。

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

ソース言語がターゲット言語と同じ場合、何もする必要はありません。 できます。それ以外の場合、サーバーは translate メソッド Translate API クライアント上で実行します。translate メソッドでは、detect メソッドと同様に、 多岐にわたります。サーバーは 1 つの入力しか提供しないため、 最初の結果が翻訳されます

受信メッセージに応答するコールバック メソッドのセクションを 現在の言語:

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

サーバーは translateText からの出力を使用して、レスポンス メッセージを選択します。 次のセクションでは、返信メッセージとメッセージを選択するプロセスについて詳しく説明します。 あります。

アウトバウンド メッセージの翻訳

受信したメッセージをサーバーによりネイティブの英語に翻訳した後、 ユーザーのリクエストに対して適切な応答を選択、翻訳して、送信できます。 このサンプルコードでは、キーワードをレスポンスにマッピングする非常にシンプルなスキームを使用しています。持っている 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.";
}

このスキームはサーバーで英語にのみ対応しているため、サーバーは すべての受信メールと送信メールを翻訳しますより高度なシステムでは 複数の言語をサポートし、他の言語でのリクエストにネイティブで応答できます。 たとえば、エージェントがスペイン語をサポートしている場合、 「ayuda」レスポンスマップで確認できます。より高度なシステムでは、他のシステムに依存する ML やスコアリングなど、適切な回答を選択するための手法 学習します。ビジネス メッセージでよりインテリジェントな返信を作成する方法の 1 つ Dialogflow との統合です

次に、選択したメッセージをユーザーに返すコードを確認します。

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

サンプルコードでは、translateText メソッドを再利用して、選択した 現在の会話言語に翻訳します。sendResponse メソッドでは、 新しい Message オブジェクトを作成してユーザーに送信します。

概要

このチュートリアルでは、Terraform を使用して Cloud Translate API とのシンプルな統合 ビジネス メッセージの言語 / 地域機能を活用することで、より多くのユーザーにリーチできるようになります。もし このチュートリアルのサンプル コードを 独自の統合に挑戦することもできますし、新しいことに挑戦できます。以下のヒントをご覧ください。

  • 元のメッセージのコンテンツと 自動的に翻訳されます。
  • ユーザーがチャットを開始したときに、サポートされている言語の全メニューが表示される あります。
  • 高度な Translate API の機能を利用する ビジネスに特化した言葉を確実に翻訳できます。

Translate API と統合することで、高品質の機械翻訳機能を活用できる より多くのユーザーと使いやすい言語でコミュニケーションできます。 エージェントは、より生産的で効率的な会話を行うことができ、 顧客満足度とタスク完了の指標です