본문으로 바로 가기
SubtitleMatrix

오디오에 맞춰 자막 재동기화

미디어오디오에 맞춰 재동기화

처음 실행하면 영상 엔진을 내려받습니다. 약 31 MB이고 이 사이트가 제공하며 이후에는 브라우저가 캐시합니다. 오디오 트랙을 읽는 데만 쓰이고, 자막은 말소리 자체와 대조하며 음성 모델도, 업로드도 없습니다.

옵션

자막이 있어야 할 자리에서 양쪽으로 얼마나 떨어져 있을 수 있는지입니다. 정확도 설정이라기보다 비용과 위험 설정입니다. 범위가 넓으면 더 큰 어긋남을 찾지만, 우연히 점수가 잘 나온 곳에 자리를 잡을 기회도 늘어납니다. 대략 1분을 넘는 어긋남은 자르기나 로고에서 오지 않습니다. 그 정도면 대개 영화의 다른 판본이거나 프레임 레이트 불일치이고, 이 페이지가 따로 푸는 문제입니다. 짐작을 덮는 가장 좁은 범위를 고르세요.

이 페이지는 순서는 맞지만 시각이 틀린 자막을 고칩니다. 자막 파일과 그것이 속한 영상이나 오디오, 두 가지를 주면 텍스트가 얼마나 밀렸는지 계산하고 모든 블록을 옮겨 파일을 다시 씁니다. 몇 초의 밀림은 잘라 내기와 로고에서 옵니다. 영화를 지나며 커지는 밀림은 프레임레이트 불일치에서 옵니다. 23.976fps 마스터에 25fps 기준으로 만든 자막을 붙이면 첫 한 시간이 끝날 무렵 오차가 이미 1분 30초입니다.

측정은 오디오 자체에서 합니다. 페이지가 모노 트랙을 추출해 20밀리초 프레임의 음량으로 접고, 말소리가 있는 프레임을 표시합니다. 그리고 같은 질문을 반복합니다. 이 이동과 이 속도 변화에서 자막 텍스트가 얼마나 많이 침묵이 아니라 말소리 위에 앉는가. 답은 블록마다 점수화해 평균하고, 이긴 조합을 적용합니다. 음성 인식은 쓰지 않으므로 몇 초 만에 끝나고, 모델이 없는 언어의 자막에도 동작합니다.

점수는 보장이 아니라 측정이므로, 페이지는 측정이 약할 때 아무것도 하지 않도록 만들어졌습니다. 블록이 다섯 개 이하이거나, 오디오에 감지할 말소리가 없거나, 최선의 점수가 여전히 대부분 침묵 위에 앉거나, 아주 다른 두 정렬이 비슷한 점수를 내면, 각각의 경우에 보고서만 남기고 다시 쓴 자막 파일은 내놓지 않습니다. 여기서는 조용한 실패가 자신 있는 실패보다 훨씬 낫습니다. 5초 밀린 자막은 지저분해 보이지만, 성공했다고 말한 도구가 5초 밀어 놓은 자막은 알아차리기도 설명하기도 어렵습니다.

정렬이 좋으면 파일이 두 개 나옵니다. 둘은 다른 질문에 답하기 때문입니다. 고친 자막은 들어온 형식을 유지하고 film.synced.srt처럼 확장자 앞에 표시가 붙어 바로 재생할 수 있습니다. 보고서는 밀림(밀리초), 실제 적용한 비율, 점수, 신뢰도, 그리고 파일을 건드렸는지 말하는 한 줄이 든 작은 텍스트 파일입니다. 둘 다 같은 실행에서 나오므로 에피소드 묶음을 돌리면 하나마다 짝을 이룬 두 파일이 생깁니다.

작업은 로컬에서 합니다. 오디오는 WebAssembly로 컴파일한 ffmpeg가 디코드하고, 그 엔진은 이 사이트에서 한 번 내려받아 이후 캐시됩니다. 자막은 탭에서 파싱합니다. 영화나 자막에 관한 어떤 것도 어디로도 보내지 않습니다. 건너뛸 업로드 단계가 아예 없고, 기기 밖으로 나가면 안 되는 자료에 중요한 성질입니다.

