翻訳および言語検出 API

コミュニティグループ報告書草案,

この文書の詳細
このバージョン:
https://webmachinelearning.github.io/translation-api
課題追跡:
GitHub
編集者:
(Google)
Ehsan Toreini (Samsung)
元編集者:
Domenic Denicola (Google)

概要

翻訳および言語検出 API は、Web ページに、言語間でテキストを翻訳し、 そのようなテキストの言語を検出する機能を与えます。

この文書のステータス

この仕様は、Web Machine Learning Community Group によって公開されました。 これは W3C 標準ではなく、W3C 標準化過程上にもありません。 以下に注意してください。 W3C Community Contributor License Agreement (CLA) の下では、限定的なオプトアウトおよびその他の条件が適用されます。 詳細は W3C Community and Business Groups を参照してください。

1. はじめに

翻訳および言語検出 API は、人間の言語間でテキストを翻訳し、そのようなテキストの言語を 検出する機能を公開します。これらは、この目的のためにブラウザーに組み込まれている UI 機能を補完するものであり、 Web 開発者に、これらの操作をプログラムから起動し、それらをアプリケーションに統合する能力を 与えます。これは、ユーザー入力やネットワークから取得したテキストを処理する場合に、特に役立ちます。

これらの API は、翻訳および言語検出のための高水準インターフェイスを提供するように設計されており、 基盤となる機械学習モデルとその管理の複雑さを抽象化します。異なる実装戦略や言語サポートに起因する 相互運用性の問題の可能性に対処するため、API 設計は、アプリケーションが依存する言語の可用性を確認し、 適切なエラー処理を含める方向へ開発者を導きます。

2. 依存関係

この仕様は Infra Standard に依存します。 [INFRA]

Web プラットフォームの他の部分と同様に、人間の言語はこれらの API では BCP 47 言語タグによって識別されます。 たとえば、"ja"、"en-US"、"sr-Cyrl"、または "de-CH-1901-x-phonebk-extended" などです。検証、正準化、 および言語タグ照合に使用される具体的なアルゴリズムは、ECMAScript Internationalization API Specification のものであり、これはさらに、その処理の一部を Unicode Locale Data Markup Language (LDML) に委ねます。 [BCP47] [ECMA-402] [UTS35].

これらの API は、機械学習モデルによって駆動されることが期待される API 群の一部であり、共通の API 表面の慣用句および仕様パターンを共有します。現在、これらの共有部分の仕様テキストは Writing Assistance APIs § 5 Shared infrastructure にあり、共通のプライバシーおよびセキュリティ上の 考慮事項は Writing Assistance APIs § 6 Privacy considerations および Writing Assistance APIs § 7 Security considerations で議論されています。これらの API を実装するには、その 共有インフラストラクチャを実装し、それらのプライバシーおよびセキュリティ上の考慮事項に適合する必要があります。 ただし、実際の writing assistance API を実装または公開する必要はありません。 [WRITING-ASSISTANCE-APIS]

3. 翻訳 API

[Exposed=Window, SecureContext]
interface Translator {
  static Promise<Translator> create(TranslatorCreateOptions options);
  static Promise<Availability> availability(TranslatorCreateCoreOptions options);

  Promise<DOMString> translate(
    DOMString input,
    optional TranslatorTranslateOptions options = {}
  );
  ReadableStream translateStreaming(
    DOMString input,
    optional TranslatorTranslateOptions options = {}
  );

  readonly attribute DOMString sourceLanguage;
  readonly attribute DOMString targetLanguage;

  Promise<double> measureInputUsage(
    DOMString input,
    optional TranslatorTranslateOptions options = {}
  );
  readonly attribute unrestricted double inputQuota;
};
Translator includes DestroyableModel;

dictionary TranslatorCreateCoreOptions {
  required DOMString sourceLanguage;
  required DOMString targetLanguage;
};

dictionary TranslatorCreateOptions : TranslatorCreateCoreOptions {
  AbortSignal signal;
  CreateMonitorCallback monitor;
};

dictionary TranslatorTranslateOptions {
  AbortSignal signal;
};

3.1. 作成

静的 create(options) メソッド手順は次のとおりです。
  1. options、"translator"、 翻訳オプションを検証および正準化する翻訳オプションの可用性を計算する翻訳モデルをダウンロードする翻訳モデルを初期化する、および 翻訳器オブジェクトを作成する を与えて、 AI モデルオブジェクトを作成する結果を返します。

TranslatorCreateCoreOptions options が与えられたとき、翻訳オプションを検証および正準化するには、 次の手順を実行します。これらは、言語タグを正準化するために options をその場で変更し、 いずれかが無効であれば例外を投げます。
  1. options および "sourceLanguage" を与えて、 言語タグを検証および正準化する

  2. options および "targetLanguage" を与えて、 言語タグを検証および正準化する

