翻译器和语言检测器 API

社区组报告草案,

关于此文档的更多详细信息
此版本:
https://webmachinelearning.github.io/translation-api
问题跟踪:
GitHub
编辑:
(Google)
Ehsan Toreini (Samsung)
前编辑:
Domenic Denicola (Google)

摘要

翻译器和语言检测器 API 赋予网页在语言之间翻译文本、 以及检测此类文本语言的能力。

本文档的状态

本规范由 Web 机器学习社区组发布。 它不是 W3C 标准,也不在 W3C 标准轨道上。 请注意,根据 W3C 社区贡献者许可协议 (CLA), 存在有限的退出选择,并且适用其他条件。 了解有关 W3C 社区组和商业组的更多信息。

1. 引言

翻译器和语言检测器 API 暴露了在人类语言之间翻译文本、 以及检测此类文本语言的能力。它们补充了浏览器为这些目的内置的任何 UI 功能, 使 Web 开发者能够以编程方式触发这些操作,并将其集成到他们的应用中。 这对于处理用户输入,或从网络检索到的文本特别有用。

这些 API 旨在为翻译和语言检测提供高级接口, 抽象掉底层机器学习模型及其管理的复杂性。为了处理由不同实现策略或语言支持引起的潜在互操作性问题, API 设计引导开发者检查其应用所依赖语言的可用性, 并包含适当的错误处理。

2. 依赖项

