文本转语音 #

概述 #

文本转语音(Text-to-Speech,TTS)是 ElevenLabs 的核心功能,能够将文本转换为高质量、自然的语音输出。

text
┌─────────────────────────────────────────────────────────────┐
│                    TTS 工作流程                              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   文本输入 ───> 文本处理 ───> 模型推理 ───> 音频输出        │
│                                                             │
│   ┌─────────┐   ┌─────────┐   ┌─────────┐   ┌─────────┐   │
│   │ "你好"  │ → │ 分词处理 │ → │ 神经网络 │ → │ MP3/WAV │   │
│   └─────────┘   └─────────┘   └─────────┘   └─────────┘   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

模型选择 #

可用模型 #

text
┌─────────────────────────────────────────────────────────────┐
│                    ElevenLabs 模型                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  eleven_multilingual_v2                                     │
│  ├── 支持 29+ 语言                                          │
│  ├── 最高质量的输出                                         │
│  ├── 推荐用于多语言场景                                      │
│  └── 延迟:~500ms                                           │
│                                                             │
│  eleven_turbo_v2_5                                          │
│  ├── 支持 32 种语言                                          │
│  ├── 超低延迟                                               │
│  ├── 推荐用于实时对话                                        │
│  └── 延迟:< 300ms                                          │
│                                                             │
│  eleven_monolingual_v1                                      │
│  ├── 仅英语                                                 │
│  ├── 最高质量的英语输出                                      │
│  └── 延迟:~500ms                                           │
│                                                             │
│  eleven_turbo_v2                                            │
│  ├── 仅英语                                                 │
│  ├── 低延迟英语                                             │
│  └── 延迟:< 300ms                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

模型选择指南 #

text
选择建议:
┌─────────────────────────────────────────────────────────────┐
│                                                             │
│  多语言内容:                                                │
│  └── eleven_multilingual_v2                                 │
│                                                             │
│  实时对话:                                                  │
│  └── eleven_turbo_v2_5                                      │
│                                                             │
│  高质量英语:                                                │
│  └── eleven_monolingual_v1                                  │
│                                                             │
│  快速英语响应:                                              │
│  └── eleven_turbo_v2                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

基础用法 #

简单请求 #

python
from elevenlabs import ElevenLabs

client = ElevenLabs(api_key="your_api_key")

audio = client.text_to_speech.convert(
    text="Hello, this is a test.",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_multilingual_v2"
)

with open("output.mp3", "wb") as f:
    for chunk in audio:
        f.write(chunk)

REST API 调用 #

bash
curl -X POST "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}" \
  -H "xi-api-key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello, this is a test.",
    "model_id": "eleven_multilingual_v2"
  }' \
  --output output.mp3

语音设置 #

参数详解 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Voice Settings                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  stability (稳定性):0.0 - 1.0                               │
│  ├── 0.0-0.3:高表现力,可能不稳定                           │
│  ├── 0.4-0.6:平衡(推荐)                                   │
│  └── 0.7-1.0:稳定,但可能缺乏变化                           │
│                                                             │
│  similarity_boost (相似度增强):0.0 - 1.0                    │
│  ├── 0.0-0.5:自然但可能偏离原声                             │
│  ├── 0.6-0.8:平衡(推荐)                                   │
│  └── 0.9-1.0:高度相似,可能影响自然度                       │
│                                                             │
│  style (风格):0.0 - 1.0                                     │
│  ├── 0.0:无额外风格                                        │
│  ├── 0.3-0.5:适度表现力(推荐)                             │
│  └── 0.6-1.0:强烈风格,可能不稳定                           │
│                                                             │
│  use_speaker_boost (说话者增强):boolean                    │
│  ├── true:增强相似度,增加延迟                              │
│  └── false:标准模式                                        │
│                                                             │
└─────────────────────────────────────────────────────────────┘

设置示例 #

