번역기 및 언어 감지기 API

커뮤니티 그룹 보고서 초안,

이 문서에 대한 자세한 정보
이 버전:
https://webmachinelearning.github.io/translation-api
이슈 추적:
GitHub
편집자:
(Google)
Ehsan Toreini (Samsung)
이전 편집자:
Domenic Denicola (Google)

초록

번역기 및 언어 감지기 API는 웹 페이지에 언어 간 텍스트를 번역하고, 그러한 텍스트의 언어를 감지할 수 있는 기능을 제공한다.

이 문서의 상태

이 명세는 Web Machine Learning Community Group에서 발행했다. 이는 W3C 표준이 아니며 W3C 표준화 트랙에도 속하지 않는다. W3C Community Contributor License Agreement (CLA)에 따라 제한적인 옵트아웃 및 기타 조건이 적용된다는 점에 유의하기 바란다. W3C Community and Business Groups에 대해 더 알아보기.

1. 소개

번역기 및 언어 감지기 API는 인간 언어 간 텍스트를 번역하고, 그러한 텍스트의 언어를 감지하는 기능을 노출한다. 이들은 이러한 목적을 위한 브라우저 내장 UI 기능을 보완하며, 웹 개발자가 이러한 작업을 프로그래밍 방식으로 트리거하고 이를 애플리케이션에 통합할 수 있는 기능을 제공한다. 이는 사용자 입력이나 네트워크에서 가져온 텍스트를 처리할 때 특히 유용할 수 있다.

이 API들은 번역과 언어 감지를 위한 고수준 인터페이스를 제공하도록 설계되었으며, 기반 머신 러닝 모델과 그 관리의 복잡성을 추상화한다. 서로 다른 구현 전략이나 언어 지원에서 발생할 수 있는 상호운용성 문제를 다루기 위해, API 설계는 개발자가 애플리케이션이 의존하는 언어의 가용성을 확인하고 적절한 오류 처리를 포함하도록 안내한다.

2. 의존성

이 명세는 Infra Standard에 의존한다. [INFRA]

웹 플랫폼의 나머지 부분과 마찬가지로, 인간 언어는 이 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들을 구현하려면 해당 공유 인프라를 구현하고, 그 프라이버시 및 보안 고려사항을 준수해야 한다. 그러나 실제 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"]로 텍스트를 번역하기 위해 사용자 에이전트가 필요로 하는 모든 것에 대한 다운로드 과정을 시작한다.

    여기에는 기본 번역 모델과 특정 언어 arc 자료가 모두 포함될 수 있으며, 중간 언어가 사용되는 경우 여러 언어 arc에 대한 자료가 포함될 수도 있다.

  3. 어떤 이유로든 다운로드 과정을 시작할 수 없으면 false를 반환한다.

  4. true를 반환한다.

TranslatorCreateCoreOptions options가 주어졌을 때 번역 모델을 초기화하려면:
  1. Assert: 이 단계들은 병렬로 실행 중이다.

  2. options["sourceLanguage"]에서 options["targetLanguage"]로 번역하기 위한 사용자 에이전트의 기능을 뒷받침하는 AI 모델에 필요한 초기화 작업을 수행한다.

    여기에는 모델을 메모리에 로드하거나, 해당 특정 옵션을 지원하는 데 필요한 fine-tuning을 로드하는 것이 포함될 수 있다.

  3. 어떤 이유로든 초기화에 실패하면, 그 name이 "OperationError"이고 그 details에 적절한 세부 정보가 포함된 DOMException 오류 정보를 반환한다.

  4. null을 반환한다.

