Policybazaar と JioHotstar が Translator API と Language Detector API を使用して多言語エクスペリエンスを構築する方法

Swetha Gopalakrishnan
Swetha Gopalakrishnan
Saurabh Rajpal
Saurabh Rajpal

公開日: 2025 年 5 月 8 日

Translator APILanguage Detector API を使用して、世界中のユーザーがコンテンツにアクセスできるようにします。Language Detector API を使用すると、入力で使用されている言語を特定できます。また、Translator API を使用すると、検出された言語から別の言語に翻訳できます。どちらの API も Chrome に組み込まれた AI モデルを使用してクライアントサイドで実行されます。つまり、サーバー費用がかからないため、高速で安全かつ無料で使用できます。

API 商品の解説 ウェブ 拡張機能 Chrome ステータス インテント
Translator API MDN Chrome 138 Chrome 138 表示 発送予定
Language Detector API MDN Chrome 138 Chrome 138 表示 発送予定

Policybazaar と JioHotstar という 2 つの大規模な国際企業が、これらの組み込み API をどのように使用し、どのようなメリットを得ているかをご覧ください。

Policybazaar の多言語対応のカスタマー アシスタンス

Policybazaar は、9, 700 万人以上の登録ユーザーを抱えるインド最大の保険プラットフォームです。インドは言語の多様性が非常に高い国であり、国内で多くの言語と方言が話されています。

Policybazaar は、顧客の言語の多様性をサポートするため、Translator API と Language Detector API を 2 つの方法で実装しました。1 つは、いつでも保険のサポートを提供すること、もう 1 つは、顧客が希望する言語で市場分析に関する記事を提供することです。

Finova AI による保険適用サポート

保険は本質的に個人的な商品であり、特定のポリシーの基礎となる機密情報が含まれています。Policybazaar のお客様は、プランの選び方やプランでサポートされる内容についてガイダンスを求めることがよくあります。Policybazaar には多くの言語を話すスタッフがいますが、タイムゾーンや営業時間外に対応できるソリューションが必要でした。そこで Policybazaar は、お客様の希望する言語で保険に関するサポートを提供する Finova AI を構築しました。

ユーザーは、母語で Finova chatbot とチャットできます。

「Chrome の言語検出 API と翻訳 API のおかげで、お客様の多様な言語ニーズに対応し、保険サポートをよりシームレスに提供できるようになりました。その結果、ユーザーは目立った遅延なしに、希望するインドの言語でコミュニケーションできるようになります。」

- Policybazaar、生命保険ビジネス ユニット設計責任者 Rishabh Mehrotra 氏

チームはクライアントサイド AI を選択しました。これは、ブラウザまたはユーザーのデバイスで発生する推論です。クライアントサイド AI は、サーバーホスト型 AI やサーバーレス AI よりもレイテンシが少なく、コストも低くなります。リアルタイムの会話ではメッセージのペースと量が多くなるため、サーバーベースのソリューションではコストと時間がかかります。

Chrome の組み込み AI の実装では、ブラウザに組み込まれたモデルが提供されるため、推論はデバイス上で行われます。これは、主な要件を満たす魅力的なソリューションです。

// Language Detector and Translator APIs implemented with React
import { useRef } from "react";

const useService = () => {
  const languageModel = useRef(null);
  const translatorCapabilitiesModel = useRef(null);
  const loadAllModels = async () => {
    if (window?.LanguageDetector) {
      languageModel.current = await window.LanguageDetector.create().catch(() => null);
    }
  }

  // Detect what language the customer is writing
  const detectLanguage = async (message) => {
    if (!languageModel.current) return "";
    try {
      const [result] = await languageModel.current.detect(message);
      const { detectedLanguage, confidence } = result || {};
      return confidence * 100 > 50 ? detectedLanguage : "";
    } catch (err) {
      console.error(err);
      return "";
    }
  };

  // Translate messages to and from the detected language and English
  const translateMessage = async (message, detectedLanguage, targetLanguage = 'en') => {
    try {
      const modelAvailability = await window.Translator.availability({ sourceLanguage: detectedLanguage, targetLanguage });
      if (!['available', 'downloadable'].includes(modelAvailability)) {
        return message;
      }
      const translator = await window.Translator.create({ sourceLanguage: detectedLanguage, targetLanguage });
      const translatedMessage = await translator.translate(message);
      return translatedMessage;
    } catch (error) {
      return message;
    }
  }

  return { detectLanguage, translateMessage, loadAllModels };
}

