ウェブスピーチAPI

ドラフトコミュニティグループレポート,

このドキュメントの詳細情報
このバージョン:
https://webaudio.github.io/web-speech-api/
課題の追跡:
GitHub
仕様内インライン
編集者:
Evan Liu (Google)
以前の編集者:
André Natal (Mozilla)
Glen Shires (Google)
Philip Jägenstedt (Google)
Hans Wennborg (Google)
テスト:
web-platform-tests speech-api/ (進行中の作業)

概要

本仕様は、ウェブ開発者がウェブページに音声認識および合成機能を組み込むためのJavaScript APIを定義します。 開発者がスクリプトを使用してテキスト読み上げ出力を生成したり、音声認識をフォームへの入力、継続的なディクテーションおよび制御の入力として利用することを可能にします。 JavaScript APIは、ウェブページがアクティベーションやタイミングを制御し、結果や代替案を処理することを可能にします。

この文書のステータス

1. イントロダクション

このセクションは非規範的です。

Web Speech APIは、ウェブ開発者がウェブブラウザ上で、標準的な音声認識ソフトウェアやスクリーンリーダーでは通常利用できない音声入力およびテキスト読み上げ出力機能を提供できるようにすることを目的としています。 本APIは基盤となる音声認識および合成の実装に依存しない設計であり、サーバー側およびクライアント/組み込み型の認識・合成の両方をサポートできます。 APIは一度きりの短い音声入力(ワンショット)と連続的な音声入力の両方を可能にするよう設計されています。 音声認識の結果は、各仮説に関する関連情報とともに、仮説のリストとしてウェブページに提供されます。

本仕様は、HTML Speech Incubator Group Final Reportで定義されたAPIのサブセットです。 当該レポートは仕様トラック文書ではないため完全に参考情報です。 そのレポートの全ての部分は本ドキュメントに関して参考情報と見なすことができ、本仕様に対する参考的背景を提供します。 本仕様はそのレポートの機能的に完全なサブセットです。 具体的には、このサブセットは基盤となるトランスポートプロトコル、HTMLマークアップへの提案的追加を除外しており、JavaScript APIの簡略化されたサブセットを定義しています。 このサブセットはIncubator Group Final Reportの大半のユースケースとサンプルコードをサポートします。 このサブセットは将来のマークアップ、API、または基盤トランスポートプロトコルの標準化を排除するものではなく、実際にIncubator Reportはそのような将来の作業のための可能なロードマップを定義しています。

2. ユースケース

このセクションは非規範的です。

本仕様は、Incubator Report のセクション4で定義された以下のユースケースをサポートします。

APIを最小限に保つため、本仕様は以下のユースケースを直接サポートしません。 ただし、将来のAPI拡張としてこれを追加することを排除するものではなく、実際にIncubator reportはそのためのロードマップを提供しています。

3. セキュリティおよびプライバシーに関する考慮事項

  1. ユーザーエージェントは、明示的かつ十分に情報提供されたユーザーの同意がある場合にのみ音声入力セッションを開始しなければなりません。 ユーザーの同意には、例えば次のようなものが含まれます:
    • 音声入力を開始することが明らかなグラフィカルな表示を持つ可視の音声入力要素上でのユーザーのクリック。
    • start() の呼び出しの結果として表示される許可プロンプトを承認すること。
    • このウェブページに対して常に音声入力を許可するよう以前に与えられた同意。
  2. ユーザーエージェントはオーディオが録音されているときにユーザーに明白な表示を与えなければなりません。
    • グラフィカルなユーザーエージェントでは、これはウェブページからアクセスできないユーザーエージェントのクロームの一部として表示される必須の通知であってよいです。 例えばブラウザのクローム/アドレスバーの一部として点滅する録音アイコン、ステータスバーでの表示、可聴の通知、またはユーザーにとって関連かつアクセス可能なその他の何かが考えられます。 このUI要素はユーザーが録音を停止できるようにする必要があります。
      録音通知のUI例。
    • 音声のみのユーザーエージェントでは、表示は例えば音声入力要素のラベルをシステムが話し、その後に短いビープ音を鳴らす形をとる場合があります。
  3. ユーザーエージェントは、音声入力が初めて使用される際に、音声入力が何であるか、必要に応じて音声録音を無効にするためにプライバシー設定をどのように調整できるかをユーザーにより長い説明として提供してもよいです。
  4. フィンガープリンティングのリスクを軽減するため、ユーザーエージェントは MediaStreamTrack 上で音声認識を行う際に音声認識を個別最適化してはなりません(MUST NOT)。

3.1. 実装に関する考慮事項

このセクションは非規範的です。

  1. 音声でのパスワード入力はセキュリティの観点から問題を引き起こす可能性がありますが、パスワードを音声で入力するかどうかはユーザーの判断に委ねられます。
  2. 音声入力は潜在的にユーザーの盗聴に利用される可能性があります。 悪意のあるウェブページは、入力要素を隠す、または録音が停止したとユーザーに信じ込ませ続けるなどの手口を使って録音を継続する可能性があります。 また、入力要素を別のものに見せかけるようにスタイル設定してユーザーを騙してクリックさせることも考えられます。 ファイル入力要素のスタイリングの例は https://www.quirksmode.org/dom/inputfile.html に示されています。 上記の推奨は、そのような攻撃のリスクを減らすことを目的としています。

4. API の説明

このセクションは規範的です。

4.1. SpeechRecognition インターフェース

音声認識インターフェースは、特定の認識を制御するためのスクリプト可能なウェブAPIです。

用語「final result(最終結果)」は SpeechRecognitionResult のうち isFinal 属性が true であるものを指します。 用語「interim result(暫定結果)」は SpeechRecognitionResult のうち isFinal 属性が false であるものを指します。

SpeechRecognition は以下の内部スロットを持ちます:

[[started]]

音声認識が開始されたかどうかを表すブールフラグ。初期値は false です。

[[processLocally]]

認識がローカルで実行されるべきかどうかを示すブールフラグ。初期値は false です。

[[phrases]]

コンテキストバイアス用のフレーズのリストを表す ObservableArraySpeechRecognitionPhrase オブジェクト。初期値は新しい空の ObservableArray です。

[SecureContext, Exposed=Window]
interface SpeechRecognition : EventTarget {
    constructor();

    // recognition parameters
    attribute SpeechGrammarList grammars;
    attribute DOMString lang;
    attribute boolean continuous;
    attribute boolean interimResults;
    attribute unsigned long maxAlternatives;
    attribute boolean processLocally;
    attribute ObservableArray<SpeechRecognitionPhrase> phrases;

    // methods to drive the speech interaction
    undefined start();
    undefined start(MediaStreamTrack audioTrack);
    undefined stop();
    undefined abort();
    static Promise<AvailabilityStatus> available(SpeechRecognitionOptions options);
    static Promise<boolean> install(SpeechRecognitionOptions options);

    // event methods
    attribute EventHandler onaudiostart;
    attribute EventHandler onsoundstart;
    attribute EventHandler onspeechstart;
    attribute EventHandler onspeechend;
    attribute EventHandler onsoundend;
    attribute EventHandler onaudioend;
    attribute EventHandler onresult;
    attribute EventHandler onnomatch;
    attribute EventHandler onerror;
    attribute EventHandler onstart;
    attribute EventHandler onend;
};

dictionary SpeechRecognitionOptions {
  required sequence<DOMString> langs;
  boolean processLocally = false;
};