realm realmTranslatorCreateCoreOptions 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을 반환하며, 언어 태그를 best-fit 매치로 갱신하기 위해 options를 제자리에서 변경한다.
  1. Assert: 이 알고리즘은 병렬로 실행 중이다.

  2. availabilities를 사용자 에이전트의 번역기 언어 arc 가용성으로 한다.

  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"])가 identity translation으로 충족될 수 있으면, "available"을 반환한다.

    사용자 에이전트가 주어진 언어 arc에 대해 자체 번역기 언어 arc 가용성에 특정 항목을 가지고 있다면, 위 단계들 때문에 이러한 경우는 "downloadable", "downloading", 또는 "available"도 반환할 수 있다. 그러나 identity translation은 항상 사용 가능하므로, 이 단계는 이러한 경우에 결코 "unavailable"을 반환하지 않도록 보장한다.

    언어 arcidentity translation으로 충족될 수 있는 하나는 ("en-US", "en-GB")이다. 구현이 이 번역을 위한 특수 모델을 지원할 가능성도 있으며, 이는 번역기 언어 arc 가용성에 나타날 것이다.

    반면 구현이 언어 arc ("en-x-asdf", "en-x-xyzw")에 대한 특수 모델을 가지고 있을 가능성은 꽤 낮다. 그런 경우 이 단계가 적용되며, 이후 translate 알고리즘 호출은 identity translation을 사용한다.

    이 단계가 적용될 때 options["sourceLanguage"] 및 options["targetLanguage"]는 수정되지 않는다. 따라서 이 알고리즘이 create()에서 호출되고 있다면, 결과 Translator 객체의 sourceLanguagetargetLanguage 속성은 어떤 정규화된 형식이 아니라 원래 입력을 반환한다는 뜻이다.

  6. "unavailable"을 반환한다.

언어 arc는 두 문자열의 튜플이며, 출발 언어목표 언어로 이루어진다. 각 항목은 Unicode 정규화 locale 식별자이다.

번역기 언어 arc 가용성은 다음 단계들로 주어진다. 이 단계들은 언어 arc에서 Availability 값으로 반환하거나, null을 반환한다.
  1. Assert: 이 알고리즘은 병렬로 실행 중이다.

  2. 사용자 에이전트가 어떤 언어 arc 사이의 텍스트 번역을 지원할 수 있는지 판단하려는 중에, 사용자 에이전트가 일시적이라고 믿는 오류(다시 질의하면 그러한 오류가 더 이상 발생하지 않을 수 있는 오류)가 있으면 null을 반환한다.

  3. 언어 arc에서 Availability 값으로 반환한다. 여기서 각 키는 사용자 에이전트가 그 사이의 텍스트 번역을 지원하는 언어 arc이며, 다음 제약에 따라 채워진다:

사용자 에이전트의 번역기 언어 arc 가용성이 다음과 같다고 가정해 보자:

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 will best-fit to zh-Hans

await a("en", "zh-TW") === "downloadable";      // zh-TW will best-fit to zh-Hant
await a("en", "zh-HK") === "available";         // zh-HK will best-fit to zh-Hans
await a("en", "zh-CN") === "available";         // zh-CN will best-fit to zh-Hans

await a("en-US", "zh-Hant") === "downloadable"; // en-US will best-fit to en
await a("en-GB", "zh-Hant") === "downloadable"; // en-GB will best-fit to en

// Even very unexpected subtags will best-fit to en or zh-Hans
await a("en-Braille-x-lolcat", "zh-Hant") === "downloadable";
await a("en", "zh-BR-Kana") === "available";
언어 arc arc집합언어 arc otherArcs겹친다는 것은 다음 단계들이 true를 반환하는 경우이다:
  1. sourceLanguagesotherArcs의 각 항목출발 언어로 구성된 집합으로 한다.

  2. LookupMatchingLocaleByBestFit(sourceLanguages, « arc출발 언어 »)가 undefined가 아니면 true를 반환한다.

  3. targetLanguagesotherArcs의 각 항목목표 언어로 구성된 집합으로 한다.

  4. LookupMatchingLocaleByBestFit(targetLanguages, « arc목표 언어 »)가 undefined가 아니면 true를 반환한다.

  5. false를 반환한다.

