ElevenLabs TTS 오디오북 제작 완벽 가이드: 장편 콘텐츠 청킹, 음성 일관성, SSML 프로소디 튜닝 및 배치 생성 워크플로우
ElevenLabs TTS로 전문 오디오북 제작하기
ElevenLabs는 현존하는 가장 자연스러운 AI 음성 합성 엔진 중 하나입니다. 특히 오디오북처럼 장편 콘텐츠를 다룰 때는 체계적인 워크플로우가 필수적입니다. 이 가이드에서는 장편 텍스트 청킹, 챕터 간 음성 일관성 유지, SSML 프로소디 미세 조정, 그리고 Projects API를 활용한 배치 생성까지 실전 베스트 프랙티스를 다룹니다.
1단계: 환경 설정 및 설치
먼저 ElevenLabs Python SDK를 설치하고 API 키를 구성합니다.
# Python SDK 설치
pip install elevenlabs
환경 변수 설정 (Linux/Mac)
export ELEVEN_API_KEY=“YOUR_API_KEY”
Windows PowerShell
$env:ELEVEN_API_KEY=“YOUR_API_KEY”
기본 연결 테스트를 수행합니다.
from elevenlabs.client import ElevenLabs
client = ElevenLabs(api_key=“YOUR_API_KEY”)
사용 가능한 음성 목록 확인
voices = client.voices.get_all()
for voice in voices.voices:
print(f”{voice.name} - {voice.voice_id}“)
2단계: 장편 콘텐츠 청킹 전략
ElevenLabs API는 한 번의 요청당 텍스트 길이에 제한이 있습니다. 오디오북처럼 수만 자에 달하는 텍스트는 반드시 적절한 단위로 분할해야 합니다.
청킹 핵심 원칙
- 문단 단위 분할: 문장 중간이 아닌 문단 경계에서 분할하여 자연스러운 억양을 유지합니다.- 청크 크기: 청크당 2,500~4,000자를 권장합니다. 너무 짧으면 음성 연결이 부자연스럽고, 너무 길면 API 오류가 발생합니다.- 챕터 경계 존중: 챕터가 바뀔 때는 반드시 새로운 청크로 분리합니다.
import re
def chunk_text(text, max_chars=3500):
paragraphs = text.split(‘\n\n’)
chunks = []
current_chunk = ""
for para in paragraphs:
if len(current_chunk) + len(para) + 2 > max_chars:
if current_chunk:
chunks.append(current_chunk.strip())
current_chunk = para
else:
current_chunk += '\n\n' + para
if current_chunk.strip():
chunks.append(current_chunk.strip())
return chunks
챕터별로 텍스트 분리
def split_by_chapters(text):
chapters = re.split(r’(제\s*\d+\s장[^\n])’, text)
result = {}
for i in range(1, len(chapters), 2):
title = chapters[i].strip()
body = chapters[i+1].strip() if i+1 < len(chapters) else ""
result[title] = chunk_text(body)
return result
3단계: 챕터 간 음성 일관성 유지
오디오북에서 가장 중요한 요소 중 하나는 전체 챕터에 걸친 음성의 일관성입니다.
일관성 확보 체크리스트
- 동일 voice_id 사용: 모든 챕터에서 반드시 같은 voice_id를 사용합니다.- 고정 voice_settings: stability, similarity_boost, style 값을 모든 요청에 동일하게 적용합니다.- 모델 고정:
eleven_multilingual_v2등 동일한 모델을 전체에 적용합니다.VOICE_CONFIG = { “voice_id”: “YOUR_VOICE_ID”, “model_id”: “eleven_multilingual_v2”, “voice_settings”: { “stability”: 0.71, “similarity_boost”: 0.80, “style”: 0.35, “use_speaker_boost”: True } }
def generate_audio(text, config=VOICE_CONFIG):
audio = client.text_to_speech.convert(
voice_id=config[“voice_id”],
model_id=config[“model_id”],
text=text,
voice_settings=config[“voice_settings”]
)
return audio
| 파라미터 | 권장 값 | 설명 |
|---|---|---|
| stability | 0.65 | 낮을수록 감정 표현이 풍부하나, 너무 낮으면 일관성 저하 |
| similarity_boost | 0.750.85 | 원본 음성과의 유사도. 높을수록 충실하지만 아티팩트 가능 |
| style | 0.20~0.45 | 표현력 조절. 소설은 0.35 이상, 논픽션은 0.20 이하 권장 |
4단계: SSML 태그로 프로소디 미세 조정
ElevenLabs는 일부 SSML 유사 태그와 자체 마크업을 지원하여 발화 속도, 일시 정지, 강조 등을 제어할 수 있습니다.
# 긴 일시 정지 삽입 (챕터 전환부)
text_with_pause = "첫 번째 장이 끝났습니다.
발음 가이드
text_pronunciation = ‘그는 Seoul 로 향했다.‘
실전 예시: 대화문과 나레이션 구분
narration = """그녀는 조용히 문을 열었다.
SSML 활용 팁
: 문단 전환이나 장면 전환에 1~2초 정지를 삽입합니다.- 말줄임표(…)나 대시(—)를 활용하면 SSML 없이도 자연스러운 일시 정지를 유도할 수 있습니다.- 대화문 앞뒤에 짧은 정지를 넣어 나레이션과 구분감을 줍니다.
5단계: Projects API로 배치 생성 워크플로우 구축
ElevenLabs의 Projects API는 오디오북 전체를 하나의 프로젝트로 관리할 수 있게 해줍니다.
# 프로젝트 생성
project = client.projects.add(
name="나의 오디오북 - 1권",
default_title_voice_id="YOUR_VOICE_ID",
default_paragraph_voice_id="YOUR_VOICE_ID",
default_model_id="eleven_multilingual_v2"
)
project_id = project.project_id
print(f"프로젝트 생성 완료: {project_id}")
챕터 추가
for chapter_title, chunks in split_by_chapters(full_text).items():
full_chapter_text = ‘\n\n’.join(chunks)
chapter = client.projects.add_chapter(
project_id=project_id,
name=chapter_title,
content=full_chapter_text
)
print(f”챕터 추가: {chapter_title}“)
전체 프로젝트 오디오 변환 시작
convert = client.projects.convert(project_id=project_id)
print(“오디오 변환이 시작되었습니다. 완료까지 수 분이 소요될 수 있습니다.”)
배치 처리 스크립트 (CLI 활용)
# cURL로 프로젝트 상태 확인
curl -X GET "https://api.elevenlabs.io/v1/projects/YOUR_PROJECT_ID" \
-H "xi-api-key: YOUR_API_KEY"
# 완성된 오디오 스냅샷 다운로드
curl -X GET "https://api.elevenlabs.io/v1/projects/YOUR_PROJECT_ID/snapshots" \
-H "xi-api-key: YOUR_API_KEY"
Pro Tips: 파워 유저를 위한 고급 팁
- 이전 텍스트 컨텍스트 활용:
previous_text파라미터에 직전 청크의 마지막 2~3문장을 전달하면 청크 간 음성 연결이 매끄러워집니다.- 음성 복제 최적화: Professional Voice Clone을 사용할 경우 최소 30분 이상의 깨끗한 녹음 샘플을 제공하세요.- 출력 포맷: 오디오북 배포용으로는mp3_44100_192을 사용하고, 후반 편집이 필요하면pcm_44100을 선택하세요.- 비용 최적화: Turbo v2 모델은 속도가 빠르지만 품질이 다소 떨어질 수 있으므로, 최종 렌더링에는eleven_multilingual_v2를 사용하세요.- 병렬 처리:asyncio와 함께 비동기 요청을 사용하면 대량 청크 처리 시간을 크게 단축할 수 있습니다.
Troubleshooting: 자주 발생하는 오류와 해결법
| 오류 | 원인 | 해결 방법 |
|---|---|---|
422 Unprocessable Entity | 텍스트가 너무 길거나 잘못된 문자 포함 | 청크 크기를 3,500자 이하로 줄이고 특수 문자를 제거합니다 |
429 Rate Limit Exceeded | 짧은 시간에 너무 많은 요청 | 요청 간 1~2초 딜레이를 추가하거나 배치 크기를 줄입니다 |
| 챕터 간 음색 차이 | voice_settings가 요청마다 다름 | VOICE_CONFIG 딕셔너리를 전역으로 고정하여 모든 요청에 동일하게 적용합니다 |
| 오디오 끝부분이 잘림 | 텍스트 끝에 구두점 누락 | 모든 청크의 마지막 문장에 마침표를 반드시 포함시킵니다 |
401 Unauthorized | API 키 오류 또는 만료 | API 키를 재확인하고, 환경 변수가 올바르게 설정되었는지 점검합니다 |
Q1: ElevenLabs로 한국어 오디오북을 만들 때 어떤 모델을 사용해야 하나요?
한국어 오디오북에는 eleven_multilingual_v2 모델을 사용하세요. 이 모델은 한국어를 포함한 29개 이상의 언어를 지원하며, 자연스러운 억양과 발음을 제공합니다. Turbo 모델은 속도가 빠르지만 다국어 품질이 상대적으로 낮을 수 있으므로 최종 출력에는 multilingual v2를 권장합니다.
Q2: 10만 자 이상의 장편 소설을 변환할 때 비용을 절약하는 방법이 있나요?
먼저 짧은 샘플 텍스트(500자 내외)로 voice_settings를 충분히 테스트한 후 본 작업에 들어가세요. Projects API를 사용하면 프로젝트 단위로 관리되어 재생성 시 전체를 다시 처리하지 않아도 됩니다. 또한 Scale 플랜 이상에서는 문자당 비용이 크게 낮아지므로, 대량 작업 전 플랜 업그레이드를 고려하세요.
Q3: 여러 등장인물의 대화를 다른 음성으로 표현할 수 있나요?
네, Projects API에서 챕터 내 각 문단에 다른 voice_id를 지정할 수 있습니다. 나레이션용 음성과 등장인물별 음성을 미리 설정하고, 대화문 태그에 따라 자동으로 음성을 전환하는 스크립트를 구성하면 됩니다. 다만 음성 전환이 잦으면 청취 경험이 산만해질 수 있으므로, 주요 등장인물 2~3명으로 제한하는 것을 권장합니다.