Web API見本市
メディア権限プロンプトありスマホ推奨判定中...

Web Speech API

テキストの読み上げ(合成)とマイク音声のテキスト化(認識)をブラウザ標準機能だけで行えるAPI。

MDNのドキュメントを見る

1対応判定

ブラウザ対応バージョン
Chrome合成33+ / 認識139+(それ以前はwebkit接頭辞)
Firefox合成49+ / 認識142+(フラグ必要=実質未対応)
Safari合成7+ / 認識14.1+

備考: 日本語voiceの有無はOS依存。Chromeはwebkit接頭辞の併用で広くカバーできる

2権限フロー

  1. 権限不要

    API呼び出しだけで動く。プロンプトも操作起点の縛りもない

  2. ユーザージェスチャー必須

    ボタンクリック等のユーザー操作の中でしか呼べない。プロンプトは出ない

  3. 権限プロンプトありこのAPI

    呼び出すとブラウザが許可/ブロックのプロンプトを表示し、ユーザーが選ぶ

  4. iOS独自requestPermission

    iOSではrequestPermission()を操作起点で呼び、明示的に許可を得る

合成(読み上げ)は権限不要。認識はマイクを使うため、開始時にマイク許可のプロンプトが表示される。

現在の権限状態(navigator.permissions.query): このブラウザでは取得できません

3ライブデモ: 日本語読み上げと音声認識

4コードスニペット

TypeScript(要約版)
// 合成: 入力文を日本語voiceで読み上げる
function speak(text: string, voice: SpeechSynthesisVoice, rate: number) {
  const utter = new SpeechSynthesisUtterance(text);
  utter.voice = voice;
  utter.rate = rate;      // 0.1 - 10
  utter.pitch = 1.2;      // 0 - 2
  speechSynthesis.cancel();
  speechSynthesis.speak(utter);
}

// voice一覧は非同期に届くことがある
speechSynthesis.addEventListener("voiceschanged", () => {
  const jaVoices = speechSynthesis
    .getVoices()
    .filter((v) => v.lang.startsWith("ja"));
});

// 認識: マイク音声をリアルタイムでテキスト化
const Ctor =
  window.SpeechRecognition ?? window.webkitSpeechRecognition;
const rec = new Ctor();
rec.lang = "ja-JP";
rec.interimResults = true; // 確定前の途中結果も受け取る
rec.continuous = true;
rec.onresult = (e) => {
  const last = e.results[e.results.length - 1];
  console.log(last[0].transcript, last.isFinal);
};
rec.start(); // 初回はマイク許可プロンプトが出る