TranslatorCreateCoreOptions options が与えられたとき、翻訳モデルをダウンロードするには:
  1. Assert: これらの手順は 並列に実行されています。

  2. options["sourceLanguage"] から options["targetLanguage"] へテキストを翻訳するために、ユーザーエージェントが必要とするすべてのものについて、 ダウンロード処理を開始します。

    これには、基盤となる翻訳モデルと特定の言語アーク素材の両方、または中間言語が使用される場合には 複数の言語アーク用の素材が含まれる可能性があります。

  3. 何らかの理由でダウンロード処理を開始できない場合は、false を返します。

  4. true を返します。

TranslatorCreateCoreOptions options が与えられたとき、翻訳モデルを初期化するには:
  1. Assert: これらの手順は 並列に実行されています。

  2. options["sourceLanguage"] から options["targetLanguage"] への翻訳に関するユーザーエージェントの能力を支える AI モデルについて、必要な初期化操作を実行します。

    これには、モデルをメモリにロードすること、または対象の特定のオプションをサポートするために 必要なファインチューニングをロードすることが含まれる可能性があります。

  3. 何らかの理由で初期化が失敗した場合は、DOMException エラー情報を返します。その name は "OperationError" であり、その details には適切な詳細が含まれます。

  4. null を返します。

realm realm および TranslatorCreateCoreOptions options が与えられたとき、翻訳器オブジェクトを作成するには:
  1. Assert: これらの手順は realmsurrounding agentevent loop 上で実行されています。

  2. inputQuota を、将来の翻訳 操作のためにユーザーエージェントが利用できる入力クォータの量とします。(この値は 実装定義であり、ユーザーのメモリや JavaScript 文字列の制限などを超える 特定の制限がない場合には +∞ である可能性があります。)

  3. realm 内に作成された新しい Translator オブジェクトを、次を伴って返します。

    ソース言語

    options["sourceLanguage"]

    ターゲット言語

    options["targetLanguage"]

    入力クォータ

    inputQuota

3.2. 可用性

静的 availability(options) メソッド手順は次のとおりです。
  1. options、"translator"、 翻訳オプションを検証および正準化する、 および 翻訳オプションの可用性を計算する を与えて、 AI モデルの可用性を計算する結果を返します。

TranslatorCreateCoreOptions options が与えられたとき、翻訳オプションの可用性を計算するには、次の手順を実行します。 これらは Availability 値または null のいずれかを返し、言語タグをその最良適合の一致に更新するために options を その場で変更します。
  1. Assert: このアルゴリズムは 並列に実行されています。

  2. availabilities を、ユーザーエージェントの 翻訳器言語アーク可用性とします。

  3. availabilities が null の場合は、null を返します。

  4. availabilities 内の各 languageArcavailability について 反復します:

    1. sourceLanguageBestFitLookupMatchingLocaleByBestFitlanguageArcソース言語 », « options["sourceLanguage"] ») とします。

    2. targetLanguageBestFitLookupMatchingLocaleByBestFitlanguageArcターゲット言語 », « options["targetLanguage"] ») とします。

    3. sourceLanguageBestFittargetLanguageBestFit の両方が undefined でない場合:

      1. options["sourceLanguage"] を sourceLanguageBestFit.[[locale]] に設定します。

      2. options["targetLanguage"] を targetLanguageBestFit.[[locale]] に設定します。

      3. availability を返します。

  5. (options["sourceLanguage"], options["targetLanguage"]) が同一性翻訳によって満たすことができる場合は、 "available" を返します。

    そのような場合でも、ユーザーエージェントが指定された言語アークに対して その 翻訳器言語アーク可用性内に特定のエントリを持つ場合には、 上記の手順により "downloadable"、 "downloading"、 または "available" を返す可能性があります。しかし、同一性翻訳は常に利用可能であるため、この手順は、そのような場合に "unavailable" を決して返さないことを保証します。

    言語アークのうち、 同一性翻訳によって満たすことができる ものの一つは ("en-US", "en-GB") です。この翻訳用の特殊化されたモデルを 実装がサポートしており、それが 翻訳器言語アーク可用性に現れることも考えられます。

    一方で、実装が 言語アーク ("en-x-asdf", "en-x-xyzw") 用の特殊化されたモデルを持つ可能性は かなり低いです。そのような場合、この手順が引き継ぎ、後で translate アルゴリズムを呼び出すと、同一性翻訳が使用されます。

    この手順が引き継ぐ場合、options["sourceLanguage"] および options["targetLanguage"] は変更されません。したがって、このアルゴリズムが create() から呼び出されている場合、それは結果として得られる Translator オブジェクトの sourceLanguage および targetLanguage プロパティが、正準化された形式ではなく、元の入力を返すことを意味します。

  6. "unavailable" を返します。

言語アークは、2 つの 文字列からなる タプル、 すなわち ソース言語および ターゲット 言語です。各項目は Unicode 正準化ロケール識別子です。

