text-to-speech について
ElevenLabs Text-to-Speechは、ElevenLabsでテキストから音声を生成する開発者向けスキルです。多言語モデル、音声設定、ストリーミング出力を扱います。
主な機能
- 01多言語の音声生成
- 02複数の音声モデル
- 03音声特性の調整
- 04数字や日付の読み方を制御
- 05リクエスト間の音声を接続
- 06複数形式での音声ストリーミング
活用シーン
- 01長文コンテンツのナレーション作成
- 02リアルタイム音声アプリの構築
- 03日付や数字の読み方の制御
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ connorads/ dotfiles --skill text-to-speechインストール後、Claude Code で/text-to-speechを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/installation.mdstreaming.mdvoice-settings.md詳細
ElevenLabs Text-to-Speech
テキストから自然な音声を生成します。70 以上の言語に対応し、品質とレイテンシーのトレードオフに応じて複数のモデルを利用できます。
セットアップ: インストールガイドを参照してください。JavaScript では、
@elevenlabs/*パッケージのみを使用してください。
クイックスタート
Python
from elevenlabs import ElevenLabs
client = ElevenLabs()
audio = client.text_to_speech.convert(
text="Hello, welcome to ElevenLabs!",
voice_id="JBFqnCBsd6RMkjVDRZzb", # George
model_id="eleven_multilingual_v2"
)
with open("output.mp3", "wb") as f:
for chunk in audio:
f.write(chunk)
JavaScript
import { ElevenLabsClient } from "@elevenlabs/elevenlabs-js";
import { createWriteStream } from "fs";
const client = new ElevenLabsClient();
const audio = await client.textToSpeech.convert("JBFqnCBsd6RMkjVDRZzb", {
text: "Hello, welcome to ElevenLabs!",
modelId: "eleven_multilingual_v2",
});
audio.pipe(createWriteStream("output.mp3"));
cURL
curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/JBFqnCBsd6RMkjVDRZzb" \
-H "xi-api-key: $ELEVENLABS_API_KEY" -H "Content-Type: application/json" \
-d '{"text": "Hello!", "model_id": "eleven_multilingual_v2"}' --output output.mp3
モデル
| モデル ID | 言語 | レイテンシー | 最適な用途 |
|---|---|---|---|
eleven_v3 | 70 以上 | 標準 | 最高品質、幅広い感情表現 |
eleven_multilingual_v2 | 29 | 標準 | 高品質、長尺コンテンツ |
eleven_flash_v2_5 | 32 | 約 75ms | 超低レイテンシー、リアルタイム処理 |
eleven_flash_v2 | 英語 | 約 75ms | 英語専用、最速 |
eleven_turbo_v2_5 | 32 | 約 250~300ms | 品質と速度のバランス |
eleven_turbo_v2 | 英語 | 約 250~300ms | 英語専用、バランス重視 |
音声 ID
既成の音声を使うか、ダッシュボードでカスタム音声を作成してください。
人気の音声:
JBFqnCBsd6RMkjVDRZzb- George(男性、ナレーション)EXAVITQu4vr4xnSDxMaL- Sarah(女性、柔らかな声)onwK4e9ZLuTAKqWW03F9- Daniel(男性、威厳のある声)XB0fDUnXU5powFXDhCwa- Charlotte(女性、会話調)
voices = client.voices.get_all()
for voice in voices.voices:
print(f"{voice.voice_id}: {voice.name}")
音声設定
音声の特徴を細かく調整できます。
- 安定性:音声の一貫性を設定します。値を小さくすると感情表現や変化が豊かになりますが、不安定に聞こえる場合があります。値を大きくすると、安定した予測しやすい話し方になります。
- 類似度ブースト:元の音声サンプルへの類似度を調整します。値を大きくすると元の音声に近づきますが、音声のアーティファクトが強調される場合があります。
- スタイル:音声固有のスタイル特性を強調します(v2 以降のモデルでのみ動作します)。
- 話者ブースト:明瞭さと音声の類似度を高める後処理です。
from elevenlabs import VoiceSettings
audio = client.text_to_speech.convert(
text="Customize my voice settings.",
voice_id="JBFqnCBsd6RMkjVDRZzb",
voice_settings=VoiceSettings(
stability=0.5,
similarity_boost=0.75,
style=0.5,
speed=1.0, # 0.25 to 4.0 (default 1.0)
use_speaker_boost=True
)
)
言語の指定
発音に使用する言語を指定します。
audio = client.text_to_speech.convert(
text="Bonjour, comment allez-vous?",
voice_id="JBFqnCBsd6RMkjVDRZzb",
model_id="eleven_multilingual_v2",
language_code="fr" # ISO 639-1 code
)
テキストの正規化
数字、日付、略語を読み上げる言葉に変換する方法を制御します。たとえば、「01/15/2026」は「January fifteenth, twenty twenty-six」になります。
"auto"(デフォルト):モデルが文脈に基づいて判断します"on":常に正規化します(自然な音声にしたい場合に使用します)"off":表記どおりに読み上げます(「zero one slash one five...」のように読み上げたい場合に使用します)
audio = client.text_to_speech.convert(
text="Call 1-800-555-0123 on 01/15/2026",
voice_id="JBFqnCBsd6RMkjVDRZzb",
apply_text_normalization="on"
)
リクエストのつなぎ合わせ
複数のリクエストで長い音声を生成すると、音声の境目にクリック音、不自然な間、またはトーンの変化が生じる場合があります。リクエストのつなぎ合わせを使うと、各リクエストに前後の内容を知らせることで、この問題を解決できます。
# First request
audio1 = client.text_to_speech.convert(
text="This is the first part.",
voice_id="JBFqnCBsd6RMkjVDRZzb",
next_text="And this continues the story."
)
# Second request using previous context
audio2 = client.text_to_speech.convert(
text="And this continues the story.",
voice_id="JBFqnCBsd6RMkjVDRZzb",
previous_text="This is the first part."
)
出力形式
| 形式 | 説明 |
|---|---|
mp3_44100_128 | MP3 44.1kHz 128kbps(デフォルト)- 圧縮形式、ウェブサイトやアプリに適しています |
mp3_44100_192 | MP3 44.1kHz 192kbps(Creator+)- 高品質の圧縮形式 |
mp3_44100_64 | MP3 44.1kHz 64kbps - 低品質、小さいファイル |
mp3_22050_32 | MP3 22.05kHz 32kbps - 最小サイズの MP3 ファイル |
pcm_16000 | Raw PCM 16kHz - リアルタイム処理に使用します |
pcm_22050 | Raw PCM 22.05kHz |
pcm_24000 | Raw PCM 24kHz - ストリーミングに適したバランス |
pcm_44100 | Raw PCM 44.1kHz(Pro+)- CD 品質 |
pcm_48000 | Raw PCM 48kHz(Pro+)- 最高品質 |
ulaw_8000 | μ-law 8kHz - 電話システム(Twilio、テレフォニー)の標準 |
alaw_8000 | A-law 8kHz - テレフォニー(μ-law の代替) |
opus_48000_64 | Opus 48kHz 64kbps - 効率的なストリーミングコーデック |
wav_44100 | WAV 44.1kHz - ヘッダー付きの非圧縮形式 |
ストリーミング
リアルタイムアプリケーションでは、stream メソッドを使用してください(生成と同時に音声チャンクを返します)。
audio_stream = client.text_to_speech.stream(
text="This text will be streamed as audio.",
voice_id="JBFqnCBsd6RMkjVDRZzb",
model_id="eleven_flash_v2_5" # Ultra-low latency
)
for chunk in audio_stream:
play_audio(chunk)
WebSocket ストリーミングについては、references/streaming.mdを参照してください。
エラー処理
try:
audio = client.text_to_speech.convert(
text="Generate speech",
voice_id="invalid-voice-id"
)
except Exception as e:
print(f"API error: {e}")
一般的なエラー:
- 401:API キーが無効です
- 422:パラメーターが無効です(voice_id、model_id を確認してください)
- 429:レート制限を超過しました
コストの追跡
レスポンスヘッダー(x-character-count、request-id)を使って文字数の使用状況を確認できます。
response = client.text_to_speech.convert.with_raw_response(
text="Hello!", voice_id="JBFqnCBsd6RMkjVDRZzb", model_id="eleven_multilingual_v2"
)
audio = response.parse()
print(f"Characters used: {response.headers.get('x-character-count')}")