자연스러운 음성은(는) 무엇을 하나요?
대부분의 '로봇 같은' ElevenLabs 음성 해설은 목소리 문제가 아니라 스크립트 문제입니다. 모델은 주어진 내용을 그대로 읽으며, 눈을 위해 작성된 스크립트(제목, 마침표로 끝나는 조각, 숫자, 대시)는 어떤 목소리가 읽더라도 끊기게 나옵니다.
이 폴더에 있는 세 가지 도구는 실제로 실행됩니다. 텍스트를 읽고 판단하지 말고 사용해보세요.
python3 speakable.py script.txt # 귀에 맞게 작성되었나요?
python3 takes.py script.txt --voice VOICE_ID # 시드 기반 테이크 (유료, 먼저 물어봄)
python3 gaps.py takes/ # 문장 중간 공백으로 테이크 순위 매기기
세 도구 모두 패키지 없이 Python 3.9+로 동작합니다. gaps.py는 PATH에 ffmpeg가 있으면 오디오 자체를 확인하여 공백을 검증합니다.
루프
1. 변경 전에 진단하세요. 이미 테이크가 있다면 gaps.py를 실행하세요. 문장 내부에서 0.2초 이상의 공백(쉼표나 마침표 뒤가 아닌)이 사람들이 'AI'라고 듣는 것입니다. 저희 이전 테이크에서는 'run' 앞에 0.3초, 'Instagram' 앞에 0.3초 공백이 있었는데, 이는 후크 중간에 있었습니다. 편집 과정에서 발생한 것이 아닙니다. 공백은 원시 파일에 있었습니다.
2. 귀에 맞게 다시 쓰세요. speakable.py를 실행하고 모든 플래그를 수정하세요. 규칙:
- 문장, 제목 아님. "13 free Claude skills now run your Instagram."은 제목입니다. "Thirteen free Claude skills run your whole Instagram."은 사람이 말하는 방식입니다.
- 목록은 쉼표, 마침표 아님. "Reels. Captions. Carousels."는 모델이 세 번 멈추게 합니다. "reels, captions, carousels, stories"는 흐릅니다.
- 숫자는 글자로 말하는 줄에서: "eighty-four out of a hundred", "84 out of 100"이 아닙니다. 화면 텍스트는 숫자를 유지할 수 있습니다.
- 축약형 (you've, it's, we'll). 아무도 큰 소리로 "you have"라고 말하지 않습니다.
- 조각을 연결하세요 "so", "and", "then"으로. 연결어는 모델이 계속 진행하라는 신호입니다.
- 대시 없음. ElevenLabs는 대시를 짧은 멈춤으로 취급하며 "덜 일관적"이라고 말합니다. 계속 진행하려면 쉼표를 사용하거나, 비트를 위해 줄임표를 사용하세요.
- SSML 없음.
<break time="1s"/>는 Eleven v4 또는 v3에서 지원되지 않습니다.
3. 연출하세요. Eleven v4는 대괄호 안에 오디오 태그를 사용합니다. 비트 시작 부분에 하나의 태그를 넣고, 모든 줄에 넣지 마세요. 태그가 해당 줄의 내용과 일치하는지 확인하세요. 전체 목록은 tags.md를 참조하세요. speakable.py는 알 수 없는 태그를 플래그로 표시합니다. 알 수 없는 태그는 음향 효과로 읽힐 수 있기 때문입니다.
[excited] Thirteen free Claude skills run your whole Instagram.
[mischievously] So we let it write this Reel...
문장 부호도 연출입니다. 줄임표는 무게감 있는 멈춤을, 느낌표는 에너지를, 대문자는 강조를 추가합니다(한 번만, 중요한 단어에 사용하세요).
4. 설정. eleven_v4에서:
| 설정 | 사용값 | 이유 |
|---|---|---|
| stability | 0.30 ~ 0.40 | 낮을수록 '더 넓은 감정 범위' 제공; 기본 0.5는 더 평평함. 0.3 미만은 테이크가 흔들릴 수 있음. |
| similarity_boost | 0.75 | 기본값; 목소리 자체 유지 |
| style | 0 | 기본값; 다른 값은 지연 시간 추가 |
| speed | 1.0 ~ 1.08 | 허용 범위는 0.7~1.2; 소셜 음성 해설은 1 약간 위 |
5. 같은 텍스트, 다른 시드로 세 개의 테이크. 하나의 테이크는 동전 던지기입니다. takes.py를 시드 1, 2, 3으로 실행한 다음 gaps.py로 순위를 매기세요. 상위 두 개를 듣고 귀로 선택하세요. 시드를 보관하세요: 다시 실행했을 때 동일한 테이크에 가깝게 만듭니다(ElevenLabs는 '최선 노력'이라고 하며 보장되지 않습니다).
6. 부드럽게 편집하세요. 편집기가 무음을 자르는 경우, 문장 뒤에는 약 1초, 쉼표 뒤에는 대부분 1초를 유지하세요. 매번 동일한 짧은 길이로 잘린 멈춤은 기계처럼 들리는 또 다른 요소입니다.
7. 여전히 생성된 것처럼 들리나요? 더 이상 설정을 돌리지 마세요. 휴대폰에 해당 줄을 녹음하고 ElevenLabs의 Voice Changer(음성-음성)를 통해 원하는 목소리로 변환하세요. 당신의 타이밍, 강조, 감정이 그대로 전달됩니다. 목소리만 바뀝니다.
측정한 내용
저희 Reel 중 하나(examples/ 폴더에 파일 있음)에서:
| 이전 | 이후 | |
|---|---|---|
| 스크립트 | 눈에 맞게 작성: 조각, 숫자 | 귀에 맞게 작성: speakable.py 깔끔 |
| 태그 | 없음 | [excited], [mischievously] |
| 설정 | stability 0.5, speed 1.0 | stability 0.35, speed 1.05 |
| 테이크 | 1개 | 시드 3개, gaps.py로 순위 매긴 후 귀로 선택 |
speakable.py | 65점, 다시 쓰기 필요 (마침표로 된 목록, 숫자, 태그 없음) | 100점, 말하기 가능 |
| 문장 내부 공백 | 후크에서 'now'와 'run' 사이 0.34초 | 없음 |
목소리도 바뀌었습니다(Will에서 Chris로). 따라서 이는 하나의 설정을 테스트한 실험실 결과가 아닙니다. 스크립트 재작성이 우리가 들을 수 있는 가장 큰 차이를 만들었습니다.
규칙
- 비용을 알리지 않고 유료 요청을 보내지 마세요.
takes.py는 문자 수를 출력하고--yes를 전달하지 않으면 중단됩니다. - API 키를 출력하거나 커밋하지 마세요.
takes.py는 환경 변수ELEVENLABS_API_KEY만 읽고 다른 것은 읽지 않습니다. - 레이블을 붙이세요. 음성이 생성된 경우 플랫폼의 AI 레이블을 켜세요.