Communitygithub.com

rizomaai/video-narrado

MD 파일(보고서, 회의록, 카드, 분석)을 시청각 자료로 변환합니다: 먼저 선택한 음성으로 내레이션된 16:9 상세 영상을 만들고, 자막과 배경 음악을 추가합니다. 그 다음 Reels, YouTube Shorts, TikTok용 9:16 숏폼 버전과 게시글 텍스트를 생성합니다. 누군가 .md 파일을 건네며 '영상 만들어 줘', '내레이션 영상', '내 목소리 넣어 줘', '이걸로 쇼츠/릴스 만들어 줘'라고 요청할 때 사용하세요.

video-narrado란 무엇인가요?

이 스킬은 마크다운(.md) 문서를 입력받아 완전한 오디오-비주얼 콘텐츠 파이프라인을 자동화합니다. 먼저 선택한 음성(기본값: HeyGen 'audio_pmm' 클론)으로 내레이션된 2~4분 분량의 16:9 상세 영상을 생성하고, 자막과 합성 배경 음악을 추가합니다. 그런 다음 상세 영상에서 핵심 발견점을 골라 60초 미만의 9:16 숏폼 버전 2~3개를 제작합니다. 각 작품마다 제목, 설명, 해시태그, 대체 텍스트가 포함된 `publicacion.md` 파일도 생성됩니다. 이 스킬은 Claude Code, Cursor, Codex 등 MCP(모델 컨텍스트 프로토콜)를 지원하는 모든 AI 에이전트와 함께 작동합니다. 내부적으로는 Playwright, ffmpeg, Python 3를 사용하여 영상을 합성하며, 각 장면별 타임라인과 음성 싱크를 관리하는 `storyboard.json` 파일 구조를 활용합니다. 사용자는 먼저 스토리보드를 검토하고 승인해야 하며, 그 후 각 작품에 대해 한 번의 음성 생성 호출이 이루어집니다. 음성 합성 오류 시 재시도 정책이 엄격하며, 안전한 프레임과 자막 배치를 위한 '안전 영역' 규칙이 적용됩니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add rizomaai/video-narrado

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

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

문서

video-narrado은(는) 무엇을 하나요?

입력: .md 파일. 출력 (다음 순서로):

  1. 상세 영상 16:9 (2~4분) – MD 전체 내용을 다룹니다.
  2. 숏폼 버전 9:16 (2~3개, 60초 미만) – 각각 상세 영상의 한 가지 발견점을 다룹니다.
  3. 각 작품별 publicacion.md 파일 (제목, 설명, 해시태그, 대체 텍스트).

모든 영상은 선택한 음성, 자막, 자체 배경 음악과 함께 제공됩니다.

  • 엔진: 이 스킬 내의 motor/ 폴더 (Playwright 1.63.0 + ffmpeg; Python 3, 추가 의존성 없음). MOTOR = 해당 폴더의 절대 경로.
  • 프로젝트: 영상별로 하나의 폴더 생성. 예: videos/YYYY-MM-DD_주제/. 각 작품은 하위 폴더를 가집니다: largo/, short-1-…/, short-2-…/. 각 작품에는 자체 storyboard.json이 포함됩니다.
  • 설치 (최초 1회): README.md 참조.

선택한 음성

기본값: HeyGen의 클론 음성 «audio_pmm»

create_speech 필드값
voiceIdb088805628184836963fa5d2881bb23b
engineelevenlabs
settings{"model_id": "eleven_v4"}
languagees

영상 요청자가 다른 음성을 원할 경우, mcp__heygen__list_voices로 검색하고 생성 전에 확인하세요.

워크플로우

1. MD 읽기 및 작품 제안

MD 전체를 읽습니다. 상세 영상의 구성 (모든 발견점을 순서대로)과 숏폼 버전당 하나의 발견점 (가장 강력한 것부터)을 정의합니다. 스토리보드를 작성하기 전에 작품 목록을 먼저 보여줍니다.

2. 스토리보드 → 승인

아이디어당 하나의 장면. 상세 영상은 816개 장면, 숏폼 버전은 47개 장면이며, 첫 번째 장면에 후크(destacado)가 포함됩니다. 전체 예시: motor/ejemplos/storyboard-desalacion-16x9.json.

{"id": "03-sesiones", "tipo": "barras", "kicker": "건별 세션 수", "titulo": "가장 많이 논의된 곳",
 "items": [{"etiqueta": "Caleta Chañaral", "valor": 6}], "destacar": 0, "nota": "출처…",
 "subtitulo": "Chañaral de Aceituno가 가장 많은 세션을 가진 사례였습니다.",
 "voz": "Chañaral de Aceituno가 가장 많은 세션을 가진 사례였습니다."}

스토리보드 헤더: titulo, serie («Rizoma ·» 옆에 표시), formato (상세 영상은 "16:9", 숏폼 버전은 "9:16"), fuente_md, 그리고 필요시 musica (5단계 참조).

장면 유형 (모두 kicker, tono: "oscuro", lluvia: true 지원):

유형필드용도
portadatitulo, bajada상세 영상 오프닝
cifrastitulo, items[{valor, prefijo?, sufijo?, texto, detalle?}] (1~3개), destacar숫자가 올라가는 카운트
barrastitulo, items[{etiqueta, valor, rotulo?}] (최대 8개), destacar, nota수량 비교
hitofecha, etiqueta, titulo, texto, progreso{i, n}연대표의 한 사건
listatitulo, items[{marca?, texto, alerta?}] (최대 6개)논거나 단계
citafecha, texto, quien, nota누군가의 말
destacadotexto, bajada기억해야 할 문구; 숏폼 버전의 후크
cierrebajada, url, fuente마무리 및 출처

