Google Çeviri ile birden fazla dili destekleme

Business Messages'ın yerel ayarları ve Google Çeviri'nin akıllı, otomatik çevirisi sayesinde, kullanıcılarla tercih ettikleri dilde iletişim kurarak temsilcinizin erişimini genişletebilirsiniz. Bu eğitim, Google Mesajlar'ın Business Messages webhook'u ile Kavram Kanıtlama entegrasyonu konusunda size yol gösterir.

Gerekenler

Başlamak için aşağıdaki birkaç şeyi hazırlamanız gerekir:

Kodu alın

Bu eğitim, Google Çeviri ile entegre edilen örnek webhook kodunu açıklar. Kodu almak için Github'daki depoyu klonlayın:

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

Klonlanmış dizine gidin ve hizmet hesabı anahtarınızı kaynaklar dizinine yerleştirin:

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

İPUCU: Hizmet anahtarınızı ayarlama veya indirme konusunda yardıma ihtiyacınız varsa Hizmet hesaplarını yönetmeyle ilgili Google Cloud kılavuzuna bakın.

Bu işlem tamamlandıktan sonra kodu dağıtabilirsiniz:

gcloud app deploy

Mobil cihazınızı kullanarak temsilciye birkaç mesaj gönderin. Mesajlarınızı farklı dillerde göndermeyi deneyin ve ne olduğunu görün.

Translate API'yi ayarlama

Örnek kod, Çeviri API'si için zaten yüklenmiş olan düğüm paketiyle birlikte gelir. Düğüm paketini veya Çeviri API'sini farklı bir programlama dilinde nasıl yükleyeceğinizi öğrenmek için Cloud Translate API dokümanlarına bakın.

Çeviri API'sini kullanmak için kitaplığı içe aktarmanız ve bir Çeviri API istemcisi oluşturmanız gerekir. routes/index.js dosyasını açın. İlgili satırlar şunlardır:

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

Bu aşamadan sonra Çeviri nesnesinde Translate API yöntemlerine erişebilirsiniz

Dosyanın üst kısmına yakın bir yerde oluşturulan değişkenlere göz atın:

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

Örnek kod, göreceli olarak sabit olduğu için sunucu dilini sabit bir değer olarak depolar. Ancak ileti dizisinin mevcut dili değişebilir ve bu nedenle currentLanguage değişkeninde izleniyor.

Gelen dili algılama

