Community코딩 & 개발github.com

Biogod2020/product-film-narration

영어 제품 영상, 발표식 데모, 해커톤 비디오를 위해 전문 내레이터 수준의 AI 나레이션 제작. 문장 단위 정밀 편집, 화면 시간에 맞춤, 오디오 믹싱의 '펌핑' 현상 방지, 그리고 '이상하게 들리는지'를 정량적으로 판단.

product-film-narration란 무엇인가요?

이 스킬은 AI 생성 나레이션을 전문 내레이터 수준으로 끌어올리기 위해 설계된 포괄적인 워크플로우입니다. 실제 2분 43초 분량의 해커톤 프로덕션 비디오 리워크 과정에서 탄생했으며, 9개 버전, 10개 이상의 TTS 엔진 및 음색, 캘리브레이션된 심사, 대규모 샘플 통계를 거쳐 최적의 방법을 도출했습니다. 핵심 통찰은 '이상함'의 원인이 음질이 아닌 운율(prosody)에 있다는 점입니다. 이 스킬은 F0 표준 편차, 문장 끝 하강 폭, 발화 속도, 평균 일시 정지와 같은 정량적 운율 특징을 전문 내레이터(예: NASA 다큐멘터리)와 비교하여 분석합니다. 주요 방법으로는 MOSS-TTS를 사용한 일괄 연속 생성(문장별 클로닝 및 연결 방식의 문제 해결), SenseVoice를 활용한 내용 기반 정밀 분할(시간 기반 분할 오류 방지), 그리고 피치 조작을 피하고 정량화 가능한 파라미터(일시 정지 정규화, LUFS 볼륨 균일화, 노치 필터)만 수정하는 사운드 후처리 접근법을 사용합니다. 또한 음악 트랙이 문장 사이에서 '펌핑(pumping)' 현상을 일으키지 않도록 하는 덕킹(ducking) 곡선, 화면 시간에 맞춘 콘텐츠 조정, 엄격한 출시 기준(단어 오류율 ≤ 0.08, 결함 검사 통과, 운율 거리 및 자연스러움 평가)을 포함합니다. 마지막으로, 이 스킬은 A/B 비교의 불안정성, 참조 부재 시 평가의 신뢰성 부족 등 AI 심사의 한계에 대한 교훈을 문서화하며, 측정 가능한 메트릭과 최종 사용자 확인의 중요성을 강조합니다. 지원 플랫폼: MOSS-TTS, SenseVoice, Gemini, Qwen3-TTS 등.

지원 대상~Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/Biogod2020/my-video-skill/tree/HEAD/skills/product-film-narration

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

제품 영상 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.62.7 (평탄함)
구절 끝 하강(반음)0.72.3 (구절 끝이 가라앉음)
발화 속도(음절/초)4.24.55 (약간 빠름)
평균 일시 정지(초)0.390.54

scripts/prosody_compare.py, scripts/end_fall.py, scripts/take_features.py를 사용하여 후보와 참조를 동일한 특징 세트로 비교하고, 데이터로 말하고 인상에 의존하지 마세요.