翻訳器言語アーク可用性は、次の手順によって与えられます。 これらは、言語アークから Availability 値への map、または null を返します。
  1. Assert: このアルゴリズムは 並列に実行されています。

  2. ユーザーエージェントが、テキストの翻訳をサポートできる言語アークを判断しようとした際に何らかのエラーがあり、 ユーザーエージェントがそれを一時的なもの(再照会すればそのようなエラーが発生しなくなる可能性があるもの)と 考える場合は、null を返します。

  3. 言語アークから Availability 値への map を返します。各キーは、ユーザーエージェントがテキスト間の翻訳を サポートする 言語アークであり、次の制約に従って埋められます。

ユーザーエージェントの 翻訳器言語アーク可用性が、次のとおりであると仮定しましょう。

LookupMatchingLocaleByBestFit を使用することは、 availability() が、おそらく次の答えを与えることを意味します。

function a(sourceLanguage, targetLanguage) {
  return ai.translator.availability({ sourceLanguage, targetLanguage }):
}

await a("en", "zh-Hans") === "available";
await a("en", "zh-Hant") === "downloadable";

await a("en", "zh") === "available";            // zh は zh-Hans に最良適合します

await a("en", "zh-TW") === "downloadable";      // zh-TW は zh-Hant に最良適合します
await a("en", "zh-HK") === "available";         // zh-HK は zh-Hans に最良適合します
await a("en", "zh-CN") === "available";         // zh-CN は zh-Hans に最良適合します

await a("en-US", "zh-Hant") === "downloadable"; // en-US は en に最良適合します
await a("en-GB", "zh-Hant") === "downloadable"; // en-GB は en に最良適合します

// 非常に予期しないサブタグであっても、en または zh-Hans に最良適合します
await a("en-Braille-x-lolcat", "zh-Hant") === "downloadable";
await a("en", "zh-BR-Kana") === "available";
言語アーク arc は、 次の手順が true を返す場合、set言語アーク otherArcs重複します
  1. sourceLanguages を、otherArcs 内の各項目ソース言語から構成される set とします。

  2. LookupMatchingLocaleByBestFit(sourceLanguages, « arcソース言語 ») が undefined でない場合は、 true を返します。

  3. targetLanguages を、otherArcs 内の各項目ターゲット言語から構成される set とします。

  4. LookupMatchingLocaleByBestFit(targetLanguages, « arcターゲット言語 ») が undefined でない場合は、 true を返します。

  5. false を返します。

言語アーク ("en", "fr") は « ("en", "fr-CA") » と 重複するため、ユーザーエージェントの 翻訳器言語アーク可用性は、これら両方の 言語 アークを同時に含むことはできません。

代わりに、典型的なユーザーエージェントは英語からフランス語への言語アークを 1 つだけ (おそらく ("en", "fr"))サポートするか、または ("en", "fr-FR")、("en", "fr-CA")、および ("en", "fr-CH") のような、 複数の非重複の英語からフランス語への言語アークをサポートできます。

後者の場合、Web 開発者が ai.translator.create({ sourceLanguage: "en", targetLanguage: "fr" }) を使用して翻訳器の作成を要求したなら、LookupMatchingLocaleByBestFit アルゴリズムは、 使用する 3 つの可能な言語アークのうち 1 つ(おそらく ("en", "fr-FR"))を選びます。

言語アーク arc は、 次の手順が true を返す場合、同一性翻訳によって満たすことができます
  1. LookupMatchingLocaleByBestFitarcソース言語 », « arcターゲット言語 ») が undefined でない場合は、 true を返します。

  2. LookupMatchingLocaleByBestFitarcターゲット言語 », « arcソース言語 ») が undefined でない場合は、 true を返します。

  3. false を返します。

3.3. Translator クラス

すべての Translator は、作成時に設定される 文字列である、 ソース言語を持ちます。

すべての Translator は、作成時に設定される 文字列である、 ターゲット言語を持ちます。

すべての Translator は、作成時に設定される数値である、入力クォータを持ちます。


sourceLanguage getter 手順は、thisソース 言語を返すことです。

targetLanguage getter 手順は、thisターゲット 言語を返すことです。

inputQuota getter 手順は、this入力 クォータを返すことです。


translate(input, options) メソッド 手順は次のとおりです。
  1. operation を、引数 chunkProduced, done, error, および stopProducing を取り、thisソース言語thisターゲット言語this入力クォータchunkProduced, done, error, および stopProducing を与えて input翻訳するアルゴリズム手順とします。

  2. thisoptions、および operation を与えて 集約された AI モデル結果を取得する結果を返します。

translateStreaming(input, options) メソッド手順は次のとおりです。
  1. operation を、引数 chunkProduced, done, error, および stopProducing を取り、thisソース言語thisターゲット言語this入力クォータchunkProduced, done, error, および stopProducing を与えて input翻訳するアルゴリズム手順とします。

  2. thisoptions、および operation を与えて ストリーミング AI モデル結果を取得する結果を返します。