Örnek kod, gelen dilin değişip değişmediğini algılar ve değişmişse kullanıcıdan görüşmede kullanmak istediği dili seçmesini ister. Bu özelliği mobil cihazınızda denemek için temsilciye İngilizce dışında bir dilde mesaj göndermek isteyebilirsiniz. Başka dil bilmiyorsanız "Hola" (bu, İspanyolca "&";" için İspanyolca) yazmayı deneyin.

Temsilci, kullanıcının dil değiştirmek isteyip istemediğini soran bir istemle yanıt verir. İstem, kullanıcının söz konusu dile geçmek için tıklayabileceği önerilen yanıtları içerir.

Öncelikle dil algılama özelliğine bir göz atalım.

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

Bu yöntem, çeviri istemcisinde algılama yöntemini kullanır. Çeviri API'si farklı güven seviyelerine sahip birden fazla dili algılayabildiğinden (ve birden çok girişi desteklediğinden) bu yöntem bir dizi sonuç döndürür. Örnek, ilk sonucu alır. Bu, en yüksek güvene sahip sonuçtur.

Sonlandırılan yerel ayarı kullanma

Bazen Çeviri API'si yüksek bir güven düzeyinde mesaj dilini belirleyemez. Örneğin, kediniz klavyenin tamamında çalışıyorsa ve anlamsız bir dize giriyorsa Çeviri API'sı dili algılamaya çalışır, ancak algılanan dil muhtemelen yanlıştır. (Ne de olsa Google Çeviri, kedi dillerini henüz desteklemez!) Çeviri API'si bunu translate.detect' sonucunda düşük bir güven değeri ayarlayarak gösterir.

Bu senaryoda örnek kod, Business Messages çözümlenen yerel ayar dilindeki dile kadar uzanır. Bu, Business Messages API'nin mesajın bağlamına göre dile ilişkin en iyi tahminidir. Çözümlenen yerel ayar BCP-47 biçiminde olduğundan, dil kodunu yerel ayardan ayrıştırmak için karşılık gelen Node.js paketini kullanabilirsiniz.

Temsilciye uzun bir anlam ifade eden dize yazarak bu davranışı test edebilirsiniz. Çoğu durumda (düzeltilmiş yerel ayar mevcut dilden farklı olmadığı sürece) dili değiştirmeniz için bir istem görmezsiniz. Temsilci, isteğinizi anlamadığını söylüyor.

Dili değiştirme istemi

Müşteri, dilin değiştiğini tespit ettikten sonra dili değiştirme isteği gönderir.

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 bir istem oluşturur, bunu geçerli dile çevirir (Giden mesaj çevirisi bölümünde daha fazla bilgi verir), ardından önerilen yanıtları içeren bir yanıt gönderir. Kullanıcı şu dillerden birinde konuşmak isteyebilir:

  • Algılanan gelen dil.
  • Mevcut görüşme dili.
  • Sunucunun yerleşik dili.

Bu üç dilde örtüşme olabileceğinden (örneğin, geçerli dil sunucu diliyse) sunucu, kopyaları kaldırmak için ayarlanmış bir nesne kullanır. Ardından her dil için önerilen bir yanıt oluşturur:

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

Önerilen yanıtta, dilin adı kendi dilinde gösterilir. Örneğin, İspanyolca "Español." Bir dil hakkında iki basamaklı dil kodundan bilgi almak için Düğüm.js için ISO-639-1 kitaplığını kullanabilirsiniz.

Kullanıcı bu öneriyi tıkladığında sunucuya gönderilen geri gönderme verilerine dikkat edin. Geri gönderme verileri, sunucuya nasıl yanıt verileceğini bildirir ve öneriyle ilgili bağlam sağlar.

sendResponse yöntemi, yanıta şu öneri nesnelerini ekler:

let messageObject = {
    …
    suggestions: suggestedReplies,
  };

Görüşmenin dilini değiştirme

Şimdi mobil cihazınıza dönün ve istemdeki yeni dil seçeneğini tıklamayı deneyin. Örneğin, “Hola” yazarsanız önerilen yanıtlarda "Español" ifadesini tıklamayı deneyin.

Temsilci yeni dilde yanıt verir. Giden yanıtların nasıl çevrileceğini bir sonraki adımda ele alacağız. Şimdilik, tıkladığınız önerilen yanıtı alıp işleyen koda bakın.

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

İstek bir öneriye yanıt içeriyorsa sunucu, ne yapılacağını belirlemek için geri gönderme verilerini kullanır. Bu basit örnekte, sunucu yalnızca tek bir geri gönderme verisi türünü (SWITCH_LANGUAGE_POSTBACK) desteklemektedir. Bu, iletişimin hemen sonraki dil koduna değiştirileceği anlamına gelir. Bu dil kodunu ayrıştırdıktan sonra sunucu, kullanıcıya dilinin değiştiğini bildiren bir mesaj gönderir.

Gelen ileti çevirisi

Dil değiştirildiğinde, aracınıza mobil cihazınızda bu dilde bir istek gönderebilirsiniz. Yeni dilde "Yardım" kelimesini göndermeyi deneyin. Dili İspanyolca olarak değiştirdiyseniz "ayuda" yazın ve mesajı gönderin.

Sunucu, yardım isteğinizi anlayarak seçenekler menüsüyle yanıt verir. Sabit kodlu bir örnek yanıt görmek için bunlardan birini deneyin.

Örnek kod, hem gelen hem de giden iletileri çevirmek için translateText yöntemini kullanır. Hemen göz atın:

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

Kaynak dil, hedef dille aynıysa yapılması gereken bir işlem yoktur. Aksi takdirde, sunucu Çeviri API istemcisinde translate yöntemini çağırır. Algılama yöntemi gibi, çeviri yöntemi de birden fazla giriş yapabilir. Sunucu yalnızca bir giriş sağladığından, Çeviri API'sinden ilk sonucu alır.

Geri çağırma yönteminin, mevcut dilde gelen mesajlara yanıt veren bölümüne bakın:

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

Sunucu, yanıt mesajı seçmek için translateText çıkışını kullanır. Sonraki bölümde, yanıt mesajını seçme ve çevirme süreci ele alınmaktadır.

Giden mesaj çevirisi

Sunucu, gelen mesajınızı ana İngilizcesine çevirdikten sonra kullanıcının isteğini seçmeli, çevirmeli ve uygun bir yanıt göndermelidir. Örnek kod, anahtar kelimeleri yanıtlarla eşleyen çok basit bir şema kullanır. chooseResponseMessage yöntemine göz atın.

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

Bu şema yalnızca sunucuda İngilizceyi destekler. Yani, sunucu tüm gelen ve giden iletileri çevirmelidir. Daha karmaşık bir sistem, birden fazla dili destekleyip diğer dillerdeki isteklere yerel olarak yanıt verebilir. Örneğin, aracınız İspanyolcayı destekliyorsa yanıt haritasında halihazırda "ayuda" anahtarı bulunabilir. Daha gelişmiş sistemler, uygun bir yanıt seçmek için makine öğrenimi veya puan algoritmaları gibi başka yöntemlere de başvurabilir. Business Messages ile daha akıllı yanıtlar oluşturmanın yollarından biri, Dialogflow ile entegrasyon yapmaktır.

Şimdi, seçilen mesajı kullanıcıya gönderen koda bakın.

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

Örnek kod, seçilen yanıtı geçerli görüşme diline çevirmek için translateText yöntemini yeniden kullanır. sendResponse yöntemi bu durumda yeni Mesaj nesnesini oluşturup kullanıcıya göndermekle ilgilenir.

Özet

Bu eğiticide, Cloud Çeviri API ile basit bir entegrasyonun nasıl oluşturulacağını ve daha fazla kullanıcıya ulaşmak için Business Messages yerel özelliklerinin nasıl kullanılacağını öğrendiniz. İsterseniz kendi eğitiminiz için bir başlangıç noktası olarak bu eğitimdeki örnek kodu kullanabilir veya yeni bir yöntem deneyebilirsiniz. Aşağıdaki önerilerden yararlanabilirsiniz:

  • Hem orijinal ileti içeriğini hem de otomatik olarak çevrilmiş içeriği barındıran iki dilli iletiler gönderin.
  • Sohbete başladığında kullanıcıya desteklenen dillerin tamamını içeren bir menü sunun.
  • İşletmenize özgü kelimeleri güvenli bir şekilde çevirmek için terim sözlükleri gibi gelişmiş Çeviri API'si özelliklerinden yararlanın.

Çeviri API'leri ile entegrasyon yaparak yüksek kaliteli makine çevirisinden yararlanarak daha fazla kullanıcıyla en rahat şekilde iletişim kurabilirsiniz. Temsilcinizin daha üretken ve verimli görüşmeleri olabilir, bu da müşteri memnuniyetini artırır ve görevleri tamamlar.