🔊

ElevenLabsのText-to-Speechを試してみた

に公開

はじめに

本記事は、複数あるTTS(テキスト読み上げ)サービスの中から、WebUI上でプロンプトを元に簡単に音声が生成でき、その音声を用いたTTSサービスを提供しているElevenLabsを実際に動かしてみた際の技術的なポイントと所感を紹介します。

ElevenLabsとは

ElevenLabsは、高品質な音声合成を提供するAIプラットフォームです。TTSだけでなく、Voice Cloning(声のクローニング)やConversational AI Agentなど、音声に関する幅広い機能を提供しています。

検証にあたって特に目を引いたのは音声の選択肢の広さでした。

音声の選択肢が豊富

ElevenLabsを触ってまず驚くのが、使える音声のバリエーションです。大きく3つの方法で音声を用意できます。

1. プリセットボイス

ElevenLabsが用意している既成の音声が多数あり、すぐに利用開始できます。英語はもちろん、日本語対応の音声も含まれています。

2. Voice Design(プロンプトで音声を生成)

テキストプロンプトで「30代の落ち着いた男性の声」のように指示を出すと、それに合った音声を生成してくれます。イメージに合う声を言葉で指定できるため、既成ボイスにしっくり来るものがない場合に有効です。生成した音声はそのまま保存してTTSに使えます。

3. Voice Cloning(声のクローニング)

自分の声や特定の人物の声をアップロードしてクローンを作成できます。Instant Cloning(短い音声サンプルから)とProfessional Cloning(より高品質)の2段階があり、用途に応じて選択可能です。

この3つの方法を組み合わせられるのがElevenLabsの強みで、プロダクトの要件に合わせて柔軟に音声を選定できます。

検証時のアーキテクチャ

検証では、以下の構成でTTSの動作確認を行いました。

フロントエンドとバックエンド間はWebSocketで接続し、バックエンドがElevenLabsのREST APIを呼び出して音声を取得します。WebSocketを採用した理由は、チャットの応答に対してリアルタイムに音声を返す必要があったためです。

実装のポイント

モデル選択とレイテンシ

ElevenLabsは用途に応じて複数のモデルを提供しています。

モデル 特徴 レイテンシ
eleven_flash_v2_5 最速。リアルタイム会話向け ~75ms
eleven_turbo_v2_5 速度と品質のバランス ~250ms
eleven_multilingual_v2 最高品質。多言語対応 比較的遅い

今回の検証ではリアルタイム性を重視し、eleven_flash_v2_5を使用しました。もちろん eleven_multilingual_v2 と比較した際には機械っぽさが出てしまう部分はありますが、それでも十分自然な音声が返ってきます。

グローバルエンドポイントの活用

const ELEVENLABS_API_BASE = 'https://api-global-preview.elevenlabs.io/v1';

通常のAPIエンドポイントの代わりにグローバルエンドポイントを使用すると、最寄りのリージョンに自動ルーティングされます。日本からのアクセスでもレイテンシを抑えられます。

ストリーミング + レイテンシ最適化パラメータ

const latency = config.optimizeStreamingLatency ?? 3;
const streamUrl = `${ELEVENLABS_API_BASE}/text-to-speech/${voiceId}/stream?optimize_streaming_latency=${latency}`;

optimize_streaming_latencyパラメータ(0〜4)を指定することで、最初のバイトが返るまでの時間を短縮できます。値が大きいほど高速ですが、音声品質とのトレードオフがあります。今回は3を採用し、品質と速度のバランスを取りました。

Voice Settingsのチューニング

voice_settings: {
  stability: 0.5,        // 安定性(高いほど一貫した音声)
  similarity_boost: 0.75, // 類似性ブースト(元の声への忠実度)
  style: 0,              // スタイル強調
  use_speaker_boost: true // スピーカーブースト
}