편집 규칙:

  • MD에 있는 사실만 사용. MD가 의심스럽다고 표시한 내용은 제외하거나 그대로 언급.
  • voz는 읽는 텍스트: 숫자, 연도, 백분율, 약어는 글로 풀어 씁니다 (texto_voz.py가 숫자를 거부). subtitulo는 보이는 텍스트이며 숫자를 포함할 수 있음. texto는 hito, cita, destacado 장면의 화면 텍스트.
  • 짧은 문장, 중립적인 칠레 스페인어, 초당 ~2.9단어. 숏폼 버전은 음성 약 140단어를 초과할 수 없음.
  • 자동 전사에서 가져온 내용은 의역으로 표시(nota).
  • 게시되는 내용은 고객사나 내부 플랫폼을 언급하지 않음. 마무리에는 출처를 포함.

각 스토리보드를 표(장면 · 유형 · 보이는 내용 · 내레이션)로 표시하고 승인 대기: 각 내레이션은 음성 할당량을 사용합니다.

3. 음성 (작품당 한 번의 호출)

python3 $MOTOR/texto_voz.py <작품>

출력된 텍스트(각 장면의 음성을 <break time="1.2s"/>로 연결)를 선택한 음성으로 mcp__heygen__create_speech에 전달합니다. 반환된 audio_url로:

python3 $MOTOR/bajar_voz.py <작품> "<audio_url>"

오디오를 다운로드하고 일시 정지를 기준으로 장면별로 분할합니다. 일시 정지가 부족하다는 메시지가 뜨면, 이미 다운로드된 오디오에 대해 임계값을 낮춰 재실행: python3 $MOTOR/bajar_voz.py <작품> <작품>/voz/narracion.wav --pausa 0.7 (실제로 ElevenLabs가 일부 일시 정지를 약간 줄이는 경우가 있음). 그래도 실패하면 음성이 <break>를 따르지 않은 것이므로 재생성 전에 확인하세요. 오류 발생 후 단독으로 재생성을 시도하지 마세요.

4. 빌드 및 렌더링

bash $MOTOR/producir.sh <작품>                                   # 전체 영상
bash $MOTOR/producir.sh <작품> --hasta 15 --salida prueba.mp4    # 짧은 미리보기

각 장면의 길이는 해당 음성 길이와 같습니다. MP4 파일은 <작품>/salida/video.mp4에 생성됩니다. 영상 길이에 비례하여 시간이 소요됩니다.

5. 배경 음악

자동: ffmpeg로 합성한 앰비언트 패드 (타사 저작권 없음), 음성 대비 14dB 낮음, 부드러운 덕킹 및 최종 믹스 -16 LUFS. 스토리보드에서: "musica": {"bajo_voz_db": 18}는 음량을 낮춤; {"archivo": "pista.mp3"}는 자체 트랙 사용 (라이선스가 명시된 무료 사용 가능한 것만); false는 음악을 끔.

6. 숏폼 버전

상세 영상 승인 후, 각 숏폼 버전을 별도 작품(formato: "9:16")으로 구성합니다. 상세 영상의 장면을 재활용: 후크 → 2~4개의 데이터 장면 → 마무리. 동일한 3단계(작품당 한 번의 음성 호출)와 4단계를 따릅니다.

7. 검토 및 전달

  • ffmpeg로 4~8개의 프레임을 추출하여 확인: 자막이 데이터를 가리지 않는지, 텍스트가 프레임을 벗어나지 않는지, 빈 장면이 없는지.
  • 작품별로 publicacion.md 작성: 제목 (60자 이내), 출처를 포함한 설명, 해시태그 3~5개, 대체 텍스트, 게시 전 확인해야 할 사항.
  • MP4 파일을 ~/Downloads에 명확한 이름으로 복사 (Video_<주제>.mp4, Short_<n>_<주제>.mp4). 오디오와 MP4는 git에 포함되지 않음 (**/voz/*.wav, **/salida/).

자체 애니메이션 HTML에서 작업

이미 window.seek(t)와 고정 시간의 장면이 있는 HTML이 있다면, 수동으로 guion.json을 작성하고 (세그먼트당 html: [a, b]) preparar.py + render.mjs를 실행합니다. 수동으로 만든 숏폼 버전의 경우: motor/plantillas/motor-vertical.js.

형식 및 안전 영역

  • 16:9: 1920×1080, 하단 34px 자막, 최대 58자.
  • 9:16: 1080×1920, 하단 경계로부터 400px 위에 54px 자막, 최대 34자; 콘텐츠는 y=400과 y=1380 사이 (상단과 하단은 각 플랫폼의 버튼 영역).
  • 자막이 «que», «las», «por» 등으로 끝나지 않도록 함.

알려진 오류

  • 네트워크 없음: Google 폰트가 로드되지 않아 렌더링이 Arial로 대체됨.
  • libass 없는 ffmpeg (Homebrew): 자막이 페이지 내부에 그려지는 이유.
  • 알 수 없는 장면 유형: 영상이 빈 화면으로 출력됨. tipo 확인.

관련 스킬