언어 arc ("en", "fr")는 « ("en", "fr-CA") »와 겹치므로, 사용자 에이전트의 번역기 언어 arc 가용성은 이 두 언어 arc를 동시에 포함할 수 없다.

대신 일반적인 사용자 에이전트는 영어-프랑스어 언어 arc 하나만(아마도 ("en", "fr")) 지원하거나, ("en", "fr-FR"), ("en", "fr-CA"), 그리고 ("en", "fr-CH")와 같은 서로 겹치지 않는 여러 영어-프랑스어 언어 arc를 지원할 수 있다.

후자의 경우, 웹 개발자가 ai.translator.create({ sourceLanguage: "en", targetLanguage: "fr" })를 사용하여 번역기 생성을 요청하면, LookupMatchingLocaleByBestFit 알고리즘은 사용할 수 있는 세 언어 arc 중 하나를 선택할 것이다(아마도 ("en", "fr-FR")).

언어 arc arcidentity translation으로 충족될 수 있다는 것은 다음 단계들이 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. this, options, 및 operation이 주어졌을 때 집계된 AI 모델 결과 얻기의 결과를 반환한다.

translateStreaming(input, options) 메서드 단계는 다음과 같다:
  1. operation을 인수 chunkProduced, done, error, 및 stopProducing를 받는 알고리즘 단계로 하며, 이는 this출발 언어, this목표 언어, this입력 할당량, chunkProduced, done, error, 및 stopProducing이 주어졌을 때 input번역한다.

  2. this, options, 및 operation이 주어졌을 때 스트리밍 AI 모델 결과 얻기의 결과를 반환한다.

measureInputUsage(input, options) 메서드 단계는 다음과 같다:
  1. measureUsage를 인수 stopMeasuring를 받는 알고리즘 단계로 하고, input, this출발 언어, this목표 언어, 및 stopMeasuring이 주어졌을 때 번역기 입력 사용량 측정의 결과를 반환하게 한다.

  2. this, options, 및 measureUsage가 주어졌을 때 AI 모델 입력 사용량 측정의 결과를 반환한다.

3.4. 번역

3.4.1. 알고리즘

다음이 주어졌을 때 번역한다:

다음 단계를 수행한다:

  1. Assert: 이 알고리즘은 병렬로 실행 중이다.

  2. requestedinput, sourceLanguage, targetLanguage, 및 stopProducing이 주어졌을 때 번역기 입력 사용량 측정의 결과로 한다.

  3. requested가 null이면 반환한다.

  4. requested오류 정보이면:

    1. requested가 주어졌을 때 error를 수행한다.

    2. 반환한다.

  5. Assert: requested는 숫자이다.

  6. requestedinputQuota보다 크면:

    1. errorInforequestedrequestedinputQuotaquota를 가진 할당량 초과 오류 정보로 한다.

    2. errorInfo가 주어졌을 때 error를 수행한다.

    3. 반환한다.

    실제로는 구현이 번역 자체와 동일한 모델 호출의 일부로 입력 사용량을 할당량과 대조할 것으로 예상한다. 이 단계들은 명세에서 이해를 돕기 위해서만 분리되어 있다.

  7. 구현 정의 방식으로, 다음 지침에 따라, inputsourceLanguage에서 targetLanguage로 번역하는 과정을 시작한다.

    input이 빈 문자열이거나, 그 밖에 번역 가능한 내용이 없는 경우(예: 공백 문자나 제어 문자만 포함하는 경우), 결과 번역은 input이어야 한다. 이러한 경우 sourceLanguagetargetLanguage는 무시되어야 한다.

    (sourceLanguage, targetLanguage)가 identity translation으로 충족될 수 있으면, 결과 번역은 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. 번역된 텍스트의 다음 chunk가 생성되거나, 번역 과정이 완료되거나, stopProducing 호출 결과가 true가 될 때까지 기다린다.

    2. 그러한 chunk가 성공적으로 생성되면:

      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. Assert: 이 알고리즘은 병렬로 실행 중이다.

  2. inputToModelinputsourceLanguage에서 targetLanguage번역하기 위해 기반 모델에 보내질 구현 정의 문자열로 한다.

    이는 초기화 중에 sourceLanguagetargetLanguage가 모델에 로드되었다면 단지 input 자체일 수 있다. 또는 더 많은 것, 예를 들어 해당 언어 인코딩을 위한 적절한 할당량 사용량이나 언어 모델에 대한 일종의 wrapper prompt로 구성될 수 있다.

    이 과정 중 stopMeasuring이 true를 반환하기 시작하면 null을 반환한다.

    이 과정 중 오류가 발생하면 § 3.4.3 오류의 지침에 따라 적절한 DOMException 오류 정보를 반환한다.

  3. 기반 모델에 제공될 때 inputToModel을 표현하는 데 필요한 입력 사용량을 반환한다. 정확한 계산 절차는 다음 제약에 따른 구현 정의이다.

    반환되는 입력 사용량은 음수가 아니고 유한해야 한다. 번역 과정에 대한 사용량 할당량이 없으면(즉, 입력 할당량이 +∞이면) 0이어야 한다. 그렇지 않으면 양수여야 하며 inputToModel길이에 대략 비례해야 한다.

    이는 언어 모델 토큰화 방식에서 input을 표현하는 데 필요한 토큰 수일 수 있고, 또는 input길이일 수 있다. 또한 모델에 제공하는 데 필요한 접두사나 접미사의 사용량도 계산하는 이러한 방식의 변형일 수도 있다.

    이 과정 중 stopMeasuring이 true를 반환하기 시작하면 대신 null을 반환한다.

    이 과정 중 오류가 발생하면 대신 § 3.4.3 오류의 지침에 따라 적절한 DOMException 오류 정보를 반환한다.