measureInputUsage(input, options) メソッド手順は次のとおりです。
  1. measureUsage を、引数 stopMeasuring を取り、 inputthisソース言語thisターゲット言語、および stopMeasuring を与えて 翻訳器入力使用量を測定する結果を返す アルゴリズム手順とします。

  2. thisoptions、および measureUsage を与えて AI モデル入力使用量を測定する結果を返します。

3.4. 翻訳

3.4.1. アルゴリズム

次が与えられたとき、翻訳するには:

次の手順を実行します:

  1. Assert: このアルゴリズムは 並列に実行されています。

  2. requested を、inputsourceLanguagetargetLanguage、および stopProducing を与えて 翻訳器入力使用量を測定する結果とします。

  3. requested が null の場合は、返ります。

  4. requestedエラー情報である場合:

    1. requested を与えて error を実行します。

    2. 返ります。

  5. Assert: requested は数値です。

  6. requestedinputQuota より大きい場合:

    1. errorInfo を、requestedrequested と、 inputQuotaquota を持つ クォータ超過エラー情報とします。

    2. errorInfo を与えて error を実行します。

    3. 返ります。

    実際には、実装は翻訳そのものと同じモデル呼び出しの一部として、 入力使用量をクォータに照らして確認すると想定しています。仕様では、理解しやすくするためだけに 手順を分離しています。

  7. 次のガイドラインに従い、実装定義の方法で、inputsourceLanguage から targetLanguage へ翻訳する処理を開始します。

    input が空文字列である場合、またはそれ以外の形で翻訳可能な内容を含まない (たとえば、空白または制御文字だけを含む)場合、結果の翻訳は input であるべきです。 そのような場合、sourceLanguage および targetLanguage は無視されるべきです。

    (sourceLanguage, targetLanguage) が同一性翻訳によって満たすことができる場合、 結果の翻訳は input であるべきです。

    翻訳処理は、Writing Assistance APIs § 6 Privacy considerations および Writing Assistance APIs § 7 Security considerations で与えられている指針に適合しなければならず、 特に(ただしこれに限定されず)Writing Assistance APIs § 6.4 User input および Writing Assistance APIs § 7.2 Runtime shared resources を含みます。

  8. true の間:

    1. 翻訳されたテキストの次のチャンクが生成されるか、翻訳処理が終了するか、または stopProducing を呼び出した結果が true になるまで待ちます。

    2. そのようなチャンクが正常に生成された場合:

      1. それを 文字列 chunk として表します。

      2. chunk を与えて chunkProduced を実行します。

    3. そうではなく、翻訳処理が終了した場合:

      1. done を実行します。

      2. Break します。

    4. そうではなく、stopProducing が true を返す場合は、break します。

    5. そうではなく、翻訳中にエラーが発生した場合:

      1. エラーを、§ 3.4.3 エラーの指針に従った DOMException エラー 情報 errorInfo として表します。

      2. errorInfo を与えて error を実行します。

      3. Break します。

3.4.2. 使用量

次が与えられたとき、翻訳器 入力使用量を測定するには:

次の手順を実行します:

  1. Assert: このアルゴリズムは 並列に実行されています。

  2. inputToModel を、inputsourceLanguage から targetLanguage翻訳するために基盤モデルへ送信されることになる 実装定義の文字列とします。

    sourceLanguage および targetLanguage が初期化中にモデルへロードされた場合、これは単に input 自体である可能性があります。または、対象の言語をエンコードするための適切なクォータ使用量や、 言語モデルへの何らかのラッパープロンプトなど、より多くのものから構成される可能性もあります。

    この処理中に stopMeasuring が true を返し始めた場合は、null を返します。

    この処理中にエラーが発生した場合は、§ 3.4.3 エラーの指針に従って、 適切な DOMException エラー情報を返します。

  3. 基盤モデルに与えられるときに inputToModel を表すために必要な入力使用量を返します。 正確な計算手順は、次の制約に従う 実装定義です。

    返される入力使用量は非負かつ有限でなければなりません。翻訳処理に使用量クォータがない場合 (すなわち、入力クォータが +∞ の場合)、 それは 0 でなければなりません。そうでなければ、それは正でなければならず、 inputToModel長さに おおよそ比例するべきです。

    これは、input言語モデル トークン化方式で表すために必要なトークン数である可能性もあれば、input長さである可能性もあります。 また、モデルに与えるために必要な任意の接頭辞または接尾辞の使用量も数える、これらの何らかの変種である可能性もあります。

    この処理中に stopMeasuring が true を返し始めた場合は、代わりに null を返します。

    この処理中にエラーが発生した場合は、代わりに § 3.4.3 エラーの指針に従って、 適切な DOMException エラー情報を返します。

3.4.3. エラー

翻訳が失敗した場合、次の可能な理由が Web 開発者に提示される可能性があります。この表は、可能な DOMException name と、実装がそれらを使用するべき場合を示します:

DOMException name シナリオ
"NotAllowedError"

翻訳がユーザーの選択またはユーザーエージェントのポリシーによって無効化されています。

"NotReadableError"

