
Web Speech APIの仕組みとブラウザ音声合成の歴史 ― DECtalkからニューラルTTSまで
ブラウザのアドレスバーに一行もコードを書かなくても、speechSynthesis.speak()の一行で機械に言葉を話させることができる。この「当たり前」の裏には、1939年のベル研究所から始まる音声合成技術の壮大な歴史がある。DECtalk、SAPI、WaveNet ― そしてWeb Speech API。40年の進化を辿る。
音声合成の夜明け ― Voderからの系譜(1939〜1980年代)
1939年: Voder ― 最初の電子音声合成装置
音声合成の歴史は1939年のニューヨーク万博に遡ります。ベル研究所のHomer Dudleyが発明したVoder(Voice Operation DEMonstrator)は、世界初の電子音声合成装置でした。
Voderはキーボードとペダルを使って操作する楽器のような装置で、Helen Harperが率いる20人のオペレーターは、流暢な音声を生成するために約1年間の訓練を必要としました。手動操作という限界はありましたが、「機械で人の声を作る」という概念実証としては画期的でした。
1984年: DECtalk ― ホーキング博士の声
音声合成技術を一般に知らしめたのは、DECtalkです。MIT のDennis Klattが開発したKlattTalk/MITalkを基に、Digital Equipment Corporation(DEC)が1983年12月に発表、1984年2月から出荷を開始しました。
DECtalkには9つの内蔵音声がありました。
- Perfect Paul(デフォルト、Klatt自身の声がモデル)
- Beautiful Betty, Huge Harry, Frail Frank, Kit the Kid 等
そして、ALS(筋萎縮性側索硬化症)により声を失ったスティーブン・ホーキング博士がDECtalkの「Perfect Paul」の声を使い始めたことで、この合成音声は世界的に有名になりました。ホーキング博士はより自然な最新の音声への更新を繰り返し断り、この声を生涯使い続けました。
合成方式の分類
この時代の音声合成は大きく2つのアプローチに分かれます。
| 方式 | 仕組み | 音質 |
|---|---|---|
| フォルマント合成 | 声道のフォルマント周波数を数学的にモデル化 | ロボット的だが軽量 |
| 連結合成 | 録音した人間の声の断片をつなぎ合わせる | 自然だが接合部に不自然さ |
DECtalkはフォルマント合成、後のSAPIやApple音声は連結合成が主流となりました。
OS内蔵音声合成の時代 ― SAPI, PlainTalk, そしてMac(1984〜2000年代)
1984年: Apple MacinTalk
初代Macintoshの発表会(1984年1月)で、スティーブ・ジョブズはMacにMacinTalkで自己紹介をさせるデモを行いました。Joseph KatzとMark Bartonが開発したこの音声合成エンジンは、コンピュータが「話す」ことへの一般の認知を大きく広げました。
1993年にはAppleがPlainTalkをSystem 7.1.2で提供し、音声合成と音声認識をOS標準機能として統合。2005年にはMac OS X 10.4 TigerでVoiceOverが登場し、アクセシビリティの柱となりました。
1995年: Microsoft SAPI
MicrosoftはSpeech API (SAPI)を通じて、Windowsに音声合成機能を提供してきました。
| バージョン | 年 | 主な変更 |
|---|---|---|
| SAPI 1.0 | 1995 | Windows 95/NT 3.51対応、初版 |
| SAPI 4.0 | 1998 | COM API化、ActiveXコントロール対応 |
| SAPI 5.0 | 2000 | 完全書き直し、sapi.dll統一化 |
| SAPI 5.3 | 2007 | Vista搭載、.NET対応、SSML 1.0サポート |
| SAPI 5.4 | 2009 | Windows 7搭載、最新ドキュメント版 |
WindowsでのTTS音声(Ayumi, Haruka, Ichiro, Sayaka等)は、このSAPIエンジン上で動作しています。ブラウザのWeb Speech APIからもOS経由でこれらの音声にアクセスできます。
Web Speech API ― ブラウザが話す時代の幕開け(2012年)
標準化への道のり
Web Speech APIは以下の経緯で生まれました。
- 2010年8月: W3Cで「HTML Speech Incubator Group」結成(Google, Microsoft, Mozilla, AT&T等が参加)
- 2011年12月: Incubator Group最終報告書公開。GoogleのGlen ShiresがJavaScript APIのサブセットを提案
- 2012年4月: 「Speech API Community Group」発足(議長: Glen Shires)
- 2012年6月13日: Speech JavaScript API仕様の最初のドラフト公開
- 2012年10月19日: Web Speech API最終仕様公開
ブラウザ実装の歴史
| ブラウザ | 初対応バージョン | リリース時期 |
|---|---|---|
| Chrome | 33 | 2014年2月 |
| Safari | 7.1 | 2014年 |
| Firefox | 49 | 2016年9月 |
| Edge | 14 (EdgeHTML) | 2016年 |
仕様上のステータス
注意すべき点として、Web Speech APIはW3C勧告(Recommendation)にはなっていません。当初Community Group Reportとして公開され、現在はW3C Audio Working Groupが保守していますが、正式な標準規格ではなく「事実上の標準」です。それでもすべての主要ブラウザが実装しており、実用上は問題ありません。
APIの仕組み ― SpeechSynthesisUtteranceを解剖する
Web Speech APIの音声合成(SpeechSynthesis)は、驚くほどシンプルなAPIです。
基本的なコード
// 1. 発話オブジェクトを作成
const utterance = new SpeechSynthesisUtterance("こんにちは");
// 2. パラメータを設定
utterance.lang = "ja-JP"; // 言語
utterance.rate = 1.0; // 速度 (0.1〜10)
utterance.pitch = 1.0; // ピッチ (0〜2)
utterance.volume = 1.0; // 音量 (0〜1)
// 3. 音声を選択(オプション)
const voices = speechSynthesis.getVoices();
utterance.voice = voices.find(v => v.name.includes("Nanami"));
// 4. 発話
speechSynthesis.speak(utterance);
イベントモデル
SpeechSynthesisUtteranceは以下のイベントを発火します。
onstart: 発話開始onend: 発話完了onpause/onresume: 一時停止 / 再開onboundary: 単語・文の境界に到達onerror: エラー発生
音声の取得とvoiceschangedイベント
speechSynthesis.getVoices()は音声一覧を返しますが、Chromeでは非同期にロードされるため、初回呼び出し時は空配列が返る場合があります。
// Chromeでは voiceschanged イベントを待つ必要がある
speechSynthesis.addEventListener("voiceschanged", () => {
const voices = speechSynthesis.getVoices();
const jaVoices = voices.filter(v => v.lang.startsWith("ja"));
console.log(`日本語音声: ${jaVoices.length}件`);
});
ブラウザ別音声エンジンの違い ― なぜ声が違うのか
同じWeb Speech APIを使っても、ブラウザによって音声の種類と品質が大きく異なります。
| ブラウザ | 音声エンジン | 日本語音声 | localService |
|---|---|---|---|
| Chrome | Google Remote + OS音声 | Google 日本語(リモート) | false(リモート) |
| Edge | MS Neural TTS + SAPI | Nanami(ニューラル) | 混在 |
| Safari | Apple TTS | Kyoko, O-Ren | true(ローカル) |
| Firefox | OS標準のみ | Ayumi, Haruka等(SAPI) | true(ローカル) |
localServiceプロパティとプライバシー
各音声オブジェクトにはlocalServiceというブール値プロパティがあります。
localService === true: テキストはデバイス内で処理され、外部送信なしlocalService === false: テキストがGoogle/Microsoftのサーバーに送信される可能性あり
機密テキストを読み上げる場合は、ローカル音声を選択することが重要です。NanTooのテキスト読み上げツールでは、「ローカル音声のみ」フィルター機能を実装しています。
なぜEdgeのNanamiが高品質なのか
EdgeはMicrosoftのAzure Neural TTS技術を直接利用できる唯一のブラウザです。Nanamiは深層ニューラルネットワークでピッチ・持続時間・エネルギーを同時予測し、自然な韻律を生成します。他のブラウザからはこのニューラル音声にはアクセスできません。
ニューラルTTS革命 ― WaveNetからTacotron 2へ(2016年〜)
2016年以降、音声合成の品質は劇的に向上しました。その原動力はディープラーニングです。
2016年: WaveNet(DeepMind / Google)
WaveNetは、自己回帰型畳み込みニューラルネットワークを使って生の音声波形をサンプル単位で生成する画期的なモデルでした。聴取テストでは、従来のどのシステムよりも自然な音声と評価されました。
ただし、初期のWaveNetは1秒の音声生成に数分の計算が必要という実用上の大きな課題がありました。
2017年: Tacotron / Tacotron 2(Google)
- 2017年4月 Tacotron: テキストからスペクトログラムを直接生成するSequence-to-Sequenceモデル
- 2017年12月 Tacotron 2: エンコーダ-デコーダ + WaveNetボコーダのEnd-to-Endシステム。MOS(平均意見スコア)4.53/5.0を達成 ― プロの人間の録音と統制テストでほぼ区別がつかないレベル
商用展開
- 2018年3月: Google Cloud Text-to-Speech API ベータ版(WaveNet音声搭載)
- 2018年8月: Google Cloud TTS GA(30標準音声 + 26 WaveNet音声, 14言語)
- 2018年9月: Microsoft Neural TTSプレビュー発表(Microsoft Ignite)
- 2021年8月31日: Microsoft、非ニューラルTTS音声を廃止。ニューラル音声に一本化
現代のニューラルTTSアーキテクチャ
現在の高品質TTSは3段階のパイプラインで構成されます。
- テキスト前処理フロントエンド: テキストを音素・韻律記号に変換
- 音響モデル(エンコーダ-デコーダ): 音素列からメルスペクトログラムを生成(Tacotron 2, FastSpeech 2等)
- ボコーダ: スペクトログラムから音声波形を生成(WaveNet, HiFi-GAN等)
2026年現在、Google Cloud TTSは380以上の音声・75言語以上、Microsoft Azure Neural TTSは400以上の音声・140言語以上を提供しています。
Chrome 15秒バグ ― 長文読み上げの最大の敵
Web Speech APIの実用上、最も厄介な問題がChromium系ブラウザの「15秒バグ」です。
症状
Chromium Bug #679437として報告されているこのバグでは、speechSynthesis.speak()で長いテキストを読み上げると、約15秒後に音声が突然停止します。Chrome 55以降のWindows/Ubuntu環境で確認されており、2026年現在も完全には修正されていません。
対策1: pause/resume ワークアラウンド
// 13秒ごとに resume() を呼び出してタイマーをリセット
const timer = setInterval(() => {
if (speechSynthesis.speaking && !speechSynthesis.paused) {
speechSynthesis.pause();
speechSynthesis.resume();
}
}, 13000);
utterance.onend = () => clearInterval(timer);
ただし、この手法はAndroidでは動作しない場合があるため、プラットフォーム判定が必要です。
対策2: テキスト分割(推奨)
より安定した方法は、テキストを句読点で分割し、個別のSpeechSynthesisUtteranceとして連鎖再生することです。
// 文単位に分割して順次再生
const chunks = text.split(/(?<=[。!?])s*/);
function speakNext(i) {
if (i >= chunks.length) return;
const u = new SpeechSynthesisUtterance(chunks[i]);
u.onend = () => speakNext(i + 1);
speechSynthesis.speak(u);
}
speakNext(0);
NanTooのテキスト読み上げツールでは、両方の対策を組み合わせて安定した長文読み上げを実現しています。
SSML ― 読み上げの「楽譜」
SSML(Speech Synthesis Markup Language)は、音声合成の表現力を高めるためのW3C標準マークアップ言語です。
- SSML 1.0: 2004年 W3C勧告
- SSML 1.1: 2010年9月7日 W3C勧告(国際化改善、発音辞書仕様との整合)
SSMLの主な要素
<speak version="1.1" xml:lang="ja-JP">
<!-- 間を空ける -->
<break time="500ms"/>
<!-- 速度・ピッチを変える -->
<prosody rate="slow" pitch="+10%">ゆっくり高めに</prosody>
<!-- 数字の読み方を指定 -->
<say-as interpret-as="telephone">03-1234-5678</say-as>
<!-- 特定の読み方を強制 -->
<phoneme alphabet="x-JEITA" ph="to:'kyo:'to">東京都</phoneme>
</speak>
ただし、ブラウザのWeb Speech APIではSSMLは基本的にサポートされていません。SSMLが使えるのはGoogle Cloud TTS、Azure Speech Service等のクラウドAPIに限られます。ブラウザではrate/pitch/volumeプロパティでの制御が代替手段となります。
Web Speech APIの限界と今後
現在の限界
- 音質がブラウザ/OS依存: 同じサイトでもChrome・Edge・Safariで全く違う品質になる
- 音声ファイルへの保存不可: APIはリアルタイム再生専用。音声データのBlobは取得できない
- SSMLに未対応: 読み上げの細かい制御ができない
- Chrome 15秒バグが長年未修正
- 音声一覧がブラウザ任せ: 開発者がカスタム音声を追加できない
今後の展望
Web Speech APIは「W3C勧告」にはなっていない事実上の標準ですが、現在はW3C Audio Working Groupが保守を引き継いでいます。今後期待される改善は:
- WebCodecs APIとの連携: 音声データをストリームとして取得できれば、録音・加工が可能に
- SSML対応: ブラウザ側でSSMLを解釈できれば、表現力が飛躍的に向上
- ブラウザ内ニューラルTTS: モデルのWebAssembly実行やWebGPU活用で、クラウドに頼らない高品質音声が実現する可能性
1939年のVoderから87年。人間が機械に「自然に話させる」という夢は、ブラウザのたった1行のAPIで誰でも実現できる時代になりました。しかしその裏には、Dennis Klattの声がDECtalkに宿り、WaveNetが聴覚心理を超え、Nanamiがニューラルネットワークでイントネーションを学んだ ― 無数の技術者たちの積み重ねがあるのです。
参考文献・ソース
- W3C Web Speech API Specification (Audio Working Group) ↗
- MDN Web Docs — Web Speech API ↗
- Can I Use — Speech Synthesis ↗
- Computer History Museum — How DECtalk Gave Voice to a Genius ↗
- Google Research — Tacotron 2: Generating Human-like Speech from Text ↗
- Microsoft — Neural Text-to-Speech ↗
- Chromium Bug #679437 — Speech Synthesis stops after 15 seconds ↗
記事作成に関する注記
本記事は AI(大規模言語モデル)を編集補助として活用して作成しています。 公開前に編集者が内容を確認していますが、事実誤認・仕様の解釈ミス・最新情報との齟齬が含まれる可能性があります。 重要な判断を行う際は、本文中の一次ソースや公式ドキュメントを必ずご自身でご確認ください。 誤りにお気づきの場合は、お問い合わせフォームよりご連絡いただけると助かります。


