목차
자막 싱크가 어긋나는 이유
이 글은 Windows 또는 Linux에서 명령어를 실행할 수 있고 Python, FFmpeg, Edge-TTS가 설치된 환경을 전제로 합니다. 자막 파일은 영상의 시작 시점, 음성 길이, 문장별 표시 시간을 함께 맞춰야 자연스럽게 보입니다.
문장별 시간을 글자 수나 평균 발화 속도로 추정하면 실제 음성 길이와 차이가 생길 수 있습니다. 또한 음성을 생성할 때 사용한 문장 단위와 SRT를 나눈 문장 단위가 다르면 자막이 먼저 사라지거나 다음 문장보다 늦게 나타납니다. Shorts는 화면 전환이 빠르기 때문에 작은 오차도 시청자가 쉽게 알아챕니다.
SRT 타임코드 작성과 FFmpeg 합성

SRT는 문장마다 시작과 종료 시간을 기록하는 형식입니다. 예시처럼 각 문장의 구간을 작성할 수 있지만, 자동화에서는 이 시간을 미리 고정하기보다 생성된 음성의 실제 길이를 측정해 산출하는 편이 안정적입니다.
1
00:00:00,000 --> 00:00:02,300
첫 번째 자막입니다.
2
00:00:02,300 --> 00:00:05,100
다음 문장이 이어집니다.
영상에 자막을 합성할 때는 FFmpeg의 subtitles 필터를 사용할 수 있습니다. 이 필터를 적용하면 영상은 다시 인코딩되며, 아래 명령의 -c:a copy는 오디오만 재인코딩하지 않고 복사하는 옵션입니다.
ffmpeg -i input.mp4 -vf "subtitles=subtitle.srt" -c:a copy output.mp4
한글이 깨지거나 자막 파일을 찾지 못하면 먼저 자막 파일이 UTF-8로 저장되었는지 확인하세요. 다만 UTF-8만으로 모든 문제가 해결되는 것은 아니며, 한글 표시에는 실행 환경의 폰트 설정이 영향을 줄 수 있습니다. 경로에 공백이나 특수문자가 포함된 경우에는 경로를 따옴표로 감싸고, 운영체제에 따라 자막 파일 경로 표기 방식과 escaping을 조정해야 합니다.
문장 길이에 맞춰 타이밍 조정하기
자동화에서는 자막 시간을 먼저 정하고 음성을 맞추기보다, SRT와 음성에 같은 문장 단위를 사용해야 합니다. 문장별로 음성을 생성한 뒤 각 음성 구간의 실제 길이를 측정하고, 앞 문장의 종료 시점을 다음 문장의 시작 시점으로 누적해 start와 end를 계산합니다. 이렇게 하면 글자 수 기반의 추정 시간보다 생성된 음성의 길이를 직접 반영할 수 있으며, 한 화면에 너무 많은 글자가 들어가지 않도록 문장 분할도 음성 생성 전에 확정할 수 있습니다.
확인할 때는 완성된 영상을 처음부터 끝까지 재생하기보다 문장 시작 부분, 문장 종료 부분, 화면 전환 구간을 먼저 살펴보세요. 음성의 시작·종료 위치와 자막의 start·end를 비교해 오차가 반복되는지 확인하고, 반복되는 오차가 확인되면 음성 구간 산출이나 문장 분할 과정에서 동일한 오차가 발생하는지 먼저 확인하고 해당 로직을 수정합니다. 마지막에는 음성이 끝난 뒤 자막이 남지 않는지도 점검하세요.
결론
YouTube Shorts 자막 타이밍 동기화는 SRT의 문장별 시간 구간과 실제 음성 길이를 같은 기준으로 맞추는 작업입니다. 문장 단위를 먼저 확정하고 생성된 음성 구간에서 start와 end를 산출한 뒤 FFmpeg로 합성하면 추정 시간에 따른 오차를 줄일 수 있습니다. 합성 후에는 문장 시작, 종료, 화면 전환, 마지막 자막 잔류 여부를 확인해야 합니다.