翻訳出力がユーザーエージェントによってフィルタリングされました。たとえば、有害、不正確、 または意味をなさないものとして検出されたためです。

"UnknownError"

その他すべてのシナリオ。これには、ユーザーエージェントが翻訳できないと考え、かつ Writing Assistance APIs § 6 Privacy considerations および Writing Assistance APIs § 7 Security considerations で与えられる要件も満たせないと考える場合を含みます。 または、ユーザーエージェントが失敗理由を開示しないことを望む場合です。

この表は、翻訳器 API によって提示され得る例外の完全なリストを与えるものではありません。 これは、特定の 実装定義手順から来る可能性があるものだけを含みます。

3.5. 権限ポリシー統合

翻訳器 API へのアクセスは、ポリシー制御機能 "translator" の背後で制御されます。これは 'self'既定の許可リストを持ちます。

4. 言語検出 API

[Exposed=Window, SecureContext]
interface LanguageDetector {
  static Promise<LanguageDetector> create(
    optional LanguageDetectorCreateOptions options = {}
  );
  static Promise<Availability> availability(
    optional LanguageDetectorCreateCoreOptions options = {}
  );

  Promise<sequence<LanguageDetectionResult>> detect(
    DOMString input,
    optional LanguageDetectorDetectOptions options = {}
  );

  readonly attribute FrozenArray<DOMString>? expectedInputLanguages;

  Promise<double> measureInputUsage(
    DOMString input,
    optional LanguageDetectorDetectOptions options = {}
  );
  readonly attribute unrestricted double inputQuota;
};
LanguageDetector includes DestroyableModel;

dictionary LanguageDetectorCreateCoreOptions {
  sequence<DOMString> expectedInputLanguages;
};

dictionary LanguageDetectorCreateOptions : LanguageDetectorCreateCoreOptions {
  AbortSignal signal;
  CreateMonitorCallback monitor;
};

dictionary LanguageDetectorDetectOptions {
  AbortSignal signal;
};

dictionary LanguageDetectionResult {
  DOMString detectedLanguage;
  double confidence;
};

4.1. 作成

静的 create(options) メソッド手順は次のとおりです:
  1. options、"language-detector"、 言語検出器オプションを検証および正準化する言語検出器オプションの可用性を計算する言語検出器モデルをダウンロードする言語検出器モデルを初期化する、および 言語検出器オブジェクトを作成するを与えて、 AI モデルオブジェクトを作成する結果を返します。

LanguageDetectorCreateCoreOptions options が与えられたとき、言語検出器オプションを検証および正準化するには、 次の手順を実行します。これらは、言語タグを正準化するために options をその場で変更し、 いずれかが無効であれば例外を投げます。
  1. options および "expectedInputLanguages" を与えて、 言語タグを検証および正準化する

LanguageDetectorCreateCoreOptions options が与えられたとき、言語検出器モデルをダウンロードするには:
  1. Assert: これらの手順は 並列に実行されています。

  2. options["expectedInputLanguages"] 内のすべての言語を含め、入力テキストの言語を検出するためにユーザーエージェントが必要とする すべてのものについて、ダウンロード処理を開始します。

    これには、基盤となる言語検出モデルと、options["expectedInputLanguages"] で識別される言語を助けるための特定のファインチューニングまたはその他の素材の両方が含まれる可能性があります。

  3. 何らかの理由でダウンロード処理を開始できない場合は、false を返します。

  4. true を返します。

LanguageDetectorCreateCoreOptions options が与えられたとき、言語検出器モデルを初期化するには:
  1. Assert: これらの手順は 並列に実行されています。

  2. 入力テキストの言語を検出するためのユーザーエージェントの能力を支える AI モデルについて、 必要な初期化操作を実行します。

    これには、モデルをメモリにロードすること、または options["expectedInputLanguages"] で識別される言語をサポートするために必要なファインチューニングをロードすることが含まれる可能性があります。

  3. 何らかの理由で初期化が失敗した場合は、DOMException エラー情報を返します。その name は "OperationError" であり、その details には適切な詳細が含まれます。

  4. null を返します。

realm realm および LanguageDetectorCreateCoreOptions options が与えられたとき、言語検出器オブジェクトを作成するには:
  1. Assert: これらの手順は realmsurrounding agentevent loop 上で実行されています。

  2. inputQuota を、将来の言語 検出操作のためにユーザーエージェントが利用できる入力クォータの量とします。(この値は 実装定義であり、ユーザーのメモリや JavaScript 文字列の制限などを超える 特定の制限がない場合には +∞ である可能性があります。)

  3. realm 内に作成された新しい LanguageDetector オブジェクトを、次を伴って返します。

    期待される入力言語

    options["expectedInputLanguages"] が空でない場合は、それを与えて 凍結配列を作成する結果。そうでなければ null

    入力クォータ

    inputQuota

4.2. 可用性