3.4.3. 오류

번역이 실패하면, 다음과 같은 가능한 이유가 웹 개발자에게 노출될 수 있다. 이 표는 가능한 DOMException 이름과 구현이 이를 사용해야 하는 경우를 나열한다:

DOMException name 시나리오
"NotAllowedError"

번역이 사용자 선택 또는 사용자 에이전트 정책에 의해 비활성화되어 있다.

"NotReadableError"

번역 출력이 사용자 에이전트에 의해 필터링되었다. 예를 들어 해롭거나, 부정확하거나, 무의미한 것으로 감지되었기 때문이다.

"UnknownError"

사용자 에이전트가 번역할 수 없으며 동시에 Writing Assistance APIs § 6 Privacy considerationsWriting Assistance APIs § 7 Security considerations에 제시된 요구사항도 충족할 수 없다고 믿는 경우를 포함한 모든 기타 시나리오. 또는 사용자 에이전트가 실패 이유를 공개하지 않기를 원하는 경우.

이 표는 translator API에서 노출될 수 있는 예외의 전체 목록을 제공하지 않는다. 특정 구현 정의 단계에서 나올 수 있는 것만 포함한다.

3.5. 권한 정책 통합

translator API에 대한 접근은 정책 제어 기능 "translator" 뒤에 게이트되어 있으며, 이는 'self'기본 allowlist를 가진다.

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"]에서 식별된 언어를 돕기 위한 특정 fine-tuning 또는 기타 자료가 모두 포함될 수 있다.

  3. 어떤 이유로든 다운로드 과정을 시작할 수 없으면 false를 반환한다.

  4. true를 반환한다.

LanguageDetectorCreateCoreOptions options가 주어졌을 때 언어 감지기 모델을 초기화하려면:
  1. Assert: 이 단계들은 병렬로 실행 중이다.

  2. 입력 텍스트의 언어를 감지하기 위한 사용자 에이전트의 기능을 뒷받침하는 AI 모델에 필요한 초기화 작업을 수행한다.

    여기에는 모델을 메모리에 로드하거나, options["expectedInputLanguages"]에서 식별된 언어를 지원하는 데 필요한 fine-tuning을 로드하는 것이 포함될 수 있다.

  3. 어떤 이유로든 초기화에 실패하면, 그 DOMException 오류 정보를 반환한다. 그 name은 "OperationError"이고, 그 details에는 적절한 세부 정보가 포함되어야 한다.

  4. null을 반환한다.

