왜 음성 녹음 도구를 구축해야 할까요?
만약 당신이 콘텐츠 크리에이터, 팟캐스터, 또는 지루한 반복 작업을 자동화하는 것을 좋아하는 개발자라면, 음성 녹음 도구가 몇 시간의 작업 시간을 절약해 줄 수 있습니다. 모든 내레이션을 수동으로 녹음하는 대신 다음을 할 수 있습니다:
- 텍스트에서 음성 콘텐츠 생성 – 스크립트, 자막 또는 빠른 데모에 완벽합니다.
- 자신의 목소리 복제(Voice Cloning) – 재녹음 없이 브랜드의 일관된 톤을 유지할 수 있습니다.
- 동적 오디오 추가 – 다른 지역, 언어 또는 분위기에 맞춰 내레이션을 즉석에서 변경할 수 있습니다.
좋은 소식은 이 기술이 이미 상용 제품(production-ready)으로 사용될 만큼 성숙했다는 것입니다. 본 포스트에서는 ElevenLabs API를 사용하여 최소한이지만 강력한 음성 녹음 파이프라인을 구축하는 과정을 안내합니다. 끝날 무렵에는 YouTube 스크립트를 가져와 이를 음성으로 변환하고 오디오를 비디오에 다시 합치는(stitch) 스크립트를 갖게 될 것입니다.
전문가 팁: ElevenLabs는 월 50,000자까지 무료 티어를 제공합니다. https://try.elevenlabs.io/kr07zfuqn1bp에서 가입하여 시작하고 더 높은 품질의 모델을 잠금 해제하세요.
1. 영상 스크립트 가져오기 (Grab the Video Transcript)
첫 번째 단계는 원본 텍스트를 얻는 것입니다. YouTube는 API를 통해 자막(caption)을 노출하지만, 빠른 프로토타입을 위한 가장 쉬운 경로는 yt-dlp 명령줄 도구입니다. 이 도구는 스크립트를 간단한 JSON 파일로 다운로드할 수 있습니다.
yt-dlp --skip-download --write-auto-sub --sub-lang en --sub-format json --output "% (title)s.%(ext)s" https://www.youtube.com/watch?v=YOUR_VIDEO_ID
이 명령어는 MyVideo.json과 같은 파일을 생성하며, 이 파일에는 각 항목에 text 필드를 가진 자막 엔트리 배열이 포함되어 있습니다.
import json
with open(
ElevenLabs는 고화질 음성 모델 카탈로그를 제공합니다. 본인의 목소리를 복제하고 싶다면, 짧은(30초) 샘플을 업로드하여 서비스가 맞춤형 모델을 훈련하도록 해야 합니다. 대부분의 프로젝트에는 사전 구축된 “English – Male / Female” 음성이 충분합니다.
VOICE_ID = "21m00Tcm4TlvDq8ikWAM" # 예시: “Rachel”
> **팁:** 사용 가능한 음성 목록은 공식 ElevenLabs 문서를 사용하여 확인하세요: `curl https://api.elevenlabs.io/v1/voices`.
## 3. ElevenLabs로 음성 생성하기
파이프라인의 핵심은 ElevenLabs의 `/v1/text-to-speech/{voice_id}` 엔드포인트로 보내는 간단한 POST 요청입니다. 아래는 인증, 청킹(chunking), 그리고 MP3 데이터를 스트리밍 방식으로 처리하는 Python 래퍼 코드입니다.
import requests
API_KEY = "YOUR_ELEVENLABS_API_KEY"
...
**텍스트 청킹하기 (Chunking the text)**
ElevenLabs는 요청 크기를 5,000자로 제한합니다. 만약 스크립트가 더 길다면, 다음과 같이 분할해야 합니다:
def chunk_text(text, size=5000):
return [text[i:i+size] for i in range(0, len(text), size)]
...
## 4. 오디오를 비디오에 동기화하기 (Sync Audio Back to Video)
MP3 파일을 얻었다면, 이를 원본 비디오 위에 겹쳐 놓을 수 있습니다. `ffmpeg`가 사실상의 표준(de-facto) 도구입니다.
ffmpeg -i original.mp4 -i full_output.mp3 -c:v copy -c:a aac -strict experimental -map 0:v:0 -map 1:a:0 output_with_voice.mp4
- `-c:v copy`: 원본 비디오 스트림을 보존합니다.
- `-c:a aac`: 대부분의 플레이어가 예상하는 형식인 AAC로 오디오를 재인코딩(re-encode)합니다.
- `-map`: 첫 번째 입력에서 비디오를, 두 번째 입력에서 오디오를 유지하도록 보장합니다.
완전한 자동화를 원한다면 이 명령을 Python 스크립트 내에서 실행하세요:
import subprocess
subprocess.run([
...
## 5. 전체 파이프라인 자동화하기 (Automate the Full Pipeline)
모든 것을 합치면, 최소한의 명령줄 도구(command-line tool)가 완성됩니다:
python voice_over.py --video https://www.youtube.com/watch?v=YOUR_VIDEO_ID --voice 21m00Tcm4TlvDq8ikWAM
voice_over.py
import argparse
import json
...
음성 설정(voice settings)을 자유롭게 조정하거나 오류 처리(error handling)를 추가할 수 있습니다. 핵심 아이디어는 다음과 같습니다: 텍스트 가져오기(fetch text) → 오디오 합성(synthesize audio) → 오디오 덮어씌우기(overlay audio).
## 6. 흔한 함정 및 회피 방법 (Common Pitfalls & How to Avoid Them)
| 문제점 (Issue) | 해결책 (Fix) |
| :--- | :--- |
| **API 속도 제한 (API rate limits)** | 생성된 MP3를 로컬에 캐시(Cache)하고, 동일한 스크립트에 대해 재사용합니다. |
| ... |
## 7. 더 나아가기 (Going Beyond)
- **다국어 지원 (Multi‑language support)**: ElevenLabs는 여러 언어의 음성 모델을 제공하므로, `voice_id`만 변경하면 됩니다.
- **동적 콘텐츠 (Dynamic content)**: 사용자가 텍스트를 붙여넣고 즉시 MP3를 다운로드할 수 있는 웹 UI를 구축합니다.
- **음성 복제 (Voice cloning)**: 짧은 음성 샘플을 ElevenLabs의 사용자 지정 모델 엔드포인트(custom model endpoint)에 업로드하고, `voice_id`를 복제된 모델 ID로 대체합니다.
## 행동 유도 (Call to Action)
코딩 즐겁게 하시고, 영상이 보이는 만큼 좋은 소리가 나기를 바랍니다!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19