静的 availability(options) メソッド手順 は次のとおりです:
  1. options、"language-detector"、 言語検出器オプションを検証および正準化する、 および 言語検出器オプションの可用性を計算するを与えて、 AI モデルの可用性を計算する結果を返します。

LanguageDetectorCreateCoreOptions options が与えられたとき、言語検出器オプションの可用性を計算するには、 次の手順を実行します。これらは Availability 値または null のいずれかを返し、言語タグをその最良適合の一致に更新するために options を その場で変更します。
  1. Assert: このアルゴリズムは 並列に実行されています。

  2. ユーザーエージェントがサポートできる言語検出能力を判断しようとした際に何らかのエラーがあり、 ユーザーエージェントがそれを一時的なもの(再照会すればそのようなエラーが発生しなくなる可能性があるもの)と 考える場合は、null を返します。

  3. partition を、その言語で書かれたテキストを検出する目的を与えて 言語可用性パーティションを取得する結果とします。

  4. options["expectedInputLanguages"] および partition を与えて 言語可用性を計算する結果を返します。

4.3. LanguageDetector クラス

すべての LanguageDetector は、作成時に設定される 期待される入力言語、すなわち FrozenArray<DOMString> または null を持ちます。

すべての LanguageDetector は、作成時に設定される数値である、入力クォータを持ちます。


expectedInputLanguages getter 手順 は、this期待される入力言語を返すことです。

inputQuota getter 手順は、this入力クォータを返すことです。


detect(input, options) メソッド 手順は次のとおりです:
  1. global を、this関連するグローバルオブジェクトとします。

  1. Assert: globalWindow オブジェクトです。

  2. global関連付けられた Document完全にアクティブでない場合は、"InvalidStateError" DOMException拒否された promiseを返します。

  3. signals を « this破棄中止 コントローラーsignal » とします。

  4. options["signal"] が存在する場合は、それを signals追加します

  5. compositeSignal を、signalsAbortSignal、 および this関連する realm を用いて、依存中止シグナルを作成する結果とします。

  6. compositeSignal中止済みである場合は、 compositeSignal中止理由拒否された promiseを返します。

  7. promise を、this関連する realm 内に作成された新しい promiseとします。

  8. abortedDuringOperation を false とします。

    この変数は event loop から書き込まれますが、並列に読み取られます。

  9. compositeSignal次の中止手順を追加します:

    1. abortedDuringOperation を true に設定します。

    2. compositeSignal中止理由promise拒否します

  10. inputQuota を、this入力クォータとします。

  11. 並列に:

    1. stopProducing を次の手順とします:

      1. abortedDuringOperation を返します。

    2. result を、input, inputQuota, および stopProducing を与えて 言語を検出する結果とします。

    3. global を与えて、AI タスクソース上に グローバルタスクをキューに入れ、次の手順を実行します:

      1. abortedDuringOperation が true である場合は、これらの手順を中止します。

      2. そうではなく、resultエラー情報である場合は、result を与えて エラー情報を例外オブジェクトに変換する結果で promise拒否します

      3. そうでなければ:

        1. Assert: resultLanguageDetectionResult 辞書のリストです。(この場合 abortedDuringOperation が true であったはずなので、null ではありません。)

        2. resultpromise解決します

measureInputUsage(input, options) メソッド手順は次のとおりです:
  1. measureUsage を、引数 stopMeasuring を取り、 input および stopMeasuring を与えて 言語検出器入力使用量を測定する結果を返す アルゴリズム手順とします。

  2. thisoptions、および measureUsage を与えて AI モデル入力使用量を測定する結果を返します。

4.4. 言語検出

4.4.1. アルゴリズム

