제품 영상 AI 나레이션: "좀 이상한"에서 전문 내레이터 수준으로
이 스킬은 실제 재작업 사례를 기반으로 합니다. 2분 43초 분량의 영어 해커톤 제품 영상(11개 문장 나레이션, 화면 전환과 동기화 필요)에서 사용자가 "여전히 좀 이상하게 들린다"고 피드백했습니다. 9개 버전, 10가지 이상의 TTS 엔진 및 음색, 캘리브레이션된 심사, 대규모 샘플 통계를 거쳐 최종적으로 MOSS-TSTS 일괄 연속 생성 + 내용 기반 검증 후 문장 분할 + 음질 손상 없는 클래식 후처리 방법을 채택했으며, 사용자 승인을 받았습니다.
평가 방법은 references/evaluation.md를, 음향 처리의 장단점은 references/acoustic-polish.md를, 재사용 가능한 스크립트는 scripts/ 디렉토리를 참조하세요.
1. 먼저 "이상함"을 진단하세요: 일반적으로 음질 문제가 아닌, 운율 문제입니다
[!IMPORTANT] 최신 TTS의 음질은 이미 일반 녹음을 능가합니다. UTMOS / Distill-MOS 점수는 깨끗한 실제 사람 목소리(LibriSpeech)보다 높으므로, "이상함"은 거의 항상 운율에서 비롯됩니다. 공개 도메인 전문 내레이터(NASA 다큐멘터리, Demucs로 보컬 분리)를 기준으로 실제 측정된 특징은 다음과 같습니다:
| 특징 | 전문 내레이터 | 문장별 클론 TTS (초기 버전) |
|---|---|---|
| 음높이 변동(F0 표준 편차, 반음) | 4.6 | 2.7 (평탄함) |
| 구절 끝 하강(반음) | 0.7 | 2.3 (구절 끝이 가라앉음) |
| 발화 속도(음절/초) | 4.2 | 4.55 (약간 빠름) |
| 평균 일시 정지(초) | 0.39 | 0.54 |
scripts/prosody_compare.py, scripts/end_fall.py, scripts/take_features.py를 사용하여 후보와 참조를 동일한 특징 세트로 비교하고, 데이터로 말하고 인상에 의존하지 마세요.
2. 생성: 전체를 한 번에 읽고, 문장별로 연결하지 마세요
- 연속 생성 우선. 문장별로 생성하면 각 문장의 변동, 강세, 호흡이 각자 처음부터 시작되어 연결 시 "이상해"집니다. TTS가 전체 나레이션을 한 번에 읽도록 하고, 문장 사이를 빈 줄로 구분하면 모델이 컨텍스트를 볼 수 있어 앞뒤 문장이 연결됩니다. 이 예에서는 MOSS-TTS v1.5 클론 모드를 사용했습니다. 참조 오디오는 약 15초 길이의 적절한 어조를 가진 나레이션이었고, 4개의 무작위 시드로 각각 생성했으며, 각 생성본은 약 2분 10초 길이, 전체 단어 오류율 2–6%였습니다.
- 후보 비교 결과(동일한 평가 기준):
- MOSS 일괄 연속 생성: 전문 내레이터와의 운율 거리 0.29(가장 가까움), 결함 최소;
- Qwen3-TTS VoiceDesign 문장별 생성 + 연기 지시 + 여러 번 추출 후 운율 기준 선택: 거리 0.37, 자연스러움은 MOSS와 동등;
- OpenAI gpt-audio: 거리 0.57;
- 문장별 클론: 거리 0.89.
- 알려진 함정:
- MOSS-VoiceGenerator(텍스트로 음색 설명)는 긴 텍스트에서 약 33초 후 조기 중단되어 전체 생성에 사용할 수 없습니다.
- Gemini TTS는 "AUDIO PROFILE / DIRECTOR'S NOTES / TRANSCRIPT"의 섹션 형식을 사용해야 합니다. 그렇지 않으면 지시문도 함께 읽습니다. 무료 계층은 각 모델당 하루 10회 호출로 제한됩니다.
- OpenAI 음색은 심사에서 변동 폭이 작았습니다. 상용 AI 음성을 사용하는 경우 영상 끝에 명시해야 합니다.
- 시드 선택은 운율 특징 기준: 단어 오류율이 허용 범위 내에서 전문 참조와의 거리가 가장 작은 시드를 선택합니다. 특정 문장의 성능이 나쁜 경우(예: 마지막 슬로건이 거친 숨소리로 끝나는 경우), 해당 문장만 동일한 참조 음성의 다른 시드 버전으로 교체할 수 있습니다.
3. 문장 분할: 내용 기반 검증, 타임스탬프만 신뢰하지 마세요
연속 생성된 전체 오디오를 개별 문장으로 분할하여 화면에 맞춰야 합니다. scripts/align_split.py의 방법:
- SenseVoice를 사용하여 단어 수준 타임스탬프를 얻고, 편집 거리를 기준으로 대본과 정렬합니다.
- 두 문장 사이의 무음 구간에서 분할합니다.
- 내용을 다시 검증: 분할 지점 전후 1.5초 내의 각 무음 구간에서 분할을 시도하고, 양쪽을 다시 인식하여 양쪽 단어 오류율의 합이 가장 작은 위치를 선택합니다.
타임스탬프만 보면 오류가 발생합니다. TTS는 종종 문장 내부에서 일시 정지하는 반면(예: "Just | sentences."), 두 문장 사이에서는 이어서 읽으며, 단어 수준 타임스탬프는 실제 발성 시작보다 늦습니다. 검증 없이 "does | it"과 "Just | sentences"가 모두 다음 문장의 시작 부분으로 잘못 분할되었습니다.
4. 후처리: 정량화 가능한 문제만 수정하고, 피치는 건드리지 마세요
| 처리 | 결론 |
|---|---|
구두점 기반 일시 정지 정규화(pause_fix_en.py: 구절 내 0.10초, 쉼표 0.25초, 콜론 0.33초, 문장 끝 0.45초; 짧은 슬로건은 0.8초 한 박자 유지) | 유지: 전문 내레이터의 일시 정지에 더 가까워짐 |
볼륨 균일화(문장당 -20 LUFS), 하이패스 70Hz, 300Hz에서 -2dB 노치, 경미한 디에싱, 6% 소형 룸 리버브(vo_post.py) | 유지: 음질 점수 저하 없음 |
| 리미터 | 제거: Distill-MOS가 약 0.14 감소; 선형 게인 제어로 피크 관리로 대체 |
| WORLD 보코더 또는 Praat PSOLA로 문장 끝 상승, 전체 피치 변동 증폭 | 포기: 특징은 전문가에 더 가까워졌으나 엄격한 심사 점수가 오히려 하락(WORLD 수정이 심할수록 더 나빠짐, 최고 강도에서 −0.30, 신뢰 구간 [−0.61, −0.03]) |
원칙: 문장 끝과 변동 문제는 여러 번 생성하고 선택하여 해결하고, 사후 피치 수정을 하지 마세요.
5. 믹싱: 음악이 문장 사이에서 "펌핑"하지 않도록 하세요
scripts/duck_curve.py: 문장 사이 일시 정지가 2.5초 미만인 경우 음악을 낮게 유지(−11 dB); 낮추기는 0.25초 전에 시작하고, 복원은 0.9초 단극 평활화를 사용합니다. 기존 0.3초 이동 평균은 각 일시 정지마다 음악이 올라와 청취자가 "숨이 차는" 느낌을 받을 수 있습니다. 최종 영상 −14 LUFS, 피크는 −1 dBFS 이하; 믹스 내 나레이션의 ASR 단어 오류율은 0–6.5%입니다.
6. 화면 시간
- 나레이션이 화면에 맞지 않는 경우, 애니메이션 부분은 전체적으로 약 5% 느리게 재생하고, 인터페이스 녹화 부분은 머무는 시간을 늘릴 수 있습니다. 음성을 압축하지 마세요.
- 쉼표가 많으면 TTS가 딱딱하게 읽을 수 있습니다. 원래 의미를 바꾸지 않는 선에서 문구를 미세 조정할 수 있습니다. 예를 들어 "Here it is, live, on real footage"를 "running live on real footage"로 변경합니다.
7. 출시 기준
- 대본의 문장별 단어 오류율이 0.08을 초과하지 않아야 하며, 믹스 내 재측정도 동일하게 통과해야 합니다.
- 각 문장을 개별적으로 Gemini에 결함 검사(한 번에 한 트랙만 청취)를 의뢰하여 절단음, 단어 누락, 오독, 거친 숨소리 문장 끝이 없어야 합니다.
- 전문 내레이터와의 운율 거리 및 엄격한 자연스러움 테스트(단일 트랙, 대규모 샘플, 부트스트랩 신뢰 구간)가 참조보다 열등하지 않아야 합니다. 자세한 내용은 평가 문서를 참조하세요.
- 최종적으로 사용자 청취 확인을 받습니다. AI 심사는 "이상하게 들리지 않음"을 증명할 수 없습니다. 다음 섹션을 참조하세요.
8. "AI 심사"에 대한 교훈
- Gemini 쌍 비교는 사용 불가: 86%의 경우 먼저 재생된 트랙을 선택했으며, 순서를 바꾸면 반대 결론을 제시했습니다.
- 여러 트랙 동시 순위는 불안정: 동일한 자료로 두 번 순위를 매겼을 때 서로 모순되는 결과가 나왔습니다.
- 참조 없는 점수는 신뢰할 수 없음: 비전문 아마추어 실제 녹음은 약 5점으로, TTS의 약 6점보다 낮았습니다.
- 사용 가능한 방법: 전문 내레이터를 참조로 한 단일 트랙 엄격 테스트와 대규모 샘플 및 신뢰 구간을 함께 사용합니다. 그럼에도 "실제 사람으로 판단" 항목은 노이즈가 큽니다(동일한 오디오가 0/8이 될 수도, 3/8이 될 수도 있으며, 전문 배우도 AI로 판단될 수 있음).
- AI 심사의 의견은 검증 필요: 예를 들어 "믹싱에서 펌핑이 있다"는 주장은 실제 측정된 게인 곡선과 모순되므로 측정 결과를 기준으로 해야 합니다.