文本转语音 #
概述 #
文本转语音(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