enum SpeechRecognitionErrorCode {
    "no-speech",
    "aborted",
    "audio-capture",
    "network",
    "not-allowed",
    "service-not-allowed",
    "language-not-supported",
    "phrases-not-supported"
};

enum AvailabilityStatus {
    "unavailable",
    "downloadable",
    "downloading",
    "available"
};

[SecureContext, Exposed=Window]
interface SpeechRecognitionErrorEvent : Event {
    constructor(DOMString type, SpeechRecognitionErrorEventInit eventInitDict);
    readonly attribute SpeechRecognitionErrorCode error;
    readonly attribute DOMString message;
};

dictionary SpeechRecognitionErrorEventInit : EventInit {
    required SpeechRecognitionErrorCode error;
    DOMString message = "";
};

// Item in N-best list
[SecureContext, Exposed=Window]
interface SpeechRecognitionAlternative {
    readonly attribute DOMString transcript;
    readonly attribute float confidence;
};

// A complete one-shot simple response
[SecureContext, Exposed=Window]
interface SpeechRecognitionResult {
    readonly attribute unsigned long length;
    getter SpeechRecognitionAlternative item(unsigned long index);
    readonly attribute boolean isFinal;
};

// A collection of responses (used in continuous mode)
[SecureContext, Exposed=Window]
interface SpeechRecognitionResultList {
    readonly attribute unsigned long length;
    getter SpeechRecognitionResult item(unsigned long index);
};

// A full response, which could be interim or final, part of a continuous response or not
[SecureContext, Exposed=Window]
interface SpeechRecognitionEvent : Event {
    constructor(DOMString type, SpeechRecognitionEventInit eventInitDict);
    readonly attribute unsigned long resultIndex;
    readonly attribute SpeechRecognitionResultList results;
};

dictionary SpeechRecognitionEventInit : EventInit {
    unsigned long resultIndex = 0;
    required SpeechRecognitionResultList results;
};

// The object representing a speech grammar. This interface has been deprecated and exists in this spec for the sole purpose of maintaining backwards compatibility.
[Exposed=Window]
interface SpeechGrammar {
    attribute DOMString src;
    attribute float weight;
};

// The object representing a speech grammar collection. This interface has been deprecated and exists in this spec for the sole purpose of maintaining backwards compatibility.
[Exposed=Window]
interface SpeechGrammarList {
    constructor();
    readonly attribute unsigned long length;
    getter SpeechGrammar item(unsigned long index);
    undefined addFromURI(DOMString src,
                    optional float weight = 1.0);
    undefined addFromString(DOMString string,
                    optional float weight = 1.0);
};

// The object representing a phrase for contextual biasing.
[SecureContext, Exposed=Window]
interface SpeechRecognitionPhrase {
    constructor(DOMString phrase, optional float boost = 1.0);
    readonly attribute DOMString phrase;
    readonly attribute float boost;
};

4.1.1. SpeechRecognition 属性

grammars 属性, SpeechGrammarList
grammars 属性は、この認識で有効な文法(SpeechGrammar オブジェクト)のコレクションを保持します。 この属性は動作せず、後方互換性維持のみの目的で仕様に存在します。
lang 属性, DOMString
この属性はリクエストの認識の言語を、正しい BCP 47 言語タグを使って設定します。[BCP47] 未設定の場合はスクリプトからも未設定のままですが、html ドキュメントのルート要素や継承階層の言語がデフォルトで使われます。 このデフォルト値は入力リクエストが認識サービスへの接続を開始する際に計算・適用されます。
continuous 属性, boolean
continuous 属性が false の場合、ユーザーエージェントは認識開始に対して最大1つの final result(単一ターンの対話等)しか返してはなりません。 continuous 属性が true の場合、ユーザーエージェントは認識開始に対し、連続する複数回の認識を表す0個以上の final result(ディクテーション等)を返します。 デフォルト値は false でなければなりません。この属性設定は interim results には影響しません。
interimResults 属性, boolean
interim result を返すかどうかを制御します。 true の場合、interim result が返されるべきです。 false の場合、interim result は返してはなりません。 デフォルト値は false でなければなりません。この属性設定は final result には影響しません。
maxAlternatives 属性, unsigned long
この属性は各 result あたり最大何件の SpeechRecognitionAlternative を返すか設定します。 デフォルト値は 1 です。
processLocally 属性, boolean
この属性が true なら、音声認識は必ずユーザー端末上で実行される必要があることを示します。 false の場合、ユーザーエージェントはローカルまたはリモート処理を選択できます。 デフォルト値は false です。
phrases 属性, 型 ObservableArray<SpeechRecognitionPhrase>
phrases 属性は、コンテキストバイアス用に使う SpeechRecognitionPhrase オブジェクトのリストを提供します。これは ObservableArray 型で、JavaScript の Array のように(例:push() など)変更可能です。
ゲッター手順は [[phrases]] の値を返すことです。

グループはWebRTCがオーディオソースやリモート認識器の選択指定に使えるか検討しました。 詳しくは public-speech-api@w3.org のスレッド WebRTC、Web Audio API、および他の外部ソースとの連携 を参照してください。

4.1.2. SpeechRecognition メソッド

start() method
デバイスのマイクから直接音声認識プロセスを開始します。 呼び出されたとき、以下の手順を実行します:
  1. bool 型の変数 requestMicrophonePermissiontrue に設定します。

  2. start session algorithmrequestMicrophonePermission とともに実行します。

start(MediaStreamTrack audioTrack) method
MediaStreamTrack を使用して音声認識プロセスを開始します。 呼び出されたとき、以下の手順を実行します:
  1. audioTrack を最初の引数とします。

  2. audioTrackkind 属性が "audio" でない場合、InvalidStateError をスローしてこれらの手順を中止します。

  3. audioTrackreadyState 属性が "live" でない場合、InvalidStateError をスローしてこれらの手順を中止します。

  4. requestMicrophonePermissionfalse に設定します。

  5. start session algorithmrequestMicrophonePermission とともに実行します。

stop() method
stop メソッドは、認識サービスに対してこれ以上オーディオの聴取を停止し、かつこの認識のために既に受信したオーディオのみを使用して結果を返すよう指示することを表します。 stop メソッドの典型的な使用例は、エンドユーザーが発話中のみ話す(例: トランシーバーのように)アプリケーションです。 エンドユーザーは話すときにスペースキーを押し続け、スペースダウン時に start 呼び出しが発生し、スペースキーを離すと stop メソッドが呼ばれてシステムがもはやユーザーを聞かないことを保証するかもしれません。 stop メソッドが呼ばれると、音声サービスは追加のオーディオを収集してはならず、ユーザーを聞き続けてはなりません。 音声サービスは、この認識のために既に収集したオーディオに基づいて認識結果(または nomatch)を返すことを試みなければなりません。 start が決して呼ばれていない、または end または error イベントが既に発火している、あるいは以前に stop が呼ばれたなどの理由で既に停止中または停止処理中のオブジェクトで stop が呼ばれた場合、ユーザーエージェントはその呼び出しを無視しなければなりません。
abort() method
abort メソッドは、直ちに聴取と認識を停止し、何の情報も返さずに処理を終了するよう要求するものです。 abort メソッドが呼ばれると、音声サービスは認識を停止しなければなりません。 ユーザーエージェントは、音声サービスがもはや接続されていないときに end イベントを発火しなければなりません。 start が決して呼ばれていない、または end または error イベントが既に発火している、あるいは以前に abort が呼ばれているなどの理由で既に停止中または中止処理中のオブジェクトで abort が呼ばれた場合、ユーザーエージェントはその呼び出しを無視しなければなりません。
available(SpeechRecognitionOptions options) method
available メソッドは、Promise を返し、その Promise は AvailabilityStatus に解決され、引数で与えられた SpeechRecognitionOptions に一致する認識の可用性を示します。 このメソッドへのアクセスは、ポリシー制御機能 "on-device-speech-recognition" の背後で制御されており、そのデフォルト許可リストは 'self' です。