2. 생성: 전체를 한 번에 읽고, 문장별로 연결하지 마세요

  1. 연속 생성 우선. 문장별로 생성하면 각 문장의 변동, 강세, 호흡이 각자 처음부터 시작되어 연결 시 "이상해"집니다. TTS가 전체 나레이션을 한 번에 읽도록 하고, 문장 사이를 빈 줄로 구분하면 모델이 컨텍스트를 볼 수 있어 앞뒤 문장이 연결됩니다. 이 예에서는 MOSS-TTS v1.5 클론 모드를 사용했습니다. 참조 오디오는 약 15초 길이의 적절한 어조를 가진 나레이션이었고, 4개의 무작위 시드로 각각 생성했으며, 각 생성본은 약 2분 10초 길이, 전체 단어 오류율 2–6%였습니다.
  2. 후보 비교 결과(동일한 평가 기준):
    • MOSS 일괄 연속 생성: 전문 내레이터와의 운율 거리 0.29(가장 가까움), 결함 최소;
    • Qwen3-TTS VoiceDesign 문장별 생성 + 연기 지시 + 여러 번 추출 후 운율 기준 선택: 거리 0.37, 자연스러움은 MOSS와 동등;
    • OpenAI gpt-audio: 거리 0.57;
    • 문장별 클론: 거리 0.89.
  3. 알려진 함정:
    • MOSS-VoiceGenerator(텍스트로 음색 설명)는 긴 텍스트에서 약 33초 후 조기 중단되어 전체 생성에 사용할 수 없습니다.
    • Gemini TTS는 "AUDIO PROFILE / DIRECTOR'S NOTES / TRANSCRIPT"의 섹션 형식을 사용해야 합니다. 그렇지 않으면 지시문도 함께 읽습니다. 무료 계층은 각 모델당 하루 10회 호출로 제한됩니다.
    • OpenAI 음색은 심사에서 변동 폭이 작았습니다. 상용 AI 음성을 사용하는 경우 영상 끝에 명시해야 합니다.
  4. 시드 선택은 운율 특징 기준: 단어 오류율이 허용 범위 내에서 전문 참조와의 거리가 가장 작은 시드를 선택합니다. 특정 문장의 성능이 나쁜 경우(예: 마지막 슬로건이 거친 숨소리로 끝나는 경우), 해당 문장만 동일한 참조 음성의 다른 시드 버전으로 교체할 수 있습니다.

3. 문장 분할: 내용 기반 검증, 타임스탬프만 신뢰하지 마세요

연속 생성된 전체 오디오를 개별 문장으로 분할하여 화면에 맞춰야 합니다. scripts/align_split.py의 방법:

  1. SenseVoice를 사용하여 단어 수준 타임스탬프를 얻고, 편집 거리를 기준으로 대본과 정렬합니다.
  2. 두 문장 사이의 무음 구간에서 분할합니다.
  3. 내용을 다시 검증: 분할 지점 전후 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. 출시 기준

  1. 대본의 문장별 단어 오류율이 0.08을 초과하지 않아야 하며, 믹스 내 재측정도 동일하게 통과해야 합니다.
  2. 각 문장을 개별적으로 Gemini에 결함 검사(한 번에 한 트랙만 청취)를 의뢰하여 절단음, 단어 누락, 오독, 거친 숨소리 문장 끝이 없어야 합니다.
  3. 전문 내레이터와의 운율 거리 및 엄격한 자연스러움 테스트(단일 트랙, 대규모 샘플, 부트스트랩 신뢰 구간)가 참조보다 열등하지 않아야 합니다. 자세한 내용은 평가 문서를 참조하세요.
  4. 최종적으로 사용자 청취 확인을 받습니다. AI 심사는 "이상하게 들리지 않음"을 증명할 수 없습니다. 다음 섹션을 참조하세요.

8. "AI 심사"에 대한 교훈

  • Gemini 쌍 비교는 사용 불가: 86%의 경우 먼저 재생된 트랙을 선택했으며, 순서를 바꾸면 반대 결론을 제시했습니다.
  • 여러 트랙 동시 순위는 불안정: 동일한 자료로 두 번 순위를 매겼을 때 서로 모순되는 결과가 나왔습니다.
  • 참조 없는 점수는 신뢰할 수 없음: 비전문 아마추어 실제 녹음은 약 5점으로, TTS의 약 6점보다 낮았습니다.
  • 사용 가능한 방법: 전문 내레이터를 참조로 한 단일 트랙 엄격 테스트와 대규모 샘플 및 신뢰 구간을 함께 사용합니다. 그럼에도 "실제 사람으로 판단" 항목은 노이즈가 큽니다(동일한 오디오가 0/8이 될 수도, 3/8이 될 수도 있으며, 전문 배우도 AI로 판단될 수 있음).
  • AI 심사의 의견은 검증 필요: 예를 들어 "믹싱에서 펌핑이 있다"는 주장은 실제 측정된 게인 곡선과 모순되므로 측정 결과를 기준으로 해야 합니다.

관련 스킬