realm realmLanguageDetectorCreateCoreOptions options가 주어졌을 때 언어 감지기 객체를 생성하려면:
  1. Assert: 이 단계들은 realmsurrounding agentevent loop에서 실행 중이다.

  2. inputQuota를 향후 언어 감지 작업을 위해 사용자 에이전트에서 사용할 수 있는 입력 할당량의 양으로 한다. (이 값은 구현 정의이며, 예를 들어 사용자의 메모리나 JavaScript 문자열 한계 외에 특정 제한이 없다면 +∞일 수 있다.)

  3. realm에서 생성된 새 LanguageDetector 객체를 다음과 함께 반환한다

    예상 입력 언어

    options["expectedInputLanguages"]가 비어 있지 않으면, 그것이 주어졌을 때 frozen array 생성의 결과; 그렇지 않으면 null

    입력 할당량

    inputQuota

4.2. 가용성

정적 availability(options) 메서드 단계는 다음과 같다:
  1. options, "language-detector", 언어 감지기 옵션을 유효성 검사하고 정규화, 그리고 언어 감지기 옵션 가용성 계산이 주어졌을 때 AI 모델 가용성 계산의 결과를 반환한다.

LanguageDetectorCreateCoreOptions options가 주어졌을 때 언어 감지기 옵션 가용성을 계산하려면 다음 단계를 수행한다. 이 단계들은 Availability 값 또는 null을 반환하며, 언어 태그를 best-fit 매치로 갱신하기 위해 options를 제자리에서 변경한다.
  1. Assert: 이 알고리즘은 병렬로 실행 중이다.

  2. 사용자 에이전트가 지원할 수 있는 언어 감지 기능을 판단하려는 중에, 사용자 에이전트가 일시적이라고 믿는 오류(다시 질의하면 그러한 오류가 더 이상 발생하지 않을 수 있는 오류)가 있으면 null을 반환한다.

  3. 텍스트가 해당 언어로 작성되었는지를 감지하는 목적이 주어졌을 때 언어 가용성 partition 얻기의 결과를 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. Assert: globalWindow 객체이다.

  2. global연결된 Documentfully active가 아니면, "InvalidStateError" DOMException으로 거부된 promise를 반환한다.

  3. signals를 « thisdestruction abort controllersignal »로 한다.

  4. options["signal"]이 존재하면, 그것을 signalsappend한다.

  5. signals, AbortSignal, 및 this관련 realm을 사용하여 dependent abort signal 생성의 결과를 compositeSignal로 한다.

  6. compositeSignalaborted이면, compositeSignalabort reason으로 거부된 promise를 반환한다.

  7. promise새 promise로 하되, this관련 realm에서 생성한다.

  8. abortedDuringOperation을 false로 한다.

    이 변수는 event loop에서 쓰이지만, 병렬로 읽힌다.

  9. compositeSignal다음 abort 단계들을 추가한다:

    1. abortedDuringOperation을 true로 설정한다.

    2. promisecompositeSignalabort reason으로 거부한다.

  10. inputQuotathis입력 할당량으로 한다.

  11. 병렬로:

    1. stopProducing을 다음 단계들로 한다:

      1. abortedDuringOperation을 반환한다.

    2. input, inputQuota, 및 stopProducing이 주어졌을 때 언어 감지의 결과를 result로 한다.

    3. global이 주어졌을 때 AI task source에서 전역 task를 큐에 넣어 다음 단계를 수행한다:

      1. abortedDuringOperation이 true이면 이 단계들을 중단한다.

      2. 그렇지 않고 result오류 정보이면, result가 주어졌을 때 오류 정보를 예외 객체로 변환한 결과로 promise거부한다.

      3. 그렇지 않으면:

        1. Assert: resultLanguageDetectionResult dictionary의 리스트이다. (null은 아니다. 그 경우에는 abortedDuringOperation이 true였을 것이기 때문이다.)

        2. promiseresult해결한다.

