ffmpeg을 사용한 립싱크 입력 파일 사전 검사 (500MB / 10MB, 테스트 파일을 이용한 실행)
요약
본 기사는 온라인 립싱크 도구의 파일 제한 사항(비디오 최대 500MB, 오디오 최대 10MB)을 사전에 검사하는 로컬 스크립트 구축 방법을 안내합니다. 사용자는 `ffprobe`와 Python을 연동하여 합성 파일을 이용한 전처리 검사기를 만들 수 있습니다. 이를 통해 실제 작업 제출 전에 파일의 크기 및 형식을 미리 검증할 수 있습니다.
핵심 포인트
- 온라인 립싱크 도구는 비디오(MP4/MOV, 최대 500MB)와 오디오(최대 10MB)에 제한이 있음.
- Python과 `ffprobe`를 활용하여 로컬 전처리 검사기 구축이 가능함.
- 스크립트는 파일의 크기와 확장자 규칙을 처리하며 CI/CD 단계에 배치할 수 있음.
Wan-family의 립싱크 도구는 **사람 영상(person video)**과 대상 오디오(target audio) 트랙을 요구합니다. 공개된 도구 페이지에는 비디오가 약 500 MB (MP4/MOV)까지, 오디오는 짧은 지속 시간 제한과 함께 약 10 MB까지 가능하다는 실질적인 제한 사항이 나열되어 있습니다. 파일을 업로드하고 빨간 배너를 통해 학습하는 것은 시간을 낭비합니다. 이 게시물에서는 합성 파일만을 사용하여 작은 로컬 검사기를 구축하고, 이를 ffprobe와 연동하는 방법을 보여줍니다. 실제 립싱크 작업은 제출되지 않습니다.
파일을 통과한 후 제품 단계로 이동하려면 AI Video Lip Sync를 확인하세요.

본 기사를 위해 제작된 다이어그램입니다.
인코딩하는 제한 사항 (Limits we encode)
공개 도구 사양(신뢰하려면 라이브 페이지에서 확인하세요):
- 비디오: 깨끗한 얼굴/입술 선호; MP4/MOV 형식; 최대 500 MB 수준의 크기
- 오디오: 음성 트랙; 일반적인 압축 형식; 최대 10 MB 수준의 크기; 지속 시간 제한 적용
아래 스크립트는 페이지가 변경될 때 수정할 수 있는 상수로서 이러한 크기/확장자 규칙을 처리합니다.

공개 도구 사양을 기반으로 본 기사를 위해 제작된 다이어그램입니다.
검사기 (The checker)
VIDEO_MAX = 500 * 1024 * 1024
AUDIO_MAX = 10 * 1024 * 1024
VIDEO_EXT = {".mp4", ".mov"}
...
python3 preflight_lipsync.py --video take.mp4 --audio line.wav를 실행합니다. 실패 시 종료 코드가 0이 아니므로 폴더 액션이나 CI 단계에 배치할 수 있습니다. --self-test는 작은 합성 파일을 작성하며 'OK' 라인을 출력해야 합니다.

2026년 10월 26일 실제 자체 테스트 결과입니다. 모델 실행 결과가 아닙니다.
선택적 ffprobe 보조 도구
크기 검사만으로는 입이 보이는지 또는 오디오가 모노(mono) 음성인지를 증명할 수 없습니다. 스크립트가 통과한 후에는 사람이 (또는 별도의 프로브를 통해) 지속 시간(duration), 해상도(resolution), 트랙 레이아웃(track layout)을 확인해야 합니다:
ffprobe -hide_banner -show_streams -of json take.mp4
ffprobe -hide_banner -show_streams -of json line.wav
입이 프레임 밖으로 벗어나는 클립이나, 동기화하려는 음성을 배경 음악(music beds)이 가리는 클립은 거부해야 합니다.

본 기사를 위해 제작된 다이어그램입니다.
실패 시 대처 방안(Failure playbook)
- 너무 큰 비디오(Oversize video): 더 온건한 비트레이트(bitrate)로 재인코딩하고, 업스케일링은 하지 마십시오.
- 너무 큰 오디오(Oversize audio): 대화 라디오 수준의 비트레이트로 음성만 추출된 WAV/MP3 파일을 내보내기 하십시오.
- 잘못된 확장자(Wrong extension): 리먹싱(remux)을 수행하고, 무작정 이름을 바꾸지 마십시오.
- 빈 파일(Empty file): 모델 디버깅을 하기 전에 내보내기 경로를 수정하십시오.

본 기사를 위해 제작된 다이어그램입니다.