呼び出されたとき、以下の手順を実行します:

  1. promise新しい Promise とします。

  2. availability algorithmoptionspromise で実行します。例外が返されたら、それをスローしてこれらの手順を中止します。

  3. promise を返します。

install(SpeechRecognitionOptions options) method
install メソッドは、options.langs で指定された全ての言語のオンデバイス音声認識の言語パックをインストールしようと試みます。 このメソッドは Promise を返し、その Promise は boolean に解決されます。 指定された要求されたかつサポートされている言語の全てのインストール試行が成功した(またはすでにインストールされている)場合、Promise は true に解決されます。 options.langs が空である場合、要求されたすべての言語がサポートされていない場合、またはサポートされている言語のインストール試行のいずれかが失敗した場合、Promise は false に解決されます。 このメソッドへのアクセスは、ポリシー制御機能 "on-device-speech-recognition" の背後で制御されており、そのデフォルト許可リストは 'self' です。

呼び出されたとき、以下の手順を実行します:

  1. 現在の設定オブジェクトの関連グローバルオブジェクトの関連ドキュメントが完全にアクティブでない場合、InvalidStateError をスローしてこれらの手順を中止します。

  2. options の langs の任意の lang が有効な [BCP47] 言語タグでない場合、SyntaxError をスローしてこれらの手順を中止します。

  3. options の langs に含まれる任意の lang のオンデバイス音声認識言語パックがサポートされていない場合、解決済みの Promise を false で返し、残りの手順をスキップします。

  4. promise を新しい Promise とします。

  5. options の各 lang について、オンデバイス音声認識言語パックのダウンロードを開始します。

    注: ユーザーエージェントはオンデバイス音声認識言語パックのダウンロードに対してユーザーに明示的な許可を求めることができます。

  6. 関連グローバルオブジェクトのタスクキューにタスクをキューして、次の手順を実行します:

    • options の langs で指定された全ての言語のダウンロードが成功したときに promisetrue で解決し、そうでなければ false で解決します。

      注: Promise が false に解決されることは失敗の具体的原因を示すものではありません。ユーザーエージェントは開発者ツールのコンソールメッセージで失敗の詳細情報を提供することが推奨されます。ただし、この詳細なエラー情報はスクリプトに公開されません。

  7. promise を返します。

    processLocally はこのアルゴリズムでは使用されません。

4.1.3. AvailabilityStatus 列挙値

AvailabilityStatus 列挙は音声認識の利用可能性を示します。値は次の通りです:

"unavailable"
指定された言語および処理設定について音声認識が利用できないことを示します。 processLocallyoptions において true の場合、この言語のオンデバイス認識がユーザーエージェントでサポートされていないことを意味します。 processLocallyoptionsfalse の場合、指定言語の少なくとも1つについてローカルおよびリモート認識のどちらも利用できないことを意味します。
"downloadable"
指定された言語のオンデバイス音声認識がユーザーエージェントでサポートされているが、まだインストールされていないことを示します。install() メソッドによってインストール可能です。このステータスは主に processLocally が true の場合に該当します。
"downloading"
指定された言語のオンデバイス音声認識が現在ダウンロード中であることを示します。このステータスは主に processLocally が true の場合に該当します。
"available"
すべての指定言語と与えられた処理設定について音声認識が利用可能であることを示します。 processLocallyoptions で true の場合、オンデバイス認識がインストールされ利用可能であることを意味します。 processLocally が false の場合、(ローカルまたはリモート)認識が利用できることを意味します。

availability algorithmoptionspromise で呼び出された場合、ユーザーエージェントは以下の手順を実行しなければなりません:

  1. current settings objectrelevant global objectassociated Documentfully active でない場合、InvalidStateError をスローし、以降の手順を中止します。

  2. langslangs of optionsとします。

  3. langs 内の任意の lang が有効な[BCP47] 言語タグでない場合、SyntaxError をスローし、これらの手順を中止します。

  4. processLocallyoptionsfalse の場合:

    1. langs が空のシーケンスの場合、statusunavailable とします。

    2. それ以外で、すべての language in langs について認識(リモートも可)が利用可能な場合、statusavailable とします。

    3. それ以外の場合、statusunavailable とします。

  5. processLocallyoptionstrue の場合:

    1. langs が空の場合、statusunavailable とします。
    2. それ以外の場合:
      1. finalStatusavailable とします。
      2. langs 内の各 language について:
        1. currentLanguageStatus を設定します。
        2. language のオンデバイス音声認識がインストールされている場合、currentLanguageStatusavailable を設定します。
        3. 現在ダウンロード中なら downloading を設定します。
        4. サポートはされているが未インストールなら downloadable を設定します。
        5. サポートされていない場合は unavailable を設定します。
        6. currentLanguageStatus[{{AvailabilityStatus/available}}, {{AvailabilityStatus/downloading}}, {{AvailabilityStatus/downloadable}}, {{AvailabilityStatus/unavailable}}] の順で finalStatus より後の場合、finalStatuscurrentLanguageStatus に更新します。
      3. statusfinalStatus にします。
  6. queue a taskrelevant global objecttask queue に追加し、次のステップを実行します:

    • promisestatus で解決します。

start session algorithmrequestMicrophonePermission で呼ばれた場合、ユーザーエージェントは次の手順を実行しなければなりません:

  1. current settings objectrelevant global objectassociated Documentfully active でない場合、InvalidStateError をスローし、以降の手順を中止します。

  2. [[started]]true かつ error イベントまたは end イベント が発火していない場合、InvalidStateError をスローし、これらの手順を中止します。

  3. この phraseslength が 0 より大きく、かつユーザーエージェントがコンテキストバイアスをサポートしない場合:

    1. queue a task を実施し、fire an event(名前 error)を thisSpeechRecognitionErrorEvent を使い error 属性を phrases-not-supported に初期化し、message 属性を理由を示す実装依存の文字列で設定します。

    2. これらの手順を中止します。

  4. この [[processLocally]]true の場合:

    1. ユーザーエージェントがこの lang でローカル音声認識を利用不可と判定した場合、または他の理由でローカル処理要求を満たせない場合:

      1. queue a task を行い、fire an event(名前 error)を thisSpeechRecognitionErrorEvent を使い error 属性を service-not-allowed で初期化し、 message 属性を理由を示す実装依存の文字列で設定します。

      2. これらの手順を中止します。

  5. [[started]]true に設定します。

  6. requestMicrophonePermissiontrue であり、request permission to use "microphone" が "denied" の場合:

    1. queue a task を実施し、fire an event(名前 error)を thisSpeechRecognitionErrorEvent を使い error 属性を not-allowed で初期化し、 message 属性を理由を示す実装依存の文字列で設定します。

    2. これらの手順を中止します。

  7. 認識のリッスンが正常に開始されたら、タスクキューに登録して fire an event(名前 start)を this で実行します。

4.1.4. SpeechRecognition イベント

音声認識イベントではDOM Level 2 イベントモデルが使用されます。 EventTarget インターフェースのメソッドを用いてイベントリスナーの登録を行います。 SpeechRecognition インターフェースにも各イベントタイプごとのシングルイベントハンドラ属性が含まれています。 これらのイベントはバブリングせず、キャンセルもできません。