export default useService;

マーケット インサイトの記事の翻訳

「Translator API は、既存の React コードに非常に簡単に統合できました。お客様とエージェントの迅速な翻訳を確保するため、このクライアントサイド ソリューションを採用しました。API は 2 秒以内に 1,000 文字の記事を翻訳できました。」

- Policybazaar テクニカル リーダー Aman Soni 氏

Policybazaar の生命保険ビジネス部門では、顧客とカスタマー サポート エージェントが市場の状況を把握できるように、豊富な記事を提供しています。

ユーザーの間でヒンディー語が広く話されているため、英語からヒンディー語への記事のオンデマンド翻訳に Translator API を試験運用しました。

Policybazaar は、英語とヒンディー語間のシームレスで高速な翻訳を提供します。

ウェブサイトに翻訳を追加するために、次のスクリプトを使用しました。

// Initialize the translator, setting source and target languages
var translator = null;
var translatorAvailable = false;
var languageOptionsData = { name: "Hindi", code: "hi" };
var IGNORED_TEXT_NODES = ['RSI', 'NAV'];

function checkForLanguageOptions() {
  if (window.Translator) {
    translatorAvailable = true;
    return window.Translator.create({
      sourceLanguage: 'en',
      targetLanguage: languageOptionsData.code
    }).then(function (createdTranslator) {
      translator = createdTranslator;
    });
  } else {
    translatorAvailable = false;
    return Promise.resolve();
  }
}

/**
 * Translate the article content using the Translator API.
 * @param {HTMLElement} container - element that holds the article content.
 * @return {Promise<string>} A promise that resolves to the container's innerHTML after translation.
 */
function translateArticle(container) {
  if (!translatorAvailable) { return Promise.resolve(''); }

  var textNodes = getAllTextNodes(container);
  var promiseChain = Promise.resolve();

  textNodes.forEach(function (element) {
    if (IGNORED_TEXT_NODES.indexOf(element.nodeValue) !== -1) return;
    var message = element.nodeValue;
    promiseChain = promiseChain.then(function () {
      return translator.translate(message).then(function (translated) {
        element.nodeValue = translated;
      }).catch(function (error) {
        console.error('Translation error:', error);
      });
    });
  });

  return promiseChain.then(function () {
    return container.innerHTML;
  });
}

Chrome が提供するモデルと API を使用すると、記事の翻訳にほぼ瞬時にアクセスできます。

JioHotstar で動的な字幕翻訳が可能に

インドの大手デジタル ストリーミング プラットフォームである JioHotstar は、さまざまな言語の映画、テレビ番組、スポーツ、オリジナル コンテンツを提供しており、字幕翻訳の強化に Translator API の活用を検討しています。

JioHotstar は、地域言語でコンテンツを視聴したいインドのユーザーを対象としています。JioHotstar で利用できるコンテンツ カタログは幅広いため、すべてのユーザーの地域言語のニーズに対応し、コンテンツの利用を改善することは困難です。

Translator API を使用すると、プラットフォームは英語の字幕をユーザーの言語設定または地理的地域に基づいて動的に翻訳できます。動的翻訳のオプションは、言語選択メニューに表示されます。このメニューでは、元の字幕が不足している場合は自動的に検出され、Chrome でサポートされている言語から補完されます。これにより、字幕のユーザー エクスペリエンスが向上し、より多くのユーザーがコンテンツにアクセスできるようになります。