文字列 input、数値 inputQuota、および引数を取らずブール値を返すアルゴリズム stopProducing が与えられたとき、言語を検出するには、 次の手順を実行します。これらは null、エラー情報、または LanguageDetectionResult 辞書のリストのいずれかを返します。
  1. Assert: このアルゴリズムは 並列に実行されています。

  2. requested を、input および stopProducing を与えて 言語検出器入力使用量を測定する結果とします。

  3. requested が null またはエラー情報である場合は、requested を返します。

  4. Assert: requested は数値です。

  5. requestedinputQuota より大きい場合は、 requestedrequestedinputQuotaquota を持つ クォータ超過エラー情報を返します。

    実際には、実装は言語検出そのものと同じモデル呼び出しの一部として、 入力使用量をクォータに照らして確認すると想定しています。仕様では、理解しやすくするためだけに 手順を分離しています。

  6. partition を、その言語で書かれたテキストを検出する目的を与えて 言語可用性パーティションを取得する結果とします。

  7. currentlyAvailableLanguagespartition["available"] とします。

  8. 次のガイドラインに従い、実装定義の方法で、rawResult および unknowninput の言語を検出した結果とします。

    rawResult は、currentlyAvailableLanguages 内の各言語について キーを持つ mapでなければなりません。 そのような各キーの は、0 から 1 の間の数値でなければなりません。この値は、 input がその言語で書かれているという実装の信頼度を表さなければなりません。

    unknown は、inputcurrentlyAvailableLanguages 内の いずれの言語でも書かれていないという実装の信頼度を表す、0 から 1 の間の数値でなければなりません。

    rawResultunknown を加えたものは、 合計で 1 にならなければなりません。そのような各値、または unknown は 0 でも構いません。

    実装が input を複数の言語で書かれていると考える場合、rawResult および unknown の値が、検出された各言語で書かれた input の量に比例するように 配分することを試みるべきです。input を配分する正確な方式は 実装定義です。

    input が "tacosを食べる" である場合、実装はこれを "tacos" と "を食べる" に分割し、それぞれの言語を別々に 検出するかもしれません。最初の部分は信頼度 0.5 で英語、信頼度 0.5 でスペイン語として検出され、 2 番目の部分は信頼度 1 で日本語として検出されるかもしれません。その結果の rawResult は «[ "en" → 0.25, "es" → 0.25, "ja" → 0.5 ]» (unknown は 0 に設定)になる可能性があります。

    これを、たとえば "tacos"、""、および "食べる" の 3 つの部分ではなく 2 つの部分に分割する決定は、実装定義の選択でした。同様に、たとえば コード ポイント数で重み付けする代わりに、各部分を結果の「半分」に寄与するものとして扱う決定も 実装定義でした。

    (現実的には、ほとんどの言語検出モデルでは一般に 4〜5 個を超える コード ポイントが必要であるため、実装はこれより大きなチャンクで分割すると想定しています。)

    この処理中の任意の時点で stopProducing が true を返す場合は、null を返します。

    言語検出中にエラーが発生した場合は、§ 4.4.3 エラーの指針に従って、エラー情報を返します。

    検出処理は、Writing Assistance APIs § 6 Privacy considerations および Writing Assistance APIs § 7 Security considerations で与えられている指針に適合しなければならず、 特に(ただしこれに限定されず)Writing Assistance APIs § 6.4 User input および Writing Assistance APIs § 7.2 Runtime shared resources を含みます。

  9. 降順にソートします。すなわち rawResult を、 entry a および b が与えられたとき、abより小さい場合に true を返す less than アルゴリズムでソートします。

  10. results を空のリストとします。

  11. cumulativeConfidence を 0 とします。

  12. rawResult の各 keyvalue について 反復します:

    1. value が 0 である場合は、break します。

    2. valueunknown より小さい場合は、break します。

    3. «[ "detectedLanguage" → key, "confidence" → value ]» を results追加します

    4. cumulativeConfidencecumulativeConfidence + value に設定します。

    5. cumulativeConfidence が 0.99 以上である場合は、break します。

  13. Assert: 1 − cumulativeConfidenceunknown 以上です。

  14. Assert: resultssize が 0 より大きい場合、 results[resultssize - 1]["confidence"] は unknown 以上です。

  15. «[ "detectedLanguage" → "und", "confidence" → unknown ]» を results追加します

  16. results を返します。

可能性が 1% 未満の言語、またはテキストの 1% 未満に寄与する言語は、 ノイズである可能性が高く、Web 開発者に返す価値がないとみなされます。同様に、実装が、ある言語について、 そのテキストが知っているどの言語でもないことよりも確信が低い場合、その言語はおそらく Web 開発者に返す価値がありません。

そのような低確率の結果が省略されるため、 Web 開発者に返されるすべての信頼度値の合計は 1 未満になる可能性があります。

4.4.2. 使用量

文字列 input および引数を取らずブール値を返すアルゴリズム stopMeasuring が与えられたとき、 言語検出器入力使用量を測定するには、 次の手順を実行します:
  1. Assert: このアルゴリズムは 並列に実行されています。

  2. inputToModel を、input を与えて 言語を検出するために基盤モデルへ送信されることになる 実装定義の文字列とします。

    これは単に input 自体である可能性もあれば、 言語モデルへの何らかのラッパープロンプトを含む可能性もあります。

    この処理中に stopMeasuring が true を返し始めた場合は、null を返します。

    この処理中にエラーが発生した場合は、§ 4.4.3 エラーの指針に従って、 適切な DOMException エラー情報を返します。

  3. 基盤モデルに与えられるときに inputToModel を表すために必要な入力使用量を返します。 正確な計算手順は、次の制約に従う 実装定義です。

    返される入力使用量は非負かつ有限でなければなりません。翻訳処理に使用量クォータがない場合 (すなわち、入力 クォータが +∞ の場合)、それは 0 でなければなりません。そうでなければ、それは正でなければならず、 inputToModel長さにおおよそ比例するべきです。

    これは、input言語モデル トークン化方式で表すために必要なトークン数である可能性もあれば、input長さである可能性もあります。 また、モデルに与えるために必要な任意の接頭辞または接尾辞の使用量も数える、これらの何らかの変種である可能性もあります。

    この処理中に stopMeasuring が true を返し始めた場合は、代わりに null を返します。

    この処理中にエラーが発生した場合は、代わりに § 4.4.3 エラーの指針に従って、 適切な DOMException エラー情報を返します。

