תמיכה בריבוי שפות באמצעות Google Translate

עם הלוקאלים של Business Messages ותרגום התרגום החכם והאוטומטי של Google Translate אפשר להרחיב את פוטנציאל החשיפה של הנציג ולדבר עם המשתמשים בשפה המועדפת עליהם. במדריך הזה נסביר איך לשלב את הוכחת הקונספט של Google Translate בעזרת webhook Business.

מה הדרישות כדי להצטרף לתוכנית?

כדי להתחיל, עליך להכין את הדברים הבאים:

קבל את הקוד

במדריך הזה נסביר איך להשתמש בקוד webhook לדוגמה שמשתלב עם Google Translate. כדי לקבל את הקוד, משכפלים את המאגר מ-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

משתמשים בנייד כדי לשלוח כמה הודעות לנציג. נסו לשלוח את ההודעות בשפות שונות ולבדוק מה קורה.

הגדרת ה-API של Translate

הקוד לדוגמה מגיע עם חבילת הצומת עבור Google Translate API, שכבר מותקנת. אם רוצים להתקין את חבילת הצומת או להתקין את Translate API בשפת תכנות אחרת, מומלץ לעיין במסמכים של Cloud Translate API.

כדי להשתמש ב-Translate API, צריך לייבא את הספרייה וליצור לקוח API ל-Translate. פותחים את הקובץ 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();

מעכשיו אפשר לגשת לשיטות של תרגום API באובייקט Translate.

בידקו את המשתנים שנוצרו בחלק העליון של הקובץ:

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

קוד לדוגמה מאחסן את שפת השרת כקבוע, מפני שהוא קבוע יחסית. עם זאת, השפה הנוכחית של השיחה עשויה להשתנות, כך שאפשר לעקוב אחריה במשתנה currentLanguage.

זיהוי השפה הנכנסת

הקוד לדוגמה מזהה אם השפה הנכנסת השתנתה, ואם כן, מורה למשתמש לבחור את השפה שבה הוא רוצה להשתמש בשיחה. אפשר לנסות את התכונה בנייד על ידי הקלדת הודעה בשפה אחרת מלבד אנגלית. אם יש לכם שפות אחרות, נסו להקליד "Hola" (כלומר, ספרדית"שלום"!).

הנציג יגיב בבקשה אם המשתמש רוצה להחליף שפה. בהודעה יוצגו הצעות לתשובות שמשתמשים יוכלו ללחוץ עליהן כדי לעבור לשפה הזו.

תחילה נבחן את התכונה 'זיהוי שפה'.

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

השיטה הזו משתמשת בשיטת הזיהוי בלקוח התרגום. מכיוון שה-Translate API עשוי לזהות מספר שפות עם רמות ביטחון שונות (וכן כי הוא תומך במגוון קלט) ולכן השיטה הזו מחזירה מגוון תוצאות. הדוגמה מקבלת את התוצאה הראשונה, שהתוצאה היא ברמת הביטחון הגבוהה ביותר.

נעשה שימוש באזור שנפתר

לפעמים ה-Translate API לא יכול לקבוע את שפת ההודעה ברמת ודאות גבוהה. לדוגמה, אם החתול שלכם עובר במקלדת ומזינים מחרוזת לא פשוטה, ה-Translate API עדיין מנסה לזהות את השפה, אבל סביר להניח שהשפה שזוהתה שגויה. (לאחר מכן, Google Translate לא תומך בשפות חתוליות – עדיין!) ה-Translate API מציין זאת על ידי הגדרת ערך עם מהימנות נמוכה בתוצאה של translate.detect#39.

בתרחיש הזה, הקוד לדוגמה מסתמך על השפה בלוקאל פתרון העסק ב-Messages, שהוא הניחוש הטוב ביותר של 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))
          );
        });
      }

