AI 블로그 자동화 #8

쇼츠 자막 두 줄이 한 프레임에 겹칠 때, between(t,a,b)는 양끝을 포함한다

AI 블로그 자동화13편 중 8번째

자막 줄마다 보이는 구간을 between(t,a,b)로 걸면 앞 줄 끝과 뒷 줄 시작이 같은 프레임에 두 줄이 같이 찍힌다. gte(t,a)*lt(t,b)로 끝을 빼면 경계 프레임은 뒷 줄에만 속한다.

퇴사 뒤 혼자 AI로 회사를 만들면서, 사람 손 없이 돌아가는 채널을 하나씩 늘려 보고 있다. 9월 28일에는 유튜브 쇼츠 채널 ’미드 한 입’의 첫 편을 고쳐 공개하고, 하루 두 편을 알아서 올리는 파이프라인을 짰다.

미드 한 입은 CC BY 시트콤 장면에 영어·한국어 자막을 얹는 쇼츠다. 화면 위에 시트콤 제목, 가운데에 원본, 아래에 영어와 한국어 자막이 온다. 첫 편은 NickRewind 채널이 CC BY로 올린 Victorious 장면으로 만든 117.9초짜리였고, 비공개로 올려 저작권 검사에서 “소유권 주장이 발견되지 않았습니다”까지 받아 둔 상태였다.

공개 직전에 본 겹침

공개하라고 시키면서 AI에게 한 줄을 덧붙였다. “자막이 대사마다 겹치는 경우도 있어 영상 점검 한번 더 하고 파이프라인을 짜봐라.”

점검해 보니 27.00초 프레임에 두 줄이 같이 찍혀 있었다. 자막 시각표만 보면 두 줄은 겹치지 않는다. 앞 줄이 끝나는 시각과 뒷 줄이 시작하는 시각이 정확히 같았을 뿐이다. 그 상태로 렌더도 업로드도 끝나 있었다.

between은 양끝을 포함한다

자막 줄을 원본 위에 덮어씌우는(overlay) 단계에서, 줄마다 보이는 구간을 between(t,a,b)로 걸어 두었다. t는 지금 프레임의 시각, a와 b는 그 줄의 시작과 끝이다.

between(t,a,b)      # a ≤ t ≤ b  양끝 포함
gte(t,a)*lt(t,b)    # a ≤ t < b  끝은 뺀다

between은 a와 b를 둘 다 포함한다. 앞 줄의 b와 뒷 줄의 a가 같은 값이고 그 시각에 프레임이 하나 떨어지면, 그 프레임에서는 두 줄의 조건이 동시에 참이 되어 자막 두 줄이 한 화면에 올라간다. 대사가 쉬지 않고 이어지는 경계마다 같은 조건이 생긴다. 고친 건 식 하나다. 끝을 빼는 반열린 구간 gte(t,a)*lt(t,b)로 바꾸면 경계 프레임은 뒷 줄에만 속한다.

자막 줄마다 보이는 구간을 식으로 걸고 있다면, 그 식이 끝을 포함하는지 먼저 보고 앞 줄 끝과 뒷 줄 시작이 같은 시각의 프레임을 한 장 뽑아 보세요.

고친 판을 다시 렌더해 공개했고, 겹침이 있던 첫 판은 비공개로 남겨 두었다.

렌더 전에 재는 것

자막을 입히는 스크립트가 렌더 전에 두 가지를 재게 했다. 줄끼리 시간이 겹치는지, 그리고 자막 글이 화면 아래 채널 띠가 있는 1620px 선까지 내려오는지다. 둘 중 하나라도 걸리면 종료 코드 3으로 멈추고 렌더하지 않는다.

처음 무인으로 만든 둘째 편은 Victorious 50.2초에 자막 19줄이었고, 음성 인식(whisper)으로 대사 시각과 대조해 0.3초 안에 들어왔으며 프레임마다 자막이 한 줄씩만 찍힌 것을 확인했다. 이 편은 아직 안 올렸고, 21:30 회차가 첫 무인 게시 시험이다.

← 전체 글