4.4.3. エラー

言語検出が失敗した場合、次の可能な理由が Web 開発者に提示される可能性があります。この表は、可能な DOMException name と、実装がそれらを使用するべき場合を示します:

DOMException name シナリオ
"NotAllowedError"

言語検出がユーザーの選択またはユーザーエージェントのポリシーによって無効化されています。

"UnknownError"

その他すべてのシナリオ。これには、ユーザーエージェントが検出できないと考え、かつ Writing Assistance APIs § 6 Privacy considerations および Writing Assistance APIs § 7 Security considerations で与えられる要件も満たせないと考える場合を含みます。 または、ユーザーエージェントが失敗理由を開示しないことを望む場合です。

この表は、言語検出器 API によって提示され得る例外の完全なリストを与えるものではありません。 これは、特定の 実装定義手順から来る可能性があるものだけを含みます。

4.5. 権限ポリシー統合

言語検出器 API へのアクセスは、ポリシー制御機能 "language-detector" の背後で制御されます。これは 'self'既定の許可リストを持ちます。

5. プライバシーに関する考慮事項

翻訳器および言語検出器 API のプライバシーに関する考慮事項の議論については、 Writing Assistance APIs § 6 Privacy considerations を参照してください。そのテキストは、 § 2 依存関係で述べたように、同じインフラストラクチャを共有するすべての API に適用されるように書かれています。

6. セキュリティに関する考慮事項

翻訳器および言語検出器 API のセキュリティに関する考慮事項の議論については、 Writing Assistance APIs § 7 Security considerations を参照してください。そのテキストは、 § 2 依存関係で述べたように、同じインフラストラクチャを共有するすべての API に適用されるように書かれています。

索引

この仕様で定義される 用語

参照により定義される 用語

参考文献

規範的参考文献

[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMA-402]
ECMAScript Internationalization API Specification. URL: https://tc39.es/ecma402/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.es/ecma262/multipage/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[STREAMS]
Adam Rice; et al. Streams Standard. Living Standard. URL: https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/
[WRITING-ASSISTANCE-APIS]
Writing Assistance APIs. コミュニティグループ報告書草案。 URL: https://webmachinelearning.github.io/writing-assistance-apis/

参考情報

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. Tags for Identifying Languages. 2009年9月。Best Current Practice。 URL: https://www.rfc-editor.org/rfc/rfc5646
[UTS35]
Mark Davis; et al. Unicode Locale Data Markup Language (LDML). 2020年10月23日。Unicode Technical Standard #35。 URL: https://www.unicode.org/reports/tr35/tr35-61/tr35.html

IDL 索引

[Exposed=Window, SecureContext]
interface Translator {
  static Promise<Translator> create(TranslatorCreateOptions options);
  static Promise<Availability> availability(TranslatorCreateCoreOptions options);

  Promise<DOMString> translate(
    DOMString input,
    optional TranslatorTranslateOptions options = {}
  );
  ReadableStream translateStreaming(
    DOMString input,
    optional TranslatorTranslateOptions options = {}
  );

  readonly attribute DOMString sourceLanguage;
  readonly attribute DOMString targetLanguage;

  Promise<double> measureInputUsage(
    DOMString input,
    optional TranslatorTranslateOptions options = {}
  );
  readonly attribute unrestricted double inputQuota;
};
Translator includes DestroyableModel;

dictionary TranslatorCreateCoreOptions {
  required DOMString sourceLanguage;
  required DOMString targetLanguage;
};

dictionary TranslatorCreateOptions : TranslatorCreateCoreOptions {
  AbortSignal signal;
  CreateMonitorCallback monitor;
};

dictionary TranslatorTranslateOptions {
  AbortSignal signal;
};

[Exposed=Window, SecureContext]
interface LanguageDetector {
  static Promise<LanguageDetector> create(
    optional LanguageDetectorCreateOptions options = {}
  );
  static Promise<Availability> availability(
    optional LanguageDetectorCreateCoreOptions options = {}
  );

  Promise<sequence<LanguageDetectionResult>> detect(
    DOMString input,
    optional LanguageDetectorDetectOptions options = {}
  );

  readonly attribute FrozenArray<DOMString>? expectedInputLanguages;

  Promise<double> measureInputUsage(
    DOMString input,
    optional LanguageDetectorDetectOptions options = {}
  );
  readonly attribute unrestricted double inputQuota;
};
LanguageDetector includes DestroyableModel;

dictionary LanguageDetectorCreateCoreOptions {
  sequence<DOMString> expectedInputLanguages;
};

dictionary LanguageDetectorCreateOptions : LanguageDetectorCreateCoreOptions {
  AbortSignal signal;
  CreateMonitorCallback monitor;
};

dictionary LanguageDetectorDetectOptions {
  AbortSignal signal;
};

dictionary LanguageDetectionResult {
  DOMString detectedLanguage;
  double confidence;
};