measureInputUsage(input, options) 메서드 단계는 다음과 같다:
  1. measureUsage를 인수 stopMeasuring를 받는 알고리즘 단계로 하고, inputstopMeasuring이 주어졌을 때 언어 감지기 입력 사용량 측정의 결과를 반환하게 한다.

  2. this, options, 및 measureUsage가 주어졌을 때 AI 모델 입력 사용량 측정의 결과를 반환한다.

4.4. 언어 감지

4.4.1. 알고리즘

문자열 input, 숫자 inputQuota, 그리고 인수를 받지 않고 boolean을 반환하는 알고리즘 stopProducing이 주어졌을 때 언어를 감지하려면, 다음 단계를 수행한다. 이들은 null, 오류 정보, 또는 LanguageDetectionResult dictionary의 리스트를 반환한다.
  1. Assert: 이 알고리즘은 병렬로 실행 중이다.

  2. inputstopProducing이 주어졌을 때 언어 감지기 입력 사용량 측정의 결과를 requested로 한다.

  3. requested가 null 또는 오류 정보이면 requested를 반환한다.

  4. Assert: requested는 숫자이다.

  5. requestedinputQuota보다 크면, requestedrequestedinputQuotaquota를 가진 할당량 초과 오류 정보를 반환한다.

    실제로는 구현이 언어 감지 자체와 동일한 모델 호출의 일부로 입력 사용량을 할당량과 대조할 것으로 예상한다. 이 단계들은 명세에서 이해를 돕기 위해서만 분리되어 있다.

  6. 텍스트가 해당 언어로 작성되었는지를 감지하는 목적이 주어졌을 때 언어 가용성 partition 얻기의 결과를 partition으로 한다.

  7. currentlyAvailableLanguagespartition["available"]로 한다.

  8. 구현 정의 방식으로, 다음 지침에 따라, rawResultunknowninput의 언어를 감지한 결과로 한다.

    rawResultcurrentlyAvailableLanguages의 각 언어에 대해 를 가진 이어야 한다. 이러한 각 키의 은 0과 1 사이의 숫자여야 한다. 이 값은 input이 해당 언어로 작성되었다는 구현의 신뢰도를 나타내야 한다.

    unknowninputcurrentlyAvailableLanguages의 어떤 언어로도 작성되지 않았다는 구현의 신뢰도를 나타내는 0과 1 사이의 숫자여야 한다.

    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개 이상의 코드 포인트가 필요하므로, 구현은 이보다 더 큰 chunk에서 분할할 것으로 예상한다.)

    이 과정 중 어느 시점에서든 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가 주어졌을 때 ab보다 작으면 true를 반환하는 less than 알고리즘으로 내림차순 정렬한다.

  10. results를 빈 리스트로 한다.

  11. cumulativeConfidence를 0으로 한다.

  12. rawResult의 각 keyvalue에 대해 순회한다:

    1. value가 0이면 중단한다.

    2. valueunknown보다 작으면 중단한다.

    3. «[ "detectedLanguage" → key, "confidence" → value ]»를 resultsappend한다.

    4. cumulativeConfidencecumulativeConfidence + value로 설정한다.

    5. cumulativeConfidence가 0.99 이상이면 중단한다.

  13. Assert: 1 − cumulativeConfidenceunknown 이상이다.

  14. Assert: results크기가 0보다 크면, results[results크기 - 1]["confidence"]는 unknown 이상이다.

  15. «[ "detectedLanguage" → "und", "confidence" → unknown ]»를 resultsappend한다.

  16. results를 반환한다.