stabilitysimilarity_boostの2つが特に音声の印象を左右します。stabilityを上げると安定した読み上げになりますが、抑揚が減ります。similarity_boostは元の音声にどれだけ寄せるかを制御します。ここは実際に聴きながら調整するのが確実です。

日本語のカタカナ前処理

実際に色々と話をさせてみたところ漢字の読み方に間違いが多く違和感を覚え、日本語TTSの精度を向上させるため、kuromojiを用いたカタカナ変換の前処理を実装しました。

// 形態素解析で読み仮名を取得
const tokens = this.tokenizer.tokenize(text);
const processedTokens = tokens.map(token => token.reading || token.surface_form);
return processedTokens.join('');

漢字をカタカナに変換してからTTSに渡すことで、読み間違いを減らせます。ただし、すべてのケースでカタカナ変換が有効とは限らないため、設定でON/OFFを切り替えられるようにしています。
また、音節の区切りにスペースを挟むなど行なってみたものの、この対応についてはより機械的な音声が生成されることとなりボツになりました。

フロントエンド:ブラウザ自動再生ポリシーへの対処

ブラウザのAutoplay Policyにより、ユーザー操作なしに音声を再生できません。TTSトグルボタンの押下時にAudioContextを初期化するunlock処理を入れることで対処しました。

const unlock = useCallback(async (): Promise<boolean> => {
  const audioContext = new AudioContext();
  const buffer = audioContext.createBuffer(1, 1, 22050);
  const source = audioContext.createBufferSource();
  source.buffer = buffer;
  source.connect(audioContext.destination);
  source.start(0);
  return true;
}, []);

これはElevenLabs固有の話ではありませんが、TTS機能をWebアプリに組み込む際には必ず必要になるポイントです。

料金体系

ElevenLabsは文字数ベースの従量課金です。※2026年2月10時点
詳細は以下リンクから公式をご確認ください。参考までに画像を添付しておきます。
https://elevenlabs.io/pricing

料金表

検証やプロトタイプであればFreeプランで十分試せます。本番運用で気になるのは文字数の消費速度で、日本語はひらがな・カタカナ1文字がそれぞれ1文字としてカウントされるため、英語と比べて文字数効率が悪くなる傾向があります。事前に想定利用量を見積もっておくことを推奨します。

使ってみた所感

良かった点

  • 音声品質が高い: Flash v2.5でもかなり自然な音声が生成される。日本語の発音も概ね良好
  • 音声の選択肢が広い: プリセット・プロンプト生成・Voice Cloningの3段構えで、要件に合う声を見つけやすい
  • APIがシンプル: RESTエンドポイント1つで音声取得でき、統合のハードルが低い
  • レイテンシ最適化が柔軟: モデル選択、グローバルエンドポイント、ストリーミングパラメータなど複数のレイヤーで調整可能

注意が必要な点

  • 日本語の読み間違い: 固有名詞や専門用語で稀に読みを間違えることがある。カタカナ前処理で軽減可能だが完全ではない
  • 文字数課金: 日本語は英語よりコスト効率が下がる。大量のテキストを読み上げる用途ではプランの見極めが重要
  • レイテンシと品質のトレードオフ: optimize_streaming_latencyを上げすぎると音声の質が落ちる場合がある。実際に聴いて確認が必要

まとめ

TTS検証の一つとしてElevenLabsを試しましたが、音声品質・レイテンシ・開発体験のバランスが良い印象でした。特に音声の選択肢の豊富さが特徴的で、プリセットだけでなくVoice DesignやVoice Cloningでプロダクトに合った音声を柔軟に用意できる点がシーンに合わせた使い分けなど、よりフィットした利用を可能にするのではないかと期待をするところです。

リアルタイム性が求められる場面ではFlashモデル + グローバルエンドポイント + ストリーミングの組み合わせが有効で、体感でも実用的なレスポンス速度でした。

TTS機能の導入を検討している方の参考になれば幸いです。

Discussion