mcpField
T
text-to-speech

text-to-speech

github.com/elevenlabs创意与媒体51617.2k 次安装今天更新
代码仓库

关于 text-to-speech

此技能指导开发者使用 ElevenLabs,通过 Python、JavaScript SDK 或 CLI 将文本转换为语音,涵盖语音与模型选择、音频设置、输出格式及流式生成。

主要功能

  1. 01通过 Python、JavaScript 或 CLI 生成语音
  2. 02选择模型、声音和语音设置
  3. 03控制语言及文本规范化
  4. 04应用音频效果
  5. 05流式生成并拼接长请求
  6. 06选择音频输出格式

适用场景

  1. 01为应用添加语音输出
  2. 02使用指定声音生成旁白
  3. 03为交互式体验流式生成语音
  4. 04分多次请求生成长篇音频

安装

复制下面的命令,在终端中运行。

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

安装后在 Claude Code 中输入/text-to-speech确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
installation.md
streaming.md
voice-settings.md

详细介绍

ElevenLabs 文本转语音

将文本转换为自然语音——支持 90 多种语言,并提供多种模型,可在音质与延迟之间权衡。示例默认使用最新且音质最高的模型 eleven_v4。

**在编写任何代码之前进行设置:**如果此项目尚未设置 ELEVENLABS_API_KEY,请先在应用文件夹中运行 npx -y @elevenlabs/cli@latest onboard init,并按照输出的说明操作:它会为用户登录并为项目存储密钥,因此无需任何人手动复制密钥。否则,请参阅安装指南。对于 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_v4"
)

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";
import { Readable } from "stream";

const client = new ElevenLabsClient();
const audio = await client.textToSpeech.convert("JBFqnCBsd6RMkjVDRZzb", {
  text: "Hello, welcome to ElevenLabs!",
  modelId: "eleven_v4",
});
// convert() returns a web ReadableStream — bridge it to a Node stream to write to disk
Readable.fromWeb(audio).pipe(createWriteStream("output.mp3"));
CLI

使用 say 立即播放文本,并使用默认语音和 eleven_v3 模型:

elevenlabs say "Hello!"

当其他命令生成输入内容时,可将文本通过管道传递给 say:

echo "The build finished successfully." | elevenlabs say

需要直接设置请求参数时,请使用 API 命令:

elevenlabs text-to-speech convert --voice-id JBFqnCBsd6RMkjVDRZzb \
  --text "Hello!" --model-id eleven_v4 --output output.mp3

CLI 会自动从环境中读取 ELEVENLABS_API_KEY。

模型

模型 ID语言延迟适用场景
eleven_v490+标准**默认。**音质最高、情感表现丰富、支持音频标签、语音克隆准确度高
eleven_v4_turbo90+~100ms为 Agent 和交互式应用提供实时 v4 音质(通过 文本转对话 WebSocket)
eleven_flash_v2_532~75ms延迟最低、成本最低,支持 stream-input WebSocket
eleven_flash_v2英语~75ms仅支持英语,延迟最低
eleven_multilingual_v229标准上一代模型;生成超长内容时最稳定
eleven_v370+标准上一代富有表现力的模型

eleven_turbo_v2_5 和 eleven_turbo_v2 已被 Flash 模型取代(输出相同,延迟更低)——请改用 eleven_flash_v2_5 / eleven_flash_v2。

**Eleven v4 说明:**仅支持 stability 和 similarity_boost 语音设置(不支持 style 或 speed),不支持 SSML,也不能用于 stream-input TTS WebSocket。可通过 [whispers]、[laughs]、[sarcastic] 等音频标签直接控制语音输出。

语音 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/v3 模型;Eleven v4 不支持)。
  • 语速:语速倍率(v2/v3 模型;Eleven v4 不支持)。
  • 说话人增强:通过后期处理提升清晰度和语音相似度。
from elevenlabs import VoiceSettings

audio = client.text_to_speech.convert(
    text="Customize my voice settings.",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_v4",
    voice_settings=VoiceSettings(
        stability=0.5,          # Lower = more expressive, higher = more consistent
        similarity_boost=0.75,  # Higher = closer to the reference voice
    )
)

语言选择

对于支持强制指定语言的模型,可使用 language_code 指导发音和文本规范化。不支持的语言代码会被忽略,且 eleven_multilingual_v2 不支持 language_code。

audio = client.text_to_speech.convert(
    text="Bonjour, comment allez-vous?",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_v4",
    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",
    model_id="eleven_v4",
    apply_text_normalization="on"
)

音频效果

使用 audio_effects,通过滤镜预设、感知距离、混响环境、循环播放的背景噪声和立体声声像来处理生成的音频。效果不会改变请求费用。

字段范围说明
filter_preset_id目录 ID为声音着色的滤镜,例如 phone 或 old_radio
distance0-1(默认值为 0)说话者听起来距离麦克风有多远
environment_id目录 ID混响环境,例如 small_room 或 hall
send_level0-1(默认值为 1)人声输入混响的程度;设为 0 可关闭混响
background_noise_id目录 ID在人声下循环播放的背景噪声,例如 cafe 或 keyboard
pan-1 至 1(默认值为 0)人声的立体声位置,从最左到最右

通过目录端点(GET /v1/audio-effects/catalog)列出有效的滤镜预设、环境和背景噪声 ID:

from elevenlabs import EffectsSpecInput

catalog = client.audio_effects.get_catalog()
for environment in catalog.environments:
    print(f"{environment.environment_id}: {environment.name}")

audio = client.text_to_speech.convert(
    text="Welcome to the concert hall.",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_v4",
    audio_effects=EffectsSpecInput(
        environment_id="hall",
        distance=0.3,
        pan=-0.5,
    )
)

混响和非零的 pan 会生成立体声音频,因此不支持 ulaw_*、alaw_* 和 pcm_* 输出格式。未知的效果 ID 会返回 404 错误。

请求拼接

分多次请求生成长音频时,音频片段的边界处可能会出现爆音、不自然的停顿或音调变化。请求拼接可让每个请求了解其前后内容,从而解决此问题:

# First request
audio1 = client.text_to_speech.convert(
    text="This is the first part.",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_v4",
    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",
    model_id="eleven_v4",
    previous_text="This is the first part."
)

输出格式

格式说明
mp3_44100_128MP3 44.1kHz 128kbps(默认值)——压缩格式,适用于 Web/应用
mp3_44100_192MP3 44.1kHz 192kbps(Creator+)——更高音质的压缩格式
mp3_44100_64MP3 44.1kHz 64kbps——音质较低,文件更小
mp3_22050_32MP3 22.05kHz 32kbps——体积最小的 MP3 文件
pcm_16000原始 PCM 16kHz——用于实时处理
pcm_22050原始 PCM 22.05kHz
pcm_24000原始 PCM 24kHz——适合流式传输,音质和效率均衡
pcm_44100原始 PCM 44.1kHz(Pro+)——CD 音质
pcm_48000原始 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_v4"
)

for chunk in audio_stream:
    play_audio(chunk)

对于延迟最为重要的实时应用,可通过 Text to Dialogue WebSocket 使用 eleven_v4_turbo(约 100ms),或通过 HTTP 流式传输或 stream-input WebSocket 使用 eleven_flash_v2_5(约 75ms)。请参阅 references/streaming.md。

错误处理

try:
    audio = client.text_to_speech.convert(
        text="Generate speech",
        voice_id="invalid-voice-id",
        model_id="eleven_v4"
    )
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_v4"
)
audio = response.parse()
print(f"Characters used: {response.headers.get('x-character-count')}")

参考资料

评论

支持 Markdown