利用可能な動的言語のリストは、各ユーザーの言語設定と地域に合わせて調整されたメインリストに基づいて、ブラウザで既存の言語パックをチェックすることで生成されます。ユーザーが言語を選択し、対応する言語パックがブラウザにすでにダウンロードされている場合、翻訳されたテキストがすぐに表示されます。それ以外の場合は、まずパックがダウンロードされてから翻訳が開始されます。

言語を選択して翻訳が行われると、言語パックが正常にダウンロードされたことを確認できます。以降、字幕付きのコンテンツは選択した言語で表示されます。これにより、コンテンツが希望の言語で利用できるかどうかをユーザーが確認しやすくなり、コンテンツの閲覧をためらうユーザーの不安を解消できます。

次のコードサンプルは、翻訳ツールを初期化して設定します。

class SubTitleTranslator {
  // Cache translator instances based on source-target language pair, so that we don't create this often for multiple contents
  #translatorMap = {};
  // Get or create a translator for the language pair
  async #createTranslator(sourceLanguage, targetLanguage) {
    const key = `${sourceLanguage}-${targetLanguage}`;
    const translator = this.#translatorMap[key];
    // Check if a translator already exists for a language pair in the map
    if (translator) {
      return translator;
    }
    // Check if translation is available
    const isAvailable =
      (await Translator.availability({ sourceLanguage, targetLanguage })) ===
      "available";
    if (isAvailable) {
      // If available, create a new translator and cache it
      this.#translatorMap[key] = await Translator.create({
        sourceLanguage,
        targetLanguage,
      });
      return this.#translatorMap[key];
    }

    return null;
  }
  // Translate text
  async #translateText(text, sourceLanguage, targetLanguage) {
    const translator = await this.#createTranslator(
      sourceLanguage,
      targetLanguage
    );
    // Returns the given input text if translator is unavailable
    if (!translator) {
      return text;
    }
    return await translator.translate(text);
  }
  // Public method to get a reusable translation function for a specific language pair.
  getTranslatorFor(sourceLanguage, targetLanguage) {
    return async (text) => {
      try {
        return this.#translateText(text, sourceLanguage, targetLanguage);
      } catch {
        return text;
      }
    };
  }
}

次に、Translator API を使用して翻訳された字幕を生成します。

const translatorFactory = new SubTitleTranslator();

/* Accept English input and translate to Tamil.*/
const translateToTamil = translatorFactory.getTranslatorFor('en','ta');

/* Accept English text as input and translate it to Japanese. */
const translateToJapanese = translatorFactory.getTranslatorFor('en','ja');

/* Accept English input and returns English, as `JTA` is not a valid language code. */
const translateToUnknownLanguage = translatorFactory.getTranslatorFor('en','jta');

最終的にレンダリングされる字幕を更新する関数がいくつかあります。

/* updateSubtitle is the internal function that updates the rendered subtitle. */
translateToTamil('hi').then(result => updateSubtitle(result))
translateToJapanese('hi').then(result => updateSubtitle(result))
translateToUnknownLanguage('hi').then(result => updateSubtitle(result))

ベスト プラクティス

Translator API と Language Detector API の使用方法は異なりますが、多くの共通のベスト プラクティスがあります。

  • 翻訳されたテキストの品質評価を実施して、文法とコンテキストが保持されていることを確認します。必要に応じて、ユーザーが翻訳に関するフィードバックを提供できるオプションを提供することを検討してください。
  • スピナー、ローダー、進行状況バーなどの進行状況 UI を提供して、応答性を示します。たとえば、Policybazaar は、ユーザーの入力が処理中であることを示すために、チャットボットの入力インジケーターを使用しました。

結論と推奨事項

これらの API を使用して新しいものを構築していますか?X の@ChromiumDev または LinkedIn の Chromium for Developers でぜひお寄せください。

リソース

謝辞

この記事の執筆とレビューにご協力いただいた、Policybazaar の Rishabh Mehrotra 氏と Aman Soni 氏、JioHotstar の Bhuvaneswaran Mohan 氏と Ankeet Maini 氏、Alexandra Klepper 氏、Thomas Steiner 氏、Kenji Baheux 氏に感謝いたします。