これらの全イベントについて、DOM Level 2 Event インターフェースで定義されている timeStamp 属性は、イベントオブジェクトが表す実際の現実世界イベントの発生時刻の最良推定値に設定しなければなりません。 このタイムスタンプは、たとえリモート認識サービス等別マシンで発生したイベントの場合でも、ユーザーエージェントの時刻基準で表現しなければなりません(例:リモート speech endpointer の speechend イベント)。

以下で特に指定されていない限り、異なるイベントの発火順は未定義です。 例えば、クライアント側でオーディオ検出、サーバー側で音声検出を行っている場合、実装によっては audioendspeechstart より前や speechend より前に発火することもあります。

audiostart event
ユーザーエージェントが音声の取得を開始したときに発火します。
soundstart event
何らかの音(音声の場合も含む)が検出されたときに発火します。 これはクライアントサイドのエネルギー検出器等により低遅延で発火しなければなりません。 audiostart イベントは soundstart より前に常に発火している必要があります。
speechstart event
音声認識に用いられる発話が始まったときに発火します。 audiostart イベントは speechstart より前に必ず発火している必要があります。
speechend event
音声認識に用いられる発話が終了したときに発火します。 speechstart イベントは speechend より前に必ず発火している必要があります。
soundend event
何らかの音がもはや検出されなくなった時に発火します。 これはクライアントサイドのエネルギー検出器等により低遅延で発火しなければなりません。 soundstart イベントの後に必ず発火している必要があります。
audioend event
ユーザーエージェントによる音声取得が終了したときに発火します。 audiostart イベントの後に必ず発火している必要があります。
result event
音声認識器が結果を返した際に発火します。 イベントは SpeechRecognitionEvent インターフェースを使用します。 audiostart イベントは result イベントより前に常に発火している必要があります。
nomatch event
認識器が信頼度閾値以上の認識仮説を持たない最終結果を返した際に発火します。 イベントは SpeechRecognitionEvent インターフェースを使用します。 イベント内の results 属性は信頼度閾値を下回る認識結果か、null かもしれません。 audiostart イベントの後に必ず nomatch イベントは発火している必要があります。
error event
音声認識エラーが発生したときに発火します。 イベントは SpeechRecognitionErrorEvent インターフェースを使用します。
start event
認識サービスが認識のために音声リッスンを開始したときに発火します。
end event
サービスが切断されたときに発火します。 終了理由に関わらずセッションが終了した際に必ず生成される必要があります。

4.1.5. SpeechRecognitionErrorEvent

SpeechRecognitionErrorEvent インターフェースは error イベント用に使用されます。

error attribute, SpeechRecognitionErrorCode, readonly
errorCode は何が問題となったかを示す列挙値です。 その値は次の通りです:
"no-speech"
音声が検出されませんでした。
"aborted"
何らかの理由で音声入力が中断されました(例えばUIで入力キャンセルなど)。
"audio-capture"
音声キャプチャに失敗しました。
"network"
認識に必要なネットワーク通信が失敗しました。
"not-allowed"
ユーザーエージェントがセキュリティ・プライバシー・ユーザー設定等の理由で音声入力を許可しません。
"service-not-allowed"
ユーザーエージェントがウェブアプリケーションの要求した音声サービスは許可していませんが、別の音声サービスなら許可する可能性があります(ユーザーエージェントによる未対応またはセキュリティ・プライバシー・ユーザー設定などが理由)。
"language-not-supported"
言語がサポートされていません。
"phrases-not-supported"
コンテキストバイアス用フレーズは音声認識モデルでサポートされていません。
message attribute, DOMString, readonly
メッセージ内容は実装依存です。 この属性は主にデバッグ目的であり、アプリケーションUIで直接利用すべきではありません。

4.1.6. SpeechRecognitionAlternative

SpeechRecognitionAlternative は、n-best リストで使用される応答の単純なビューを表します。

transcript 属性, DOMString, readonly
transcript 文字列は、ユーザーが発話した生のワードを表します。 連続認識の場合、連続する SpeechRecognitionResult を連結してセッションの正しいトランスクリプトになるよう、必要に応じて前後の空白を含めなければなりません。
confidence 属性, float, readonly
confidence は、認識システムが認識が正しいとどれだけ確信しているかを 0~1 の間で数値的に推定した値です。 大きな値ほどシステムの自信が高いことを意味します。

グループは、confidence が認識エンジン非依存な方法で指定できるか、およびこの API がダイアログ API ではないため confidence threshold や nomatch を含めるべきかどうか議論しています。public-speech-api@w3.org の Confidence property スレッドを参照してください。

4.1.7. SpeechRecognitionResult

SpeechRecognitionResult オブジェクトは、連続認識の一部または非連続認識の完全な返却結果としての、単一のワンショット認識マッチを表します。

length 属性, unsigned long, readonly
long 属性は item 配列で何個の n-best alternative が表現されているかを示します。
item(index) getter
item getter は n-best 値の配列の index から SpeechRecognitionAlternative を返します。 index が length 以上の場合、これは null を返します。 ユーザーエージェントは length 属性が配列要素数になるよう保証しなければなりません。 ユーザーエージェントは、n-best リストが信頼度の降順(各要素は直前要素の confidence 以下)でソートされることを保証しなければなりません。
isFinal 属性, boolean, readonly
final boolean は、このインデックス値について音声サービスが返す最後の値であれば true に設定されなければなりません。 false の場合はこの値が暫定結果で、今後変更され得ることを表します。

4.1.8. SpeechRecognitionResultList

SpeechRecognitionResultList オブジェクトは認識結果のシーケンスを保持し、連続認識の完全な返却結果を表します。 非連続認識の場合は単一の値のみを持ちます。

length 属性, unsigned long, readonly
length 属性は item 配列にいくつ結果が入っているかを示します。
item(index) getter
item getter は result 値の配列の index から SpeechRecognitionResult を返します。 index が length 以上の場合、null を返します。 ユーザーエージェントは length 属性が配列要素数になるよう保証しなければなりません。

4.1.9. SpeechRecognitionEvent

SpeechRecognitionEvent は interim 結果または final 結果に変更があったとき毎回発火されるイベントです。

resultIndex 属性, unsigned long, readonly
resultIndex には "results" 配列で変更があった最小インデックスが設定されなければなりません。
results 属性, SpeechRecognitionResultList, readonly
このセッションの全ての現時点の認識結果配列。 具体的には全ての final 結果が返ったものに続き、全 interim 結果の現時点での最良仮説が続きます。 0以上の final 結果→0以上の interim 結果、という構成でなければなりません。 後続の SpeechRecognitionResultEvent で interim 結果は新しい interim 結果や final 結果で上書きか、(配列末尾かつ短縮で)削除されます。 final 結果は上書きも削除もされてはなりません。 resultIndex 未満のインデックスのすべての要素は最後の SpeechRecognitionResultEvent 発火時と同一でなければなりません。 resultIndex 以上のインデックスの要素はすべて新しい結果で上書きされます。 "results" 配列の長さは増減しても構いませんが、resultIndex 未満にはできません。 resultIndex が results.length と等しい場合は新しい結果は返りません。(例: interim 結果1つ以上削除のとき等)

4.1.10. SpeechRecognitionPhrase

SpeechRecognitionPhrase オブジェクトはコンテキストバイアス用のフレーズを表し、以下の内部スロットを持ちます:

[[phrase]]

ブースト対象のテキスト文字列を表す DOMString。初期値は null。 空値は許可されますが、音声認識モデルで無視されます。