本规范依赖 Infra 标准。[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 considerationsWriting Assistance APIs § 7 Security considerations 中讨论。实现这些 API 需要实现该 共享基础设施,并符合这些隐私和安全考虑。但这并不要求 实现或暴露实际的写作辅助 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. 断言:这些步骤正在并行地运行。

  2. 启动下载过程,下载用户代理将文本从 options["sourceLanguage"] 翻译到 options["targetLanguage"] 所需的一切内容。

    这可能同时包括基础翻译模型和特定的语言弧材料,或者如果使用中间语言, 也可能包括多个语言弧的材料。

  3. 如果由于任何原因无法启动下载过程,则返回 false。

  4. 返回 true。

要在给定一个 TranslatorCreateCoreOptions options 的情况下初始化翻译模型
  1. 断言:这些步骤正在并行地运行。

  2. 为支持用户代理从 options["sourceLanguage"] 翻译到 options["targetLanguage"] 能力的 AI 模型,执行任何必要的初始化操作。

    这可能包括将模型加载到内存中,或加载为支持相关特定选项而必要的任何微调。

  3. 如果初始化由于任何原因失败,则返回一个 DOMException 错误信息,其 name 为 "OperationError", 并且其 details 包含适当的细节。

  4. 返回 null。

要在给定一个 realm realm 和一个 TranslatorCreateCoreOptions options 的情况下创建 翻译器对象
  1. 断言:这些步骤正在 realm周围代理事件循环上运行。

  2. inputQuota 为用户代理可用于未来翻译 操作的输入配额量。(此值是由实现定义的,并且如果除了例如用户内存或 JavaScript 字符串限制之外 没有特定限制,则可以为 +∞。)

  3. 返回一个新的 Translator 对象,它在 realm 中创建,具有

    源语言

    options["sourceLanguage"]

    目标语言

    options["targetLanguage"]

    输入配额

    inputQuota

3.2. 可用性

静态 availability(options) 方法步骤为:
  1. 返回在给定 options、"translator"、 验证并规范化 翻译器选项、以及 计算翻译器选项 可用性的情况下,计算 AI 模型可用性的结果。

要在给定一个 TranslatorCreateCoreOptions options 的情况下计算翻译器选项可用性, 执行以下步骤。它们返回一个 Availability 值或 null,并且会就地改变 options,以将语言标签更新为它们的最佳匹配。
  1. 断言:此算法正在并行地运行。

  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 对象的 sourceLanguagetargetLanguage 属性将返回原始输入,而不是某种规范化形式。

  6. 返回 "unavailable"。

语言弧是由两个 字符串构成的元组, 即一个源语言和一个 目标 语言。每一项都是一个 Unicode 规范化语言环境标识符

翻译器语言弧可用性由以下步骤给出。 它们返回一个从语言弧Availability 值的映射,或返回 null。
  1. 断言:此算法正在并行地运行。

  2. 如果尝试确定用户代理可支持哪些语言弧之间的文本翻译时出现某些错误, 并且用户代理认为该错误是暂时性的(使得重新查询可能不再产生此类错误), 则返回 null。

  3. 返回一个从语言弧Availability 值的映射,其中每个键都是用户代理支持在其之间翻译文本的 语言弧,并按以下约束填充:

假设用户代理的翻译器语言弧可用性如下:

使用 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";
如果以下步骤返回 true,则一个语言弧 arc 一个由语言弧组成的 集合 otherArcs 重叠:
  1. sourceLanguages 为由 otherArcs 中每个源语言组成的集合

  2. 如果 LookupMatchingLocaleByBestFit(sourceLanguages, « arc源语言 ») 不是 undefined,则 返回 true。

  3. targetLanguages 为由 otherArcs 中每个目标语言组成的集合

  4. 如果 LookupMatchingLocaleByBestFit(targetLanguages, « arc目标语言 ») 不是 undefined,则 返回 true。

  5. 返回 false。

语言弧 ("en", "fr") 与 « ("en", "fr-CA") » 重叠,因此 用户代理的翻译器语言弧可用性不能 同时包含这两个语言 弧

相反,典型的用户代理要么只支持一个英语到法语语言弧(大概是 ("en", "fr")),要么可以支持多个不重叠的英语到法语 语言弧,例如 ("en", "fr-FR")、("en", "fr-CA") 和 ("en", "fr-CH")。

在后一种情况下,如果 Web 开发者请求使用 ai.translator.create({ sourceLanguage: "en", targetLanguage: "fr" }) 创建翻译器,LookupMatchingLocaleByBestFit 算法会 选择三个可能语言弧之一来使用(大概是 ("en", "fr-FR"))。

如果以下步骤返回 true,则一个语言弧 arc 可由恒等 翻译满足
  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 为一个算法步骤,它接受参数 chunkProduceddoneerrorstopProducing,并在给定 this源语言this目标语言this输入配额chunkProduceddoneerrorstopProducing 的情况下,翻译 input

  2. 返回在给定 thisoptionsoperation 的情况下,获取聚合 AI 模型结果的结果。

translateStreaming(input, options) 方法步骤为:
  1. operation 为一个算法步骤,它接受参数 chunkProduceddoneerrorstopProducing,并在给定 this源语言this目标语言this输入配额chunkProduceddoneerrorstopProducing 的情况下,翻译 input

  2. 返回在给定 thisoptionsoperation 的情况下,获取流式 AI 模型结果的结果。

measureInputUsage(input, options) 方法步骤为:
  1. measureUsage 为一个算法步骤,它接受参数 stopMeasuring, 并在给定 inputthis源语言this目标语言、以及 stopMeasuring 的情况下, 返回测量翻译器输入用量的结果。

  2. 返回在给定 thisoptionsmeasureUsage 的情况下,测量 AI 模型输入用量的结果。

3.4. 翻译

3.4.1. 算法

要在给定以下内容的情况下翻译

执行以下步骤:

  1. 断言:此算法正在并行地运行。

  2. requested 为在给定 inputsourceLanguagetargetLanguagestopProducing 的情况下测量翻译器输入用量的结果。

  3. 如果 requested 为 null,则返回。

  4. 如果 requested错误信息,则:

    1. 使用 requested 执行 error

    2. 返回。

  5. 断言requested 是一个数字。

  6. 如果 requested 大于 inputQuota,则:

    1. errorInfo 为一个配额超出错误信息, 其requestedrequested,其quotainputQuota

    2. 使用 errorInfo 执行 error

    3. 返回。

    实际上,我们预计实现会将输入用量与配额的检查 作为与翻译本身相同的模型调用的一部分来完成。规范中分离这些步骤只是为了便于理解。

  7. 由实现定义的方式,在遵循以下指南的前提下, 开始将 inputsourceLanguage 翻译为 targetLanguage 的过程。

    如果 input 是空字符串,或以其他方式不包含可翻译内容(例如, 只包含空白字符或控制字符),则生成的翻译应为 input。在这种情况下,sourceLanguagetargetLanguage 应 被忽略。

    如果 (sourceLanguage, targetLanguage) 可由 恒等翻译满足,则生成的翻译应为 input

    翻译过程必须符合 Writing Assistance APIs § 6 Privacy considerationsWriting Assistance APIs § 7 Security considerations 中给出的指南,尤其包括(但不限于) Writing Assistance APIs § 6.4 User inputWriting Assistance APIs § 7.2 Runtime shared resources

  8. 当 true 时:

    1. 等待下一块翻译文本产生、翻译过程完成、或调用 stopProducing 的结果变为 true。

    2. 如果成功产生了这样一个块:

      1. 令它表示为一个字符串 chunk

      2. 使用 chunk 执行 chunkProduced

    3. 否则,如果翻译过程已经完成:

      1. 执行 done

      2. 中断

    4. 否则,如果 stopProducing 返回 true,则中断

    5. 否则,如果翻译期间发生错误:

      1. 令该错误按照 § 3.4.3 错误 中的指南表示为一个 DOMException 错误 信息 errorInfo

      2. 使用 errorInfo 执行 error

      3. 中断

3.4.2. 用量

要在给定以下内容的情况下测量 翻译器输入用量

执行以下步骤:

  1. 断言:此算法正在并行地运行。

  2. inputToModel 为为了将 inputsourceLanguage 翻译到 targetLanguage 而会发送给底层模型的由实现定义的字符串。

    如果 sourceLanguagetargetLanguage 在初始化期间已加载到模型中,这可能只是 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 considerationsWriting 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. 断言:这些步骤正在并行地运行。

  2. 启动下载过程,下载用户代理检测输入文本语言所需的一切内容, 包括 options["expectedInputLanguages"] 中的所有语言。

    这可能同时包括基础语言检测模型,以及用于帮助处理 options["expectedInputLanguages"] 中所标识语言的特定微调或其他材料。

  3. 如果由于任何原因无法启动下载过程,则返回 false。

  4. 返回 true。

要在给定一个 LanguageDetectorCreateCoreOptions options 的情况下初始化语言检测器模型
  1. 断言:这些步骤正在并行地运行。

  2. 为支持用户代理检测输入文本语言能力的 AI 模型执行任何必要的初始化操作。

    这可能包括将模型加载到内存中,或加载为支持 options["expectedInputLanguages"] 中所标识语言而必要的任何微调。

  3. 如果初始化由于任何原因失败,则返回一个 DOMException 错误信息,其 name 为 "OperationError", 并且其 details 包含适当的细节。

  4. 返回 null。

要在给定一个 realm realm 和一个 LanguageDetectorCreateCoreOptions options 的情况下创建语言检测器对象
  1. 断言:这些步骤正在 realm周围代理事件循环上运行。

  2. inputQuota 为用户代理可用于未来语言 检测操作的输入配额量。(此值是由实现定义的,并且如果除了例如用户内存或 JavaScript 字符串限制之外 没有特定限制,则可以为 +∞。)

  3. 返回一个新的 LanguageDetector 对象,它在 realm 中创建,具有

    预期输入语言

    如果 options["expectedInputLanguages"] 不为空,则为在给定它的情况下创建冻结数组的结果;否则为 null

    输入配额

    inputQuota

4.2. 可用性

静态 availability(options) 方法步骤 为:
  1. 返回在给定 options、"language-detector"、 验证并规范化 语言检测器选项、以及 计算语言检测器 选项可用性的情况下,计算 AI 模型可用性的结果。

要在给定一个 LanguageDetectorCreateCoreOptions options 的情况下计算语言检测器选项可用性, 执行以下步骤。它们返回一个 Availability 值或 null,并且会就地改变 options,以将语言标签更新为它们的最佳匹配。
  1. 断言:此算法正在并行地运行。

  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. globalthis相关全局对象

  1. 断言global 是一个 Window 对象。

  2. 如果 global关联 Document 不是完全活动的,则返回 "InvalidStateError" DOMException 拒绝的 promise。

  3. signals 为 « this销毁中止 控制器signal »。

  4. 如果 options["signal"] 存在,则将其追加signals

  5. compositeSignal 为使用 AbortSignal 并给定 signalsthis相关 realm创建依赖中止信号的结果。

  6. 如果 compositeSignal中止,则返回 compositeSignal中止原因拒绝的 promise。

  7. promise 为在 this相关 realm 中创建的新 promise

  8. abortedDuringOperation 为 false。

    此变量将从事件循环写入,但从并行地读取。

  9. compositeSignal 添加以下中止步骤

    1. abortedDuringOperation 设为 true。

    2. compositeSignal中止原因 拒绝 promise

  10. inputQuotathis输入配额

  11. 并行地

    1. stopProducing 为以下步骤:

      1. 返回 abortedDuringOperation

    2. result 为在给定 inputinputQuotastopProducing 的情况下检测语言的结果。

    3. 在给定 global 的情况下,将一个全局任务排入AI 任务源,以执行以下步骤:

      1. 如果 abortedDuringOperation 为 true,则中止这些步骤。

      2. 否则,如果 result错误信息,则用在给定 result 的情况下将 错误信息转换为异常对象的结果拒绝 promise

      3. 否则:

        1. 断言result 是一个由 LanguageDetectionResult 字典组成的列表。(它不是 null,因为在那种情况下 abortedDuringOperation 本应为 true。)

        2. result 兑现 promise

measureInputUsage(input, options) 方法步骤为:
  1. measureUsage 为一个算法步骤,它接受参数 stopMeasuring, 并返回在给定 inputstopMeasuring 的情况下测量语言检测器输入 用量的结果。

  2. 返回在给定 thisoptionsmeasureUsage 的情况下,测量 AI 模型输入用量的结果。

4.4. 语言检测

4.4.1. 算法

要在给定一个字符串 input、一个数字 inputQuota、以及一个不接受 参数并返回布尔值的算法 stopProducing 的情况下检测语言, 执行以下步骤。它们将返回 null、一个错误信息,或一个由 LanguageDetectionResult 字典组成的列表
  1. 断言:此算法正在并行地运行。

  2. requested 为在给定 inputstopProducing 的情况下测量语言检测器输入 用量的结果。

  3. 如果 requested 为 null 或错误信息,则返回 requested

  4. 断言requested 是一个数字。

  5. 如果 requested 大于 inputQuota,则返回一个配额超出错误信息,其 requestedrequested,其 quotainputQuota

    实际上,我们预计实现会将输入用量与配额的检查 作为与语言检测本身相同的模型调用的一部分来完成。这些步骤在规范中分离只是为了便于理解。

  6. partition 为在给定检测以该语言书写文本的目的的情况下,获取语言可用性 分区的结果。

  7. currentlyAvailableLanguagespartition["available"]。

  8. 由实现定义的方式,在遵循以下指南的前提下, 令 rawResultunknown 为检测 input 语言的结果。

    rawResult 必须是一个映射, 它为 currentlyAvailableLanguages 中的每种语言都有一个。 每个此类键的必须是 0 到 1 之间的数字。该 值必须表示实现对 input 是以该语言书写的置信度。

    unknown 必须是一个 0 到 1 之间的数字,它表示实现对 input 不是以 currentlyAvailableLanguages 中任何语言书写的置信度。

    rawResult加上 unknown 必须总和为 1。每个此类值,或 unknown,都可以为 0。

    如果实现认为 input 是用多种语言书写的,则它应尝试按比例分摊 rawResultunknown 的值,使它们与 input 中用每种检测到的语言书写的量成比例。 分摊 input 的确切方案是由实现定义的。

    如果 input 是 "tacosを食べる",则实现可能将其拆分为 "tacos" 和 "を食べる",然后分别检测每一部分的语言。 第一部分可能以 0.5 的置信度检测为英语、以 0.5 的置信度检测为西班牙语, 第二部分以 1 的置信度检测为日语。由此产生的 rawResult 可能为 «[ "en" → 0.25, "es" → 0.25, "ja" → 0.5 ]»(并且 unknown 设为 0)。

    决定将其拆分为两部分,而不是例如三个部分 "tacos"、"" 和 "食べる", 是一个由实现定义的选择。同样, 决定将每一部分视为贡献结果的“一半”,而不是例如按码 点数量加权,也是由实现定义的。

    (现实中,我们预计实现会在比这更大的块上进行拆分,因为对于大多数语言检测模型来说, 通常需要超过 4-5 个码 点。)

    如果在此过程中的任何时刻 stopProducing 返回 true,则返回 null。

    如果语言检测期间发生错误,则根据 § 4.4.3 错误 中的指南返回一个错误信息

    检测过程必须符合 Writing Assistance APIs § 6 Privacy considerationsWriting Assistance APIs § 7 Security considerations 中给出的指南,尤其包括(但不限于) Writing Assistance APIs § 6.4 User inputWriting Assistance APIs § 7.2 Runtime shared resources

  9. 用一个小于算法对 rawResult 按降序排序,该算法给定条目 ab,如果 a小于 b,则返回 true。

  10. results 为空列表

  11. cumulativeConfidence 为 0。

  12. 对于 rawResult每个 keyvalue

    1. 如果 value 为 0,则中断

    2. 如果 value 小于 unknown,则中断

    3. 将 «[ "detectedLanguage" → key, "confidence" → value追加results

    4. cumulativeConfidence 设为 cumulativeConfidence + value

    5. 如果 cumulativeConfidence 大于或等于 0.99,则中断

  13. 断言:1 − cumulativeConfidence 大于或 等于 unknown

  14. 断言:如果 results大小大于 0,则 results[results大小 - 1]["confidence"] 大于或等于 unknown

  15. 将 «[ "detectedLanguage" → "und", "confidence" → unknown追加results

  16. 返回 results

概率低于 1%、 或对文本贡献少于 1% 的语言,被认为更可能是噪声,因此不值得 返回给 Web 开发者。类似地,如果实现对某种语言的把握低于它对文本不属于其已知任何语言的把握, 那种语言很可能也不值得返回给 Web 开发者。

由于此类被省略的低概率结果, 返回给 Web 开发者的所有置信度值之和可能小于 1。

4.4.2. 用量

要在给定一个字符串 input 和一个不接受参数并返回布尔值的算法 stopMeasuring 的情况下,测量语言检测器输入用量, 执行以下步骤:
  1. 断言:此算法正在并行地运行。

  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 considerationsWriting 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。现行标准。 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; 等。HTML Standard。 现行标准。URL:https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola。Infra 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; 等。Streams Standard。现行 标准。URL:https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu。Web IDL Standard。现行 标准。URL:https://webidl.spec.whatwg.org/
[WRITING-ASSISTANCE-APIS]
Writing Assistance APIs。社区组报告草案。URL:https://webmachinelearning.github.io/writing-assistance-apis/

资料性参考文献

[BCP47]
A. Phillips,编辑;M. Davis,编辑。Tags for Identifying Languages。2009年9月。当前最佳实践。URL:https://www.rfc-editor.org/rfc/rfc5646
[UTS35]
Mark Davis; 等。Unicode Locale Data Markup Language (LDML)。2020年10月23日。Unicode 技术标准 #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;
};