스크린샷: 립싱크 도구 페이지 캡처 (2026-10-26 Asia/Shanghai).
배포하는 날짜의 페이지에서 정확한 제한 사항을 문서화하십시오. 상수(constants)는 변동합니다.
여기서 API를 호출하지 않는 이유
립싱크 품질은 얼굴 크롭(face crop)과 음성 테이크(speech take)에 따라 달라집니다. 가짜 "전/후" 입술을 게시하는 것은 결과물을 조작하는 행위입니다. 사전 검사 스크립트(pre-flight script)가 가장 정직한 기술적 산출물입니다. 이 스크립트는 UI에서 어차피 거부할 파일에 대해서는 작동 오류를 일으키며 닫히게 만듭니다 (fails closed).
스크립트를 폴더 액션에 연결하기
macOS 또는 Linux에서는 검사기를 한 줄 명령어로 감싸서, 종료 코드(exit code)가 0이 될 때까지 브라우저를 열지 않도록 할 수 있습니다:
python3 preflight_lipsync.py --video "$1" --audio "$2" && open "https://wan30.io/ai-lip-sync"
Linux에서는 open을 xdg-open으로 대체하십시오. 핵심은 행동 방식에 있습니다. 사람들이 업로드 페이지를 검증기(validator)로 취급하는 것을 멈추게 하는 것입니다.
ffprobe가 거부해야 할 것들
- 관심 있는 음성보다 영상 길이가 훨씬 긴 경우 (입술이 유휴 상태가 되거나 임의로 생성됨).
- 매우 긴 시작 침묵을 포함하는 오디오—업로드 전에 자르십시오.
- 보컬이 강하게 패닝(hard-panned)된 스테레오 베드—중앙에 위치한 음성 트랙으로 바운스하십시오.
- 일부 UI가 수용했다가 이상하게 처리하는 가변 프레임 속도 웹캠 파일—편집기에서 지원한다면 상수 프레임 속도로 재포장하십시오.
이러한 요소들은 의도적으로 크기 스크립트에는 포함되지 않았습니다. 크기는 기계로 검사할 수 있지만, 취향은 여전히 인간의 영역입니다.
합성 자체 테스트 대 실제 테이크
--self-test는 단순히 스크립트가 실행되는지 여부만 증명합니다. 팀이 이를 채택하기 전에, 실제로 거부된 파일(용량 초과) 하나와 실제로 승인된 쌍(pair) 하나에 대해 한 번 실행해보고, 두 트랜스크립트를 레포지토리 README에 붙여넣으십시오. 이렇게 하면 상수 값들이 특정 시점의 UI 동작 기록에 고정됩니다.
보안 참고 사항
이 스크립트는 로컬 파일만 읽습니다. 보존 규칙(retention rules) 없이 공유 CI 캐시 내부에 있는 프로덕션 고객 미디어에는 절대 연결하지 마십시오. 립싱크 입력물은 종종 식별 가능한 얼굴과 목소리입니다.
ffmpeg loudnorm과 결합하기 (선택 사항)
크기 검사를 통과한 후, 일부 팀들은 음성이 예측 가능한 레벨에 있도록 라우드니스 패스(loudness pass)를 실행합니다:
ffmpeg -i line.wav -af loudnorm=I=-16:TP=-1.5:LRA=11 line_norm.wav
이것은 선택 사항이며 립싱크 UI에서 필수로 요구하는 것은 아닙니다. 이는 제작자들이 목소리를 A/B 테스트할 때 발생하는 "왜 이번 테이크가 어제보다 더 조용한가"와 같은 노이즈를 단순히 줄여줄 뿐입니다.
변경 기록 관리 원칙 (Changelog discipline)
공개 페이지에서 500 MB / 10 MB 수치가 변경되면, 스크립트 내의 LIMITS_DATE 상수를 업데이트하고 자체 테스트를 다시 실행해야 합니다. 나중에 검토하기 쉽도록 이전 수치는 주석으로 남겨두세요.
이 글에서 단 하나의 규칙만 기억할 운영자들은 끝부분에 있는 체크리스트를 기억해야 합니다. 이 체크리스트는 모니터 옆의 포스트잇 크기에 맞게 의도적으로 짧습니다. 긴 에세이는 바쁜 배포 기간을 버티지 못하지만, 다섯 줄짜리 게이트는 살아남습니다. 샷이 한 번이라도 실패한 이유가 있다면 그 포스트잇을 다시 확인하세요.
내일 자동화할 수 있는 승인 테스트 (Acceptance tests you can automate tomorrow)
크기 외에도, 스크립트의 향후 버전은 ffprobe -v error -show_entries format=duration -of csv=p=0를 호출하여 오디오가 문서화된 홀드(hold) 없이 비디오보다 1초 이상 긴 쌍을 거부할 수 있습니다. 편집자들이 새로운 규칙을 익힐 수 있도록, 이를 하드 실패로 만들기 전에 먼저 경고 메시지를 출력하는 것부터 시작하세요.
작업 파일(fixtures)은 code/fixtures/ 아래에 보관하고 예상되는 OK/FAIL 목록이 담긴 매니페스트 JSON 파일을 작성하세요. 새로운 기여자들은 파일을 직접 만들 필요 없이 단 하나의 명령어를 실행하여 녹색/빨간색 결과를 확인할 수 있습니다.
마지막으로, 첫 번째 승인된 샷 이후 10분 간의 검토 시간을 계획하세요. 어떤 제한 사항이 놀라웠는지, 어떤 체크리스트 항목이 실제 오류를 잡아냈는지, 그리고 절대 발동되지 않아 삭제할 수 있는 항목은 무엇인지 논의해야 합니다. 살아있는 체크리스트는 짧게 유지되어야 하며, 방치된 것은 아무도 읽지 않을 때까지 커집니다.
마무리 (Wrap-up)
확장 파일과 크기를 로컬에서 검증하고, 스트림을 프로빙(probe)한 다음, 립싱크 워크스페이스를 여세요. 모델은 너무 큰 파일을 사용한 첫 실험이 아니라, 얼굴과 깨끗한 목소리를 보여야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기