[[boost]]

このフレーズが音声認識モデル既知のものよりどれぐらいサイト的に確率高いと思うかの対数(自然対数相当)の float。 有効な boost 値は [0.0, 10.0] の float で、指定なし時は 1.0。 boost 0.0 はまったく強調されず、大きな値ほど登場確率が上がります。 boost 10.0 は極端に出やすい状態を意味し、めったに設定されるべきではありません。

SpeechRecognitionPhrase(phrase, boost) コンストラクタ
このコンストラクタが呼ばれる際、下記手順を実行します:
  1. boost が 0.0 未満または 10.0 を超える場合、SyntaxError をスローして中止します。

  2. phrSpeechRecognitionPhrase の新規オブジェクトとします。

  3. phr.[[phrase]]phrase を設定します。

  4. phr.[[boost]]boost を設定します。

  5. phr を返します。

phrase 属性, DOMString, readonly
この属性は [[phrase]] の値を返します。
boost 属性, float, readonly
この属性は [[boost]] の値を返します。

4.1.11. SpeechGrammar

SpeechGrammar オブジェクトは文法のコンテナを表します。

文法サポートは廃止されており削除されています。grammar オブジェクトは後方互換目的のためスペック上残っていますが、音声認識には影響しません。

この構造は以下の属性を持ちます:

src 属性, DOMString
必須 src 属性は grammar の URI です。
weight 属性, float
任意の weight 属性は、この grammar に対して音声認識サービスが使用すべき重みを制御します。 デフォルトでは grammar のウエイトは 1 です。 値が大きいほどその grammar の重みが高く、小さいほど弱くなります。

4.1.12. SpeechGrammarList

SpeechGrammarList オブジェクトは SpeechGrammar オブジェクトの集合を表します。 この構造は次の属性を持ちます:

文法サポートは廃止されており削除されています。grammar オブジェクトは後方互換目的で仕様に残っていますが、音声認識には影響しません。

length 属性, unsigned long, readonly
length 属性は配列に現在いくつ grammar があるかを示します。
item(index) getter
item getter は grammar 配列の index から SpeechGrammar を返します。 ユーザーエージェントは length 属性が配列要素数であること、index の昇順が grammar の追加順と一致することを保証しなければなりません。
addFromURI(src, weight) メソッド
このメソッドは URI に基づいて grammar を grammar 配列に追加します。 grammar の URI は src パラメータで与えられます。 一部サービスでは URI で組み込み grammar をサポートする場合があります。 weight パラメータは他の grammar に対する本 grammar の重みを示します。
addFromString(string, weight) メソッド
このメソッドはテキストに基づいて grammar を grammar 配列に追加します。 grammar の内容は string パラメータで指定します。 この内容は SpeechGrammar オブジェクト作成時 data: URI へエンコードすべきです。 weight パラメータは他の grammar に対する重みを示します。

4.2. SpeechSynthesis インターフェース

SpeechSynthesis インターフェースはテキスト読み上げ出力を制御するスクリプト Web API です。

[Exposed=Window]
interface SpeechSynthesis : EventTarget {
    readonly attribute boolean pending;
    readonly attribute boolean speaking;
    readonly attribute boolean paused;

    attribute EventHandler onvoiceschanged;

    undefined speak(SpeechSynthesisUtterance utterance);
    undefined cancel();
    undefined pause();
    undefined resume();
    sequence<SpeechSynthesisVoice> getVoices();
};

partial interface Window {
    [SameObject] readonly attribute SpeechSynthesis speechSynthesis;
};

[Exposed=Window]
interface SpeechSynthesisUtterance : EventTarget {
    constructor(optional DOMString text);

    attribute DOMString text;
    attribute DOMString lang;
    attribute SpeechSynthesisVoice? voice;
    attribute float volume;
    attribute float rate;
    attribute float pitch;

    attribute EventHandler onstart;
    attribute EventHandler onend;
    attribute EventHandler onerror;
    attribute EventHandler onpause;
    attribute EventHandler onresume;
    attribute EventHandler onmark;
    attribute EventHandler onboundary;
};

[Exposed=Window]
interface SpeechSynthesisEvent : Event {
    constructor(DOMString type, SpeechSynthesisEventInit eventInitDict);
    readonly attribute SpeechSynthesisUtterance utterance;
    readonly attribute unsigned long charIndex;
    readonly attribute unsigned long charLength;
    readonly attribute float elapsedTime;
    readonly attribute DOMString name;
};

dictionary SpeechSynthesisEventInit : EventInit {
    required SpeechSynthesisUtterance utterance;
    unsigned long charIndex = 0;
    unsigned long charLength = 0;
    float elapsedTime = 0;
    DOMString name = "";
};

enum SpeechSynthesisErrorCode {
    "canceled",
    "interrupted",
    "audio-busy",
    "audio-hardware",
    "network",
    "synthesis-unavailable",
    "synthesis-failed",
    "language-unavailable",
    "voice-unavailable",
    "text-too-long",
    "invalid-argument",
    "not-allowed",
};

[Exposed=Window]
interface SpeechSynthesisErrorEvent : SpeechSynthesisEvent {
    constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict);
    readonly attribute SpeechSynthesisErrorCode error;
};

dictionary SpeechSynthesisErrorEventInit : SpeechSynthesisEventInit {
    required SpeechSynthesisErrorCode error;
};

[Exposed=Window]
interface SpeechSynthesisVoice {
    readonly attribute DOMString voiceURI;
    readonly attribute DOMString name;
    readonly attribute DOMString lang;
    readonly attribute boolean localService;
    readonly attribute boolean default;
};

4.2.1. SpeechSynthesis 属性

pending 属性, boolean, 読み取り専用
この属性は、グローバル SpeechSynthesis インスタンスのキューにまだ読み上げが開始されていない発話が含まれている場合に true です。
speaking 属性, boolean, 読み取り専用
この属性は発話が再生中(読み上げが開始されておりまだ完了していない)の場合に true です。 これはグローバル SpeechSynthesis インスタンスが一時停止状態かどうかに関係ありません。
paused 属性, boolean, 読み取り専用
この属性はグローバル SpeechSynthesis インスタンスが一時停止状態のとき true です。 この状態はキューに何かがあるかどうかに依存しません。 新規ウィンドウのグローバル SpeechSynthesis インスタンスはデフォルトで非一時停止状態です。

4.2.2. SpeechSynthesis メソッド

speak(utterance) メソッド
このメソッドは、SpeechSynthesisUtterance オブジェクト utterance をグローバル SpeechSynthesis インスタンスのキュー末尾に追加します。 SpeechSynthesis インスタンスの一時停止状態を変更しません。 インスタンスが一時停止中ならそのままです。 一時停止中でなくキューに他の発話がないときはその発話がすぐに読み上げられ、キューに他の発話がある場合はその発話の後に再生されます。 このメソッド呼び出し後、対応する end または error イベントまでの間に SpeechSynthesisUtterance オブジェクトに変更を加えた場合、 その変更が実際の読み上げ内容に影響するかや、エラーになるかどうかは未定義です。 SpeechSynthesis オブジェクトは SpeechSynthesisUtterance オブジェクトの排他的な所有権を取得します。 別の SpeechSynthesis オブジェクトに同じ Utterance を渡すと例外になるべきです。 (例えば同一オリジンの2つのフレームが各々 SpeechSynthesis オブジェクトを持つ場合など)
cancel() メソッド
このメソッドはキュー内の全ての発話を削除します。 すでに発話中のものがある場合は直ちに再生が停止します。 このメソッドでグローバル SpeechSynthesis インスタンスの一時停止状態は変更されません。
pause() メソッド
このメソッドはグローバル SpeechSynthesis インスタンスを一時停止状態にします。 発話が再生中であれば途中で一時停止します。 (すでに一時停止状態のとき呼んでも何もしません。)
resume() メソッド
このメソッドはグローバル SpeechSynthesis インスタンスを非一時停止状態にします。 再生途中の発話があれば中断した箇所から再開し、なければキュー内の次の発話があればそれが再生されます。 (すでに非一時停止状態で呼んでも何もしません。)
getVoices() メソッド
このメソッドは利用可能な音声リストを返します。 どの音声が利用可能かはユーザーエージェント依存です。 利用可能な音声がない場合や、音声リストがまだ分かっていない(例:サーバー側合成で非同期の場合など)場合は、このメソッドは長さ0の SpeechSynthesisVoiceList を必ず返します。

