video-narrado은(는) 무엇을 하나요?
입력: .md 파일. 출력 (다음 순서로):
- 상세 영상 16:9 (2~4분) – MD 전체 내용을 다룹니다.
- 숏폼 버전 9:16 (2~3개, 60초 미만) – 각각 상세 영상의 한 가지 발견점을 다룹니다.
- 각 작품별
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 필드 | 값 |
|---|---|
voiceId | b088805628184836963fa5d2881bb23b |
engine | elevenlabs |
settings | {"model_id": "eleven_v4"} |
language | es |
영상 요청자가 다른 음성을 원할 경우, 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 지원):
| 유형 | 필드 | 용도 |
|---|---|---|
portada | titulo, bajada | 상세 영상 오프닝 |
cifras | titulo, items[{valor, prefijo?, sufijo?, texto, detalle?}] (1~3개), destacar | 숫자가 올라가는 카운트 |
barras | titulo, items[{etiqueta, valor, rotulo?}] (최대 8개), destacar, nota | 수량 비교 |
hito | fecha, etiqueta, titulo, texto, progreso{i, n} | 연대표의 한 사건 |
lista | titulo, items[{marca?, texto, alerta?}] (최대 6개) | 논거나 단계 |
cita | fecha, texto, quien, nota | 누군가의 말 |
destacado | texto, bajada | 기억해야 할 문구; 숏폼 버전의 후크 |
cierre | bajada, 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확인.