가능성이 1% 미만인 언어, 또는 텍스트에 1% 미만으로 기여하는 언어는 노이즈일 가능성이 더 높다고 간주되어 웹 개발자에게 반환할 가치가 없다. 마찬가지로, 구현이 어떤 언어에 대해 확신하는 정도보다 텍스트가 자신이 아는 어떤 언어도 아니라는 점에 더 확신한다면, 그 언어는 웹 개발자에게 반환할 가치가 없을 가능성이 높다.

이렇게 낮은 확률의 결과가 생략되기 때문에, 웹 개발자에게 반환되는 모든 confidence 값의 합은 1보다 작을 수 있다.

4.4.2. 사용량

문자열 input 및 인수를 받지 않고 boolean을 반환하는 알고리즘 stopMeasuring가 주어졌을 때 언어 감지기 입력 사용량을 측정하려면, 다음 단계를 수행한다:
  1. Assert: 이 알고리즘은 병렬로 실행 중이다.

  2. inputToModelinput이 주어졌을 때 언어를 감지하기 위해 기반 모델에 보내질 구현 정의 문자열로 한다.

    이는 단지 input 자체일 수 있고, 또는 언어 모델에 대한 일종의 wrapper prompt를 포함할 수 있다.

    이 과정 중 stopMeasuring이 true를 반환하기 시작하면 null을 반환한다.

    이 과정 중 오류가 발생하면 § 4.4.3 오류의 지침에 따라 적절한 DOMException 오류 정보를 반환한다.

  3. 기반 모델에 제공될 때 inputToModel을 표현하는 데 필요한 입력 사용량을 반환한다. 정확한 계산 절차는 다음 제약에 따른 구현 정의이다.

    반환되는 입력 사용량은 음수가 아니고 유한해야 한다. 번역 과정에 대한 사용량 할당량이 없으면(즉, 입력 할당량이 +∞이면) 0이어야 한다. 그렇지 않으면 양수여야 하며 inputToModel길이에 대략 비례해야 한다.

    이는 언어 모델 토큰화 방식에서 input을 표현하는 데 필요한 토큰 수일 수 있고, 또는 input길이일 수 있다. 또한 모델에 제공하는 데 필요한 접두사나 접미사의 사용량도 계산하는 이러한 방식의 변형일 수도 있다.

    이 과정 중 stopMeasuring이 true를 반환하기 시작하면 대신 null을 반환한다.

    이 과정 중 오류가 발생하면 대신 § 4.4.3 오류의 지침에 따라 적절한 DOMException 오류 정보를 반환한다.

4.4.3. 오류

언어 감지가 실패하면, 다음과 같은 가능한 이유가 웹 개발자에게 노출될 수 있다. 이 표는 가능한 DOMException 이름과 구현이 이를 사용해야 하는 경우를 나열한다:

DOMException name 시나리오
"NotAllowedError"

언어 감지가 사용자 선택 또는 사용자 에이전트 정책에 의해 비활성화되어 있다.

"UnknownError"

사용자 에이전트가 감지할 수 없으며 동시에 Writing Assistance APIs § 6 Privacy considerationsWriting Assistance APIs § 7 Security considerations에 제시된 요구사항도 충족할 수 없다고 믿는 경우를 포함한 모든 기타 시나리오. 또는 사용자 에이전트가 실패 이유를 공개하지 않기를 원하는 경우.

이 표는 language detector API에서 노출될 수 있는 예외의 전체 목록을 제공하지 않는다. 특정 구현 정의 단계에서 나올 수 있는 것만 포함한다.

4.5. 권한 정책 통합

language detector API에 대한 접근은 정책 제어 기능 "language-detector" 뒤에 게이트되어 있으며, 이는 'self'기본 allowlist를 가진다.

5. 프라이버시 고려사항

translator 및 language detector API의 프라이버시 고려사항에 대한 논의는 Writing Assistance APIs § 6 Privacy considerations를 참조하라. 그 텍스트는 § 2 의존성에서 언급한 것처럼, 동일한 인프라를 공유하는 모든 API에 적용되도록 작성되었다.

6. 보안 고려사항

translator 및 language detector 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. Draft Community Group Report. 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;
};