4.2.3. SpeechSynthesis イベント

voiceschanged イベント
getVoices メソッドが返す SpeechSynthesisVoiceList の内容が変化した時に発火します。 例:サーバー側合成でリストが非同期的に決定されたとき、またはクライアント側音声をインストール/アンインストールしたとき等。

4.2.4. SpeechSynthesisUtterance 属性

text 属性, DOMString
この属性はこの発話で合成・読み上げすべきテキストを指定します。 プレーンテキストでも、完全な SSML 文書でも指定できます。 [SSML] SSML 非対応または一部対応のみのエンジンの場合、ユーザーエージェントやエンジンは未対応タグを除去してテキストを合成します。 テキストは最大32,767文字等、上限がある場合があります。
lang 属性, DOMString
この属性は、BCP 47 言語タグで発話の音声合成対象言語を指定します。 [BCP47] スクリプト上未設定のままだと、HTMLドキュメントルート要素やその継承階層の言語がデフォルト値として使われます。 このデフォルト値はリクエストの接続時に算出・使用されます。
voice 属性, SpeechSynthesisVoice, null 許容
この属性はウェブアプリが利用したい音声合成の声を指定します。 SpeechSynthesisUtterance オブジェクト生成時はこの属性が null で初期化されなければなりません。 speak() 呼び出し時にこの属性が SpeechSynthesisVoice リスト内の1つにセット済みなら、ユーザーエージェントはそれを使わなければなりません。 speak() 実行時に未設定または null なら、ユーザーエージェントはデフォルトの声を使わなければなりません。 デフォルトの声は現在の言語をサポートしている必要があり(lang 参照)、 ローカルおよびリモートサービスのいずれでもありえます。また、ブラウザ設定等でエンドユーザー選択も反映されます。
volume 属性, float
この属性は発話の音量を指定します。 0 以上 1 以下で、0 が最小音量、1 が最大音量(デフォルト1)です。 SSML を利用している場合は prosody タグ値が優先されます。
rate 属性, float
この属性は発話の話速を指定します。 声固有のデフォルト話速を基準に相対的に指定します。 1 が通常話速(デフォルト値)、2 は2倍速、0.5 は半速です。 0.1未満または10超は使用禁止ですが、合成エンジンや声によって範囲はさらに狭まる場合があります(例:指定値が3以上でも実際には3倍より速く話せないなど)。 SSML の場合は prosody タグ値が優先されます。
pitch 属性, float
この属性は発話の音程を指定します。 0 以上 2 以下、0 が最低音、2 が最高音、1 が合成エンジンや声のデフォルト音程です。 合成エンジンや声によってはさらに制限されることがあります。 SSML を使った場合は prosody タグ値が優先されます。

4.2.5. SpeechSynthesisUtterance イベント

これら各イベントは SpeechSynthesisEvent インターフェースを使う必要があります。 ただし error イベントのみ SpeechSynthesisErrorEvent インターフェースを使う必要があります。 これらのイベントはバブルせず、キャンセル不可です。

start イベント
この発話の読み上げが開始したとき発火します。
end イベント
この発話の読み上げが完了したとき発火します。 このイベントが発火した場合は error イベントは発火してはなりません。
error イベント
この発話の読み上げでエラーが発生した場合に発火します。 このイベントが発火した場合は end イベントは発火してはなりません。
pause イベント
この発話が途中で一時停止したときに発火します。
resume イベント
この発話が一時停止後に再開したときに発火します。 グローバル SpeechSynthesis インスタンスが一時停止状態の間に発話をキューに追加し、その後 resume を呼んでも resume イベントは発火せず、 この場合は utterance の start イベントが発火します。
mark イベント
発話が SSML の "mark" タグに達したときに発火します。 [SSML] 合成エンジンがこのイベントをサポートしている場合、ユーザーエージェントは発火しなければなりません。
boundary イベント
発話が単語または文境界に達したときに発火します。 合成エンジンがこのイベントをサポートしている場合、ユーザーエージェントは発火しなければなりません。

4.2.6. SpeechSynthesisEvent 属性

utterance 属性, SpeechSynthesisUtterance, 読み取り専用
この属性はこのイベントをトリガーした SpeechSynthesisUtterance を含みます。
charIndex 属性, unsigned long, 読み取り専用
この属性は合成エンジンの現発話位置に最も近い、元の発話文字列中のゼロ始まりの文字インデックスです。 charIndex が単語境界のどちら側か等は保証しませんが、charIndex より前はすでに再生済、charIndex より後は未再生です。 合成エンジンがサポートする場合、この値を返し、そうでなければ 0 を返さなければなりません。
charLength 属性, unsigned long, 読み取り専用
この属性は、このイベントに対応するテキスト(単語または文)の長さ(文字数)です。 この属性は、このイベントの charIndex から始まる長さ(文字数)です。 合成エンジンがサポートまたは検出可能な場合はこの値、それ以外は 0 を必ず返します。
elapsedTime 属性, float, 読み取り専用
このイベントが発火した時点で、この発話の読み上げ開始からの経過時間(秒)です。 合成エンジンがサポートまたは検出可能な場合はこの値、それ以外は 0 を必ず返します。
name 属性, DOMString, 読み取り専用
mark イベント用では、これは SSML の mark 要素の name 属性としてマーカー名を示します。[SSML] boundary イベント用では、イベント原因の区切り種別:"word" または "sentence" です。 それ以外のイベントでは "" を返すべきです。

4.2.7. SpeechSynthesisErrorEvent 属性

SpeechSynthesisErrorEvent は SpeechSynthesisUtterance の error イベント用インターフェースです。

error 属性, SpeechSynthesisErrorCode, 読み取り専用
errorCode は何が問題となったかを示す列挙値です。 値は次の通りです:
"canceled"
cancel メソッド呼び出しにより、SpeechSynthesisUtterance が再生前にキューから削除された。
"interrupted"
再生中の SpeechSynthesisUtterance が cancel メソッド呼び出しで完了前に途中で中断された。
"audio-busy"
ユーザーエージェントがオーディオ出力デバイスにアクセスできず操作できない。 (例えば他アプリケーションを終了する等で修正可能な場合があります。)
"audio-hardware"
ユーザーエージェントがオーディオ出力デバイスを認識できず操作できない。 (例えばスピーカーの接続やシステム設定変更が必要な場合があります。)
"network"
必要なネットワーク通信の失敗により操作できない。
"synthesis-unavailable"
利用可能な合成エンジンがなく操作できない。 (例えばエンジンのインストールや設定が必要な場合があります。)
"synthesis-failed"
合成エンジンがエラーを返し操作に失敗。
"language-unavailable"
SpeechSynthesisUtterance lang で指定した言語用の適切な声が利用できない。
"voice-unavailable"
SpeechSynthesisUtterance voice 属性で指定した声が利用できない。
"text-too-long"
SpeechSynthesisUtterance text 属性の内容が長すぎて合成できない。
"invalid-argument"
SpeechSynthesisUtterance rate, pitch, volume 属性の値が合成エンジンでサポートされていない。
"not-allowed"
現在のコンテキストでユーザーエージェントまたはシステム側で合成が許可されていない。