python
audio = client.text_to_speech.convert(
    text="这是一段带有情感的文本。",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_multilingual_v2",
    voice_settings={
        "stability": 0.35,
        "similarity_boost": 0.75,
        "style": 0.4,
        "use_speaker_boost": True
    }
)

不同场景的推荐设置 #

text
┌─────────────────────────────────────────────────────────────┐
│                    场景化设置                                │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  有声读物/播客:                                             │
│  {                                                          │
│    "stability": 0.5,                                        │
│    "similarity_boost": 0.75,                                │
│    "style": 0.3                                             │
│  }                                                          │
│                                                             │
│  新闻播报:                                                  │
│  {                                                          │
│    "stability": 0.7,                                        │
│    "similarity_boost": 0.8,                                 │
│    "style": 0.1                                             │
│  }                                                          │
│                                                             │
│  角色配音:                                                  │
│  {                                                          │
│    "stability": 0.3,                                        │
│    "similarity_boost": 0.7,                                 │
│    "style": 0.6                                             │
│  }                                                          │
│                                                             │
│  客服语音:                                                  │
│  {                                                          │
│    "stability": 0.6,                                        │
│    "similarity_boost": 0.75,                                │
│    "style": 0.2                                             │
│  }                                                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

输出格式 #

支持的格式 #

text
┌─────────────────────────────────────────────────────────────┐
│                    输出格式                                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  MP3 格式:                                                  │
│  ├── mp3_22050_32 - 22.05kHz, 32kbps                       │
│  ├── mp3_44100_64 - 44.1kHz, 64kbps                        │
│  ├── mp3_44100_96 - 44.1kHz, 96kbps                        │
│  ├── mp3_44100_128 - 44.1kHz, 128kbps(推荐)              │
│  └── mp3_44100_192 - 44.1kHz, 192kbps                      │
│                                                             │
│  PCM 格式:                                                  │
│  ├── pcm_16000 - 16kHz, 16-bit                              │
│  ├── pcm_22050 - 22.05kHz, 16-bit                           │
│  ├── pcm_24000 - 24kHz, 16-bit                              │
│  └── pcm_44100 - 44.1kHz, 16-bit                            │
│                                                             │
│  其他格式:                                                  │
│  ├── ulaw_8000 - 8kHz μ-law                                 │
│  ├── alaw_8000 - 8kHz A-law                                 │
│  └── ogg_opus - Opus 编码                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

格式选择 #

python
# 高质量 MP3(推荐用于内容创作)
audio = client.text_to_speech.convert(
    text="Hello",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_multilingual_v2",
    output_format="mp3_44100_192"
)

# 低延迟 PCM(推荐用于实时应用)
audio = client.text_to_speech.convert(
    text="Hello",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_turbo_v2_5",
    output_format="pcm_16000"
)

# 电话系统
audio = client.text_to_speech.convert(
    text="Hello",
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_multilingual_v2",
    output_format="ulaw_8000"
)

流式处理 #

流式输出 #

python
# 流式生成,适合长文本
audio_stream = client.text_to_speech.convert_as_stream(
    text="这是一段很长的文本内容..." * 50,
    voice_id="JBFqnCBsd6RMkjVDRZzb",
    model_id="eleven_multilingual_v2"
)

with open("output_stream.mp3", "wb") as f:
    for chunk in audio_stream:
        f.write(chunk)
        print(f"已接收 {len(chunk)} 字节")

流式处理优势 #

text
┌─────────────────────────────────────────────────────────────┐
│                    流式 vs 非流式                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  非流式:                                                    │
│  ├── 等待完整生成                                           │
│  ├── 内存占用高                                             │
│  └── 适合短文本                                             │
│                                                             │
│  流式:                                                      │
│  ├── 边生成边接收                                           │
│  ├── 内存占用低                                             │
│  ├── 首字节延迟低                                           │
│  └── 适合长文本和实时应用                                    │
│                                                             │
└─────────────────────────────────────────────────────────────┘

文本处理 #

SSML 支持 #

python
# 暂停控制
text = "第一句话。<break time='1.5s'/> 第二句话。"