הקוד יוצר הודעה, מתרגם אותה לשפה הנוכחית (מידע נוסף נמצא בקטע תרגום הודעה יוצאת) ולאחר מכן שולח תשובה עם הצעות לתשובות. ייתכן שהמשתמש ירצה לדבר באחת מהשפות הבאות:

  • השפה הנכנסת שזוהתה.
  • שפת השיחה הנוכחית.
  • השפה המובנית של השרת.

מכיוון שקיימת חפיפה בין שלוש השפות האלה (לדוגמה, אם השפה הנוכחית היא כבר שפת השרת), השרת משתמש באובייקט שהוגדר כדי להסיר כפילויות. לאחר מכן תוצג הצעה לתשובה לכל שפה:

/**
 * 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." כדי לקבל מידע על שפה מקוד השפה הדו-ספרתי שלה, תוכלו להשתמש בספריית ISO-639-1 ל-Node.js.

שימו לב לנתוני הדיווח החוזר על המרה (PostBack). הנתונים האלה נשלחים לשרת כשהמשתמש לוחץ על ההצעה הזו. נתוני השליחה החוזרת מאפשרים לשרת לדעת איך להגיב, ומספקים הקשר לגבי ההצעה.

השיטה sendResponse מצורפת לתשובה הבאה: אובייקטים של הצעות:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

שינוי השפה של השיחה

חזרו לנייד שלכם ונסו ללחוץ לאחרונה על אפשרות שפה חדשה. לדוגמה, אם הקלדתם &"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, המציין שהשיחה צריכה להשתנות לשפה בקוד השפה הבא. לאחר ניתוח קוד השפה הזה, השרת שולח הודעה כדי להודיע למשתמש שהשפה השתנתה.

תרגום של הודעות נכנסות

לאחר שינוי השפה, תוכלו לשלוח בקשה לסוכן בשפה הזו בנייד שלכם. נסו לשלוח את המילה "help"בשפה החדשה. אם שיניתם את השפה לספרדית, מקלידים "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 API. בדומה לשיטת הזיהוי, שיטת התרגום יכולה להכיל מספר קלטים. מכיוון שהשרת מספק קלט אחד בלבד, הוא מקבל את התוצאה הראשונה מ-Translate API.

עיינו בקטע של השיחה החוזרת שמגיב להודעות נכנסות בשפה הנוכחית:

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) או אלגוריתמים של ניקוד. אחת מהדרכים ליצור תשובות חכמות יותר עם Business Messages היא שילוב עם Dialogflow.

עכשיו צריך לבדוק את הקוד ששולח למשתמש את ההודעה שנבחרה.

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

הקוד לדוגמה משתמש שוב בשיטה translateText כדי לתרגם את התגובה שנבחרה לשפת השיחה הנוכחית. לאחר מכן, שיטת sendResponse מטפלת ביצירת האובייקט החדש של ההודעה ובשליחתו למשתמש.

סיכום

במדריך הזה למדתם איך ליצור שילוב פשוט עם Cloud Translate API ולהשתמש בתכונות הלוקאל של Business Messages כדי להגיע ליותר משתמשים. אם תרצו, תוכלו להשתמש בקוד לדוגמה במדריך הזה כנקודת התחלה לשילוב שלכם, או לנסות משהו חדש! רעיונות לשינויים:

  • שליחת הודעות דו-לשוניות המכילות את תוכן ההודעה המקורית וגם את התוכן המתורגם באופן אוטומטי.
  • צריך להציג למשתמש תפריט מלא של שפות נתמכות כשהוא מתחיל שיחה.
  • השתמשו בתכונות המתקדמות של Translate API, כמו מילוני מונחים, כדי לתרגם באופן אמין מילים ספציפיות לעסק שלכם.

השילוב עם ממשקי ה-API של Translate מאפשר לכם להשתמש בתרגום מכונה באיכות גבוהה כדי לתקשר עם יותר משתמשים בשפה המתאימה להם ביותר. הנציג שלכם יכול לנהל שיחות יעילות ויעילות יותר, וכך להגדיל את שביעות הרצון של הלקוחות ואת השלמת המשימות.