mcpField
T
text-to-speech

text-to-speech

github.com/connoradsクリエイティブ・メディア1861 回インストール1 日前に更新
リポジトリ

text-to-speech について

ElevenLabs Text-to-Speechは、ElevenLabsでテキストから音声を生成する開発者向けスキルです。多言語モデル、音声設定、ストリーミング出力を扱います。

主な機能

  1. 01多言語の音声生成
  2. 02複数の音声モデル
  3. 03音声特性の調整
  4. 04数字や日付の読み方を制御
  5. 05リクエスト間の音声を接続
  6. 06複数形式での音声ストリーミング

活用シーン

  1. 01長文コンテンツのナレーション作成
  2. 02リアルタイム音声アプリの構築
  3. 03日付や数字の読み方の制御

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/connorads/dotfiles --skill text-to-speech

インストール後、Claude Code で/text-to-speechを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
installation.md
streaming.md
voice-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_v370 以上標準最高品質、幅広い感情表現
eleven_multilingual_v229標準高品質、長尺コンテンツ
eleven_flash_v2_532約 75ms超低レイテンシー、リアルタイム処理
eleven_flash_v2英語約 75ms英語専用、最速
eleven_turbo_v2_532約 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_128MP3 44.1kHz 128kbps(デフォルト)- 圧縮形式、ウェブサイトやアプリに適しています
mp3_44100_192MP3 44.1kHz 192kbps(Creator+)- 高品質の圧縮形式
mp3_44100_64MP3 44.1kHz 64kbps - 低品質、小さいファイル
mp3_22050_32MP3 22.05kHz 32kbps - 最小サイズの MP3 ファイル
pcm_16000Raw PCM 16kHz - リアルタイム処理に使用します
pcm_22050Raw PCM 22.05kHz
pcm_24000Raw PCM 24kHz - ストリーミングに適したバランス
pcm_44100Raw PCM 44.1kHz(Pro+)- CD 品質
pcm_48000Raw PCM 48kHz(Pro+)- 最高品質
ulaw_8000μ-law 8kHz - 電話システム(Twilio、テレフォニー)の標準
alaw_8000A-law 8kHz - テレフォニー(μ-law の代替)
opus_48000_64Opus 48kHz 64kbps - 効率的なストリーミングコーデック
wav_44100WAV 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')}")

参考資料

コメント