# 语速控制
text = "<speak>正常语速 <prosody rate='slow'>慢速</prosody></speak>"

# 强调
text = "<speak>这是<emphasis>重要</emphasis>的内容</speak>"

文本预处理 #

text
┌─────────────────────────────────────────────────────────────┐
│                    文本预处理建议                            │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  数字处理:                                                  │
│  ├── "123" → "一百二十三"(中文)                           │
│  └── "123" → "one hundred twenty-three"(英文)            │
│                                                             │
│  缩写展开:                                                  │
│  ├── "Dr." → "Doctor"                                      │
│  └── "Mr." → "Mister"                                      │
│                                                             │
│  标点处理:                                                  │
│  ├── 适当使用逗号增加停顿                                   │
│  └── 句号自动产生较长停顿                                   │
│                                                             │
│  特殊字符:                                                  │
│  ├── URL 需要特殊处理                                       │
│  └── 代码片段建议跳过                                       │
│                                                             │
└─────────────────────────────────────────────────────────────┘

长文本处理 #

分段处理 #

python
def process_long_text(client, text, voice_id, max_length=5000):
    words = text.split()
    chunks = []
    current_chunk = []
    current_length = 0
    
    for word in words:
        if current_length + len(word) > max_length:
            chunks.append(" ".join(current_chunk))
            current_chunk = [word]
            current_length = len(word)
        else:
            current_chunk.append(word)
            current_length += len(word) + 1
    
    if current_chunk:
        chunks.append(" ".join(current_chunk))
    
    audio_parts = []
    for chunk in chunks:
        audio = client.text_to_speech.convert(
            text=chunk,
            voice_id=voice_id,
            model_id="eleven_multilingual_v2"
        )
        audio_parts.append(b"".join(audio))
    
    return b"".join(audio_parts)

合并音频 #

python
from pydub import AudioSegment

def merge_audio_files(files, output_path):
    combined = AudioSegment.empty()
    for file in files:
        audio = AudioSegment.from_mp3(file)
        combined += audio
    combined.export(output_path, format="mp3")

语言支持 #

多语言示例 #

python
texts = {
    "中文": "你好,欢迎使用语音服务。",
    "English": "Hello, welcome to the voice service.",
    "日本語": "こんにちは、音声サービスへようこそ。",
    "한국어": "안녕하세요, 음성 서비스에 오신 것을 환영합니다.",
    "Français": "Bonjour, bienvenue dans le service vocal.",
    "Deutsch": "Hallo, willkommen beim Sprachservice.",
    "Español": "Hola, bienvenido al servicio de voz."
}

for lang, text in texts.items():
    audio = client.text_to_speech.convert(
        text=text,
        voice_id="JBFqnCBsd6RMkjVDRZzb",
        model_id="eleven_multilingual_v2"
    )
    
    with open(f"output_{lang}.mp3", "wb") as f:
        for chunk in audio:
            f.write(chunk)

性能优化 #

缓存策略 #

python
import hashlib

def get_cached_or_generate(client, text, voice_id, cache_dir="cache"):
    text_hash = hashlib.md5(f"{text}{voice_id}".encode()).hexdigest()
    cache_path = f"{cache_dir}/{text_hash}.mp3"
    
    if os.path.exists(cache_path):
        return cache_path
    
    audio = client.text_to_speech.convert(
        text=text,
        voice_id=voice_id,
        model_id="eleven_multilingual_v2"
    )
    
    with open(cache_path, "wb") as f:
        for chunk in audio:
            f.write(chunk)
    
    return cache_path

并发请求 #

python
import asyncio
from elevenlabs import AsyncElevenLabs

async def generate_multiple(client, texts, voice_id):
    tasks = []
    for text in texts:
        task = client.text_to_speech.convert(
            text=text,
            voice_id=voice_id,
            model_id="eleven_multilingual_v2"
        )
        tasks.append(task)
    
    return await asyncio.gather(*tasks)

下一步 #

最后更新:2026-04-05