テキスト読み上げ (TTS)

テキストデータを音声に変換する技術。Text-to-Speech の略。スクリーンリーダーや音声アシスタントの基盤技術。

テキスト読み上げ (TTS: Text-to-Speech) は、テキストデータを人間の音声に変換する技術です。スクリーンリーダー、音声アシスタント (Siri、Alexa、Google アシスタント)、カーナビゲーション、電子書籍の朗読機能など、幅広い分野で活用されています。視覚障害のあるユーザーにとっては Web コンテンツへのアクセス手段として不可欠な技術です。

TTS の処理は大きく 3 つの段階に分かれます。第 1 段階のテキスト解析では、形態素解析による単語分割、数字や略語の読み推定、同音異義語の判別を行います。第 2 段階の韻律生成では、アクセント、イントネーション、ポーズ (間) の位置を決定します。第 3 段階の音声合成では、実際の音声波形を生成します。2010 年代後半以降は深層学習を用いた合成方式 (WaveNet、Tacotron、VITS など) が実装に入り、それ以前の波形接続方式や統計的な方式に比べて抑揚のつながりが滑らかになりました。ただし方式によっては韻律生成と波形生成を分けずに一括で学習するため、上の 3 段階が実装上はっきり分かれていないものもあります。なお「人間の声と区別がつかない」といった表現は各サービスの説明文で使われる言い方であり、聞き手が判別できるかどうかは声質や文の内容によって変わります。

Web ブラウザでは Web Speech API の SpeechSynthesis インターフェースを通じて TTS 機能を利用できます。speechSynthesis.speak(new SpeechSynthesisUtterance('読み上げるテキスト')) のように数行のコードで実装できます。speak() は発話キューに追加するメソッドで、先に入っている発話が読み終わってから順に再生されます。連続して呼ぶと重なるのではなく待たされるため、入力に合わせて逐次読ませる実装では、前の発話を止める処理を入れないと遅れが積み上がります。クラウドサービスとしては Amazon Polly、Google Cloud Text-to-Speech、Microsoft の Speech service (旧称 Cognitive Services Speech) が代表的で、SSML (Speech Synthesis Markup Language) を使って読み上げ速度、ピッチ、ポーズ、音量、読みの指定などを制御できます。文字数の観点で見落としやすいのは課金の数え方です。Microsoft は Speech service の課金対象に SSML のマークアップを含めて数える旨 (<speak><voice> の 2 タグだけは除外) と、日本語で使う漢字を含め中国語の文字は 1 文字を 2 文字として数える旨を公開しています。つまり原稿の文字数がそのまま請求の基準になるとは限らず、タグを多用した SSML では見た目の本文より多く数えられます。

日本語の TTS では、漢字の読み分けが特有の課題です。「生」は「なま」「せい」「しょう」「いきる」など文脈によって読みが変わります。また、人名や地名の読みは辞書に登録されていないケースも多く、カスタム辞書やルビ情報の活用が精度向上に有効です。日本語はアクセントの型 (平板型、頭高型、中高型、尾高型) が単語ごとに決まっており、複合語になると元の語とは型が変わることもあります。辞書に載っていない語や固有名詞では型を推定するしかないため、読みは合っているのに抑揚だけが不自然になる、という現象が起こります。表記から読みもアクセントも一意に決まらない点が、日本語のテキスト解析で難しさになっています。

TTS とスクリーンリーダーは密接に関連していますが、役割が異なります。TTS はテキストを音声に変換するエンジンであり、スクリーンリーダーは画面上の情報を解釈して TTS エンジンに渡すソフトウェアです。Web コンテンツのアクセシビリティを高めるには、セマンティック HTML の使用、適切な ARIA 属性の設定、画像への alt テキストの付与など、スクリーンリーダーが正しく解釈できる構造にすることが重要です。

文字数カウントの観点では、原稿の文字数は読み上げ時間の当たりを付ける手がかりになります。日本語のナレーションでは 1 分あたり 300〜400 文字、英語では 1 分あたり 150〜180 語あたりが目安として使われます。ポッドキャストの台本や動画のナレーション原稿で、尺に対する分量を文字数で管理するのはこの目安にもとづく進め方です。ただし文字数と時間は比例しません。読み上げの長さを決めるのは文字数ではなく音の拍数だからです。「1,000」は 5 文字ですが読みは「せん」の 2 拍で済み、逆に「2026」は 4 文字でも「にせんにじゅうろく」の 8 拍に膨らみます。アルファベットの略語も同じで、「URL」は 3 文字でも「ユーアールエル」の 7 拍です。漢字も同様で、1 文字あたりの拍数は「絵」(え) の 1 拍から「志」(こころざし) の 5 拍まで幅があります。句読点で入るポーズ、SSML での速度指定、記号の読み上げ有無も時間を左右します。したがって文字数での見積もりは企画段階の概算にとどめ、尺が厳しい用途では実際に合成して再生時間を測るのが確実です。数字や英字、記号を多く含む原稿ほど、文字数からの推定と実測はずれます。

この記事を共有