4.2.8. SpeechSynthesisVoice 属性

voiceURI 属性, DOMString, 読み取り専用
voiceURI 属性はこの声の音声合成サービスの場所を含めて音声合成声を指定します。 voiceURI は汎用URIであり、URNあるいはユーザーエージェントがローカルサービスだと解釈できるURLなど、ローカルやリモートいずれのサービスも指し得ます。
name 属性, DOMString, 読み取り専用
この属性は声を表す人間可読名です。 すべての名前が一意とは保証されません。
lang 属性, DOMString, 読み取り専用
この属性は声の言語(BCP47 言語タグ)です。[BCP47]
localService 属性, boolean, 読み取り専用
ローカル音声合成エンジン由来の声なら true、リモート音声合成サービス由来なら false です。 (リモートだと遅延やコスト等が発生する、ローカルだと品質が下がる等の意味合いになる場合もありますが、必ずしもそうとは限りません。)
default 属性, boolean, 読み取り専用
この属性は1言語につき最大1つの声で true です。 言語ごとにデフォルトは異なる場合があります。 どれがデフォルトになるかはユーザーエージェント依存です。

5.

このセクションは非規範的です。

5.1. 音声認識の例

音声認識を利用して入力フィールドに記入し、ウェブ検索を実行します。

<script type="text/javascript">
  var recognition = new SpeechRecognition();
  recognition.onresult = function(event) {
    if (event.results.length > 0) {
      q.value = event.results[0][0].transcript;
      q.form.submit();
    }
  }
</script>

<form action="https://www.example.com/search">
  <input type="search" id="q" name="q" size=60>
  <input type="button" value="話して入力" onclick="recognition.start()">
</form>

音声認識を利用してオプションリストに音声による選択肢(オルタナティブ結果)を入力します。

<script type="text/javascript">
  var recognition = new SpeechRecognition();
  recognition.maxAlternatives = 10;
  recognition.onresult = function(event) {
    if (event.results.length > 0) {
      var result = event.results[0];
      for (var i = 0; i < result.length; ++i) {
        var text = result[i].transcript;
        select.options[i] = new Option(text, text);
      }
    }
  }

  function start() {
    select.options.length = 0;
    recognition.start();
  }
</script>

<select id="select"></select>
<button onclick="start()">話して入力</button>

連続的な音声認識を利用してテキストエリアを入力します。

<textarea id="textarea" rows=10 cols=80></textarea>
<button id="button" onclick="toggleStartStop()"></button>

<script type="text/javascript">
  var recognizing;
  var recognition = new SpeechRecognition();
  recognition.continuous = true;
  reset();
  recognition.onend = reset;

  recognition.onresult = function (event) {
    for (var i = event.resultIndex; i < event.results.length; ++i) {
      if (event.results[i].isFinal) {
        textarea.value += event.results[i][0].transcript;
      }
    }
  }

  function reset() {
    recognizing = false;
    button.innerHTML = "話して入力";
  }

  function toggleStartStop() {
    if (recognizing) {
      recognition.stop();
      reset();
    } else {
      recognition.start();
      recognizing = true;
      button.innerHTML = "停止";
    }
  }
</script>

連続的な音声認識を利用し、最終結果を黒、暫定結果をグレーで表示します。

<button id="button" onclick="toggleStartStop()"></button>
<div style="border:dotted;padding:10px">
  <span id="final_span"></span>
  <span id="interim_span" style="color:grey"></span>
</div>

<script type="text/javascript">
  var recognizing;
  var recognition = new SpeechRecognition();
  recognition.continuous = true;
  recognition.interimResults = true;
  reset();
  recognition.onend = reset;

  recognition.onresult = function (event) {
    var final = "";
    var interim = "";
    for (var i = 0; i < event.results.length; ++i) {
      if (event.results[i].isFinal) {
        final += event.results[i][0].transcript;
      } else {
        interim += event.results[i][0].transcript;
      }
    }
    final_span.innerHTML = final;
    interim_span.innerHTML = interim;
  }

  function reset() {
    recognizing = false;
    button.innerHTML = "話して入力";
  }

  function toggleStartStop() {
    if (recognizing) {
      recognition.stop();
      reset();
    } else {
      recognition.start();
      recognizing = true;
      button.innerHTML = "停止";
      final_span.innerHTML = "";
      interim_span.innerHTML = "";
    }
  }
</script>

5.2. 音声合成の例

テキストの読み上げ。

<script type="text/javascript">
  speechSynthesis.speak(new SpeechSynthesisUtterance('Hello World'));
</script>

属性やイベントを使った読み上げテキスト。

<script type="text/javascript">
  var u = new SpeechSynthesisUtterance();
  u.text = 'Hello World';
  u.lang = 'en-US';
  u.rate = 1.2;
  u.onend = function(event) { alert('終了まで ' + event.elapsedTime + ' 秒でした。'); }
  speechSynthesis.speak(u);
</script>

謝辞

Adam Sobieski (Phoster) Björn Bringert (Google) Charles Pritchard Dominic Mazzoni (Google) Gerardo Capiel (Benetech) Jerry Carter Kagami Sascha Rosylight Marcos Cáceres (Mozilla) Nagesh Kharidi (Openstream) Olli Pettay (Mozilla) Peter Beverloo (Google) Raj Tumuluri (Openstream) Satish Sampath (Google)

また、HTML Speech Incubator Group のメンバーと、それが本仕様の基礎となった該当 Final Report

適合性

文書の規約

適合性要件は、説明的な記述と RFC 2119 用語の組み合わせで表現されます。 この文書の規範的な部分で使用されている “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” というキーワードは RFC 2119 の記述に従って解釈されます。 ただし可読性のため、これらの単語はこの仕様書ではすべて大文字とはなっていません。

この仕様の本文は、明示的に非規範的と記載されているセクション、例、および注記を除き、すべて規範的です。[RFC2119]

この仕様の例は「例えば」などで始まるか、 または class="example" で規範文とは異なる書式で示されます。 例えば以下のようになります:

これは参考用の例です。

参考用注記は “注:” という語で始まり、 また class="note" で規範文と区別されて示されます。 例えば以下のようになります:

注: これは参考用の注記です。

索引

本仕様で定義された用語

参照で定義された用語

参考文献

規範的な参考文献

[BCP47]
A. Phillips, Ed.; M. Davis, Ed.. Tags for Identifying Languages. September 2009. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc5646
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[HTMLSPEECH]
Michael Bodell; et al. HTML Speech Incubator Group Final Report. URL: https://www.w3.org/2005/Incubator/htmlspeech/XGR-htmlspeech-20111206/
[MEDIACAPTURE-STREAMS]
Cullen Jennings; et al. Media Capture and Streams. URL: https://w3c.github.io/mediacapture-main/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. URL: https://w3c.github.io/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. URL: https://w3c.github.io/webappsec-permissions-policy/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SERVICE-WORKERS]
Yoshisato Yanagisawa; Monica CHINTALA. Service Workers. URL: https://w3c.github.io/ServiceWorker/
[SSML]
Daniel Burnett; Zhi Wei Shuang. Speech Synthesis Markup Language (SSML) Version 1.1. 7 September 2010. REC. URL: https://www.w3.org/TR/speech-synthesis11/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