자주 묻는 질문

측정한 이동은 이동 페이지에 직접 입력하는 고정 오프셋과 무엇이 다른가요?

이동 페이지는 이미 아는 숫자를 적용하므로 오디오가 동의하든 말든 그대로 맞습니다. 이 페이지는 반대 끝에서 시작합니다. 숫자를 모른다고 가정하고 오디오에서 말소리 활동을 읽어 이동과 속도 변화를 함께 풉니다. 프레임레이트 문제를 고칠 수 있는 이유도 같습니다. 25fps 대 23.976fps에서는 오차가 시작에서 0이고 시간당 약 3.6초씩 커지므로, 시작을 고치는 이동은 끝을 더 나쁘게 만듭니다. 어떤 단일 오프셋도 그 모양을 표현하지 못합니다.

페이지가 새 자막 파일을 아예 쓰지 않고 거부할 때가 있는 이유는 무엇인가요?

잘못된 보정은 빠진 보정보다 발견하기 어렵기 때문입니다. 탐색은 네 가지를 보고합니다. 다룰 블록이 몇 개였는지, 오디오에 말소리가 있었는지, 자막 시간 중 말소리 위에 앉은 비율이 얼마인지, 이긴 정렬이 진짜로 다른 차선보다 얼마나 나았는지입니다. 그중 하나라도 약하면 실행은 보고서만 내놓고, 보고서의 상태 줄이 이유와 함께 not-found라고 말합니다. 잃는 것은 없습니다. 원본 파일은 건드리지 않고, 직접 손대기 전에 확인할 숫자를 얻습니다.

23.976fps에서 25fps로의 불일치에서 보고서의 비율은 무엇을 뜻하나요?

블록 시각에 비율을 곱한 뒤 오프셋만큼 이동합니다. 비율 1.0427은 자막이 더 빠른 프레임 기준으로 만들어졌고 모든 블록을 뒤로 늘려야 한다는 뜻입니다. 페이지는 흔한 쌍마다 양방향을 시도합니다. 어느 쪽으로 읽히는지는 가지고 있는 파일이 어느 쪽이냐에 달렸기 때문입니다. 1.0427과 0.9590은 같은 불일치를 양 끝에서 본 것입니다. 보고된 비율이 1.000000이고 오프셋이 한 프레임 미만이면 파일은 이미 맞아 있고 건드리지 않습니다.

고친 파일이 스타일을 유지하나요, 아니면 시각만 남나요?

시각만 바뀌고 나머지는 그대로입니다. 자막은 이 사이트의 다른 모든 페이지가 쓰는 같은 내부 표현으로 파싱되고, 각 블록의 시작과 끝을 다시 쓴 뒤 들어온 형식으로 직렬화합니다. ASS 스타일, 위치 지정, 인라인 태그가 살아남고 파일 자체의 구조도 남습니다. .ass를 넣으면 납작해진 .srt가 아니라 .ass가 나오는 이유입니다. 눈에 보이는 예외는 큰 비율 때문에 1밀리초 아래로 눌린 블록 하나이고, 그것은 1밀리초로 붙잡아 두고 손실 목록에 셉니다.

자막이 오디오와 다른 언어일 때도 동작하나요?

네, 그리고 그것이 단어를 인식하는 대신 음량을 재는 요점입니다. 말소리 활동은 모양입니다. 한 문장은 에너지의 폭발 뒤에 빈 구간이 따르는 형태이고, 그 모양은 목소리가 독일어를 하든 스페인어를 하든 같습니다. 스페인어 자막 아래 독일어 더빙도 짝이 맞는 경우만큼 잘 정렬됩니다. 다만 더빙 대사와 원본 대사를 구별하지는 못하므로, 더빙이 대사를 덧붙였다면 정렬은 전체적인 맞춤을 찾아도 덧붙은 구간의 개별 블록은 다른 줄 위에 앉을 수 있습니다.

관련 도구