IDL インデックス

[SecureContext, Exposed=Window]
interface SpeechRecognition : EventTarget {
    constructor();

    // recognition parameters
    attribute SpeechGrammarList grammars;
    attribute DOMString lang;
    attribute boolean continuous;
    attribute boolean interimResults;
    attribute unsigned long maxAlternatives;
    attribute boolean processLocally;
    attribute ObservableArray<SpeechRecognitionPhrase> phrases;

    // methods to drive the speech interaction
    undefined start();
    undefined start(MediaStreamTrack audioTrack);
    undefined stop();
    undefined abort();
    static Promise<AvailabilityStatus> available(SpeechRecognitionOptions options);
    static Promise<boolean> install(SpeechRecognitionOptions options);

    // event methods
    attribute EventHandler onaudiostart;
    attribute EventHandler onsoundstart;
    attribute EventHandler onspeechstart;
    attribute EventHandler onspeechend;
    attribute EventHandler onsoundend;
    attribute EventHandler onaudioend;
    attribute EventHandler onresult;
    attribute EventHandler onnomatch;
    attribute EventHandler onerror;
    attribute EventHandler onstart;
    attribute EventHandler onend;
};

dictionary SpeechRecognitionOptions {
  required sequence<DOMString> langs;
  boolean processLocally = false;
};

enum SpeechRecognitionErrorCode {
    "no-speech",
    "aborted",
    "audio-capture",
    "network",
    "not-allowed",
    "service-not-allowed",
    "language-not-supported",
    "phrases-not-supported"
};

enum AvailabilityStatus {
    "unavailable",
    "downloadable",
    "downloading",
    "available"
};

[SecureContext, Exposed=Window]
interface SpeechRecognitionErrorEvent : Event {
    constructor(DOMString type, SpeechRecognitionErrorEventInit eventInitDict);
    readonly attribute SpeechRecognitionErrorCode error;
    readonly attribute DOMString message;
};

dictionary SpeechRecognitionErrorEventInit : EventInit {
    required SpeechRecognitionErrorCode error;
    DOMString message = "";
};

// Item in N-best list
[SecureContext, Exposed=Window]
interface SpeechRecognitionAlternative {
    readonly attribute DOMString transcript;
    readonly attribute float confidence;
};

// A complete one-shot simple response
[SecureContext, Exposed=Window]
interface SpeechRecognitionResult {
    readonly attribute unsigned long length;
    getter SpeechRecognitionAlternative item(unsigned long index);
    readonly attribute boolean isFinal;
};

// A collection of responses (used in continuous mode)
[SecureContext, Exposed=Window]
interface SpeechRecognitionResultList {
    readonly attribute unsigned long length;
    getter SpeechRecognitionResult item(unsigned long index);
};

// A full response, which could be interim or final, part of a continuous response or not
[SecureContext, Exposed=Window]
interface SpeechRecognitionEvent : Event {
    constructor(DOMString type, SpeechRecognitionEventInit eventInitDict);
    readonly attribute unsigned long resultIndex;
    readonly attribute SpeechRecognitionResultList results;
};

dictionary SpeechRecognitionEventInit : EventInit {
    unsigned long resultIndex = 0;
    required SpeechRecognitionResultList results;
};

// The object representing a speech grammar. This interface has been deprecated and exists in this spec for the sole purpose of maintaining backwards compatibility.
[Exposed=Window]
interface SpeechGrammar {
    attribute DOMString src;
    attribute float weight;
};

// The object representing a speech grammar collection. This interface has been deprecated and exists in this spec for the sole purpose of maintaining backwards compatibility.
[Exposed=Window]
interface SpeechGrammarList {
    constructor();
    readonly attribute unsigned long length;
    getter SpeechGrammar item(unsigned long index);
    undefined addFromURI(DOMString src,
                    optional float weight = 1.0);
    undefined addFromString(DOMString string,
                    optional float weight = 1.0);
};

// The object representing a phrase for contextual biasing.
[SecureContext, Exposed=Window]
interface SpeechRecognitionPhrase {
    constructor(DOMString phrase, optional float boost = 1.0);
    readonly attribute DOMString phrase;
    readonly attribute float boost;
};

[Exposed=Window]
interface SpeechSynthesis : EventTarget {
    readonly attribute boolean pending;
    readonly attribute boolean speaking;
    readonly attribute boolean paused;

    attribute EventHandler onvoiceschanged;

    undefined speak(SpeechSynthesisUtterance utterance);
    undefined cancel();
    undefined pause();
    undefined resume();
    sequence<SpeechSynthesisVoice> getVoices();
};

partial interface Window {
    [SameObject] readonly attribute SpeechSynthesis speechSynthesis;
};

[Exposed=Window]
interface SpeechSynthesisUtterance : EventTarget {
    constructor(optional DOMString text);

    attribute DOMString text;
    attribute DOMString lang;
    attribute SpeechSynthesisVoice? voice;
    attribute float volume;
    attribute float rate;
    attribute float pitch;

    attribute EventHandler onstart;
    attribute EventHandler onend;
    attribute EventHandler onerror;
    attribute EventHandler onpause;
    attribute EventHandler onresume;
    attribute EventHandler onmark;
    attribute EventHandler onboundary;
};

[Exposed=Window]
interface SpeechSynthesisEvent : Event {
    constructor(DOMString type, SpeechSynthesisEventInit eventInitDict);
    readonly attribute SpeechSynthesisUtterance utterance;
    readonly attribute unsigned long charIndex;
    readonly attribute unsigned long charLength;
    readonly attribute float elapsedTime;
    readonly attribute DOMString name;
};

dictionary SpeechSynthesisEventInit : EventInit {
    required SpeechSynthesisUtterance utterance;
    unsigned long charIndex = 0;
    unsigned long charLength = 0;
    float elapsedTime = 0;
    DOMString name = "";
};

enum SpeechSynthesisErrorCode {
    "canceled",
    "interrupted",
    "audio-busy",
    "audio-hardware",
    "network",
    "synthesis-unavailable",
    "synthesis-failed",
    "language-unavailable",
    "voice-unavailable",
    "text-too-long",
    "invalid-argument",
    "not-allowed",
};

[Exposed=Window]
interface SpeechSynthesisErrorEvent : SpeechSynthesisEvent {
    constructor(DOMString type, SpeechSynthesisErrorEventInit eventInitDict);
    readonly attribute SpeechSynthesisErrorCode error;
};

dictionary SpeechSynthesisErrorEventInit : SpeechSynthesisEventInit {
    required SpeechSynthesisErrorCode error;
};

[Exposed=Window]
interface SpeechSynthesisVoice {
    readonly attribute DOMString voiceURI;
    readonly attribute DOMString name;
    readonly attribute DOMString lang;
    readonly attribute boolean localService;
    readonly attribute boolean default;
};

課題インデックス

このグループでは、WebRTC がオーディオソースやリモート認識器の選択を指定するために利用できるかどうかについて議論されました。 詳しくは、WebRTC、Web Audio API、および他の外部ソースとの連携に関する public-speech-api@w3.org のスレッドを参照してください。
このグループでは、自信度が音声認識エンジン非依存な方法で指定できるかや、dialog API ではないために confidence threshold や nomatch を含めるべきかどうかが議論されました。 詳しくは、Confidence property に関する public-speech-api@w3.org のスレッドを参照してください。