로컬 Whisper로 만든 한국어 자막의 한 줄이 공백 포함 최대 44자로 길게 나온 21초 음성에, 받아쓰기는 그대로 두고 SRT를 만드는 줄 길이 옵션만 바꿔 네 번 저장해 봤습니다. 한 줄 최대 글자 수(max_line_width)를 16으로만 정하면 자막 개수는 4개 그대로였고 한 자막 안에 최대 3줄이 쌓였습니다. 줄 수(max_line_count)를 1로 함께 정해야 한 줄짜리 자막 10개로 나뉘었는데, 이때 한 자막이 두 문장에 걸쳤습니다. 단어 수(max_words_per_line)를 3으로 정하면 문장 경계는 지켰지만 0.56초짜리 자막이 생겼습니다. 그래서 어느 설정이든 만들어진 SRT를 그대로 쓰기 전에 한 번 더 확인할 곳이 있었습니다.
어떤 문제였나요?
세로 쇼츠에 자동자막을 올리면 한 줄이 길어 화면 폭을 넘거나 글자를 작게 줄여야 할 수 있습니다. 기본 설정으로 받은 이번 자막은 4개 구간이 모두 한 줄이었고, 가장 긴 줄은 “정체는 거대한 심해 말미잘이 바위에 붙어 있던 밑동의 죽은 세포 흔적이었습니다.”로 공백 포함 44자였습니다. Whisper에는 단어별 시간을 이용해 줄을 나누는 옵션이 있어서, 한국어에서 이 옵션들이 실제로 어떻게 나누는지 확인했습니다.
어떻게 시험했나요?
- 음성: 10월 22일 영상에 실제로 쓴 내레이션 파일 그대로입니다(로컬 VoxCPM2로 만든 합성 음성, 21.12초). 새로 합성하지 않았습니다.
- 받아쓰기: 로컬 Whisper large-v3-turbo(mlx-whisper 0.4.3), 언어 한국어, 단어 시간 켬, 후편집 없음. 어제 글에서 쓴 용어 목록
용어: 말미잘, 알래스카만, 흡입 채집기, 심해.을 initial_prompt로 넣었습니다. 2026년 10월 26일 새벽에 두 번 받아 적었고 두 번의 글자가 같았습니다. - 바꾼 것: 같은 받아쓰기 결과를 SRT로 저장할 때의 줄 옵션 하나입니다.
- A: 옵션 없음(기본)
- B:
max_line_width 16 - C:
max_line_width 16+max_line_count 1 - D:
max_words_per_line 3
결과는 어땠나요?
| 설정 | 자막 개수 | 한 자막 최대 줄 수 | 가장 긴 줄(공백 포함) | 가장 짧은~긴 자막 길이 |
|---|---|---|---|---|
| A 기본 | 4 | 1 | 44자 | 3.50~5.58초 |
| B 폭 16 | 4 | 3 | 16자 | 3.50~5.58초 |
| C 폭 16 + 줄 수 1 | 10 | 1 | 16자 | 0.82~2.42초 |
| D 단어 3개 | 13 | 1 | 15자 | 0.56~2.40초 |
네 설정 모두 어절 중간에서 줄이 끊긴 곳은 없었습니다. 자막을 이어 붙이면 받아쓰기 원문의 어절과 그대로 일치했습니다.
설정마다 무엇이 달랐나요?
B(폭만 정함)는 자막 개수와 시간이 기본과 똑같고 줄만 바뀌었습니다. 세 번째 자막은 “탐사팀이 흡입 채집기로 거둔 / 뒤 연구진이 생김새와 유전자를 / 함께 분석했어요.”처럼 5.58초 동안 3줄로 떠 있었습니다. 줄 폭은 맞췄지만 화면을 더 많이 가립니다.
C(폭 + 줄 수 1)는 모든 자막이 한 줄이 됐습니다. 대신 일곱 번째 자막이 “함께 분석했어요. 정체는”처럼 앞 문장 끝과 다음 문장 첫 어절을 묶었습니다. 원래 두 문장 사이에는 0.68초 쉼이 있었는데 하나의 자막 안으로 들어갔습니다. 마지막 자막 “흔적이었습니다.”는 0.82초만 보였고, “거둔”과 “뒤”도 서로 다른 자막으로 갈렸습니다.
D(단어 3개)는 원래 문장 구간을 넘지 않았습니다. 하지만 세 번째 자막 “뭘까요?”가 0.56초, 아홉 번째 “분석했어요.”가 0.78초로 아주 짧게 지나갔습니다.
왜 C에서는 문장이 섞였나요?
OpenAI Whisper 코드를 보면, 폭과 줄 수를 둘 다 정했을 때만 원래 받아쓰기 구간 경계를 지키지 않고 다시 묶습니다. 이때 새 자막은 정한 줄 수가 다 찼을 때, 또는 단어 사이 쉼이 3초를 넘을 때만 시작됩니다. 이번 음성의 문장 사이 쉼은 0.4~1.1초였기 때문에 줄이 가득 차지 않은 곳에서는 다음 문장 첫 어절이 같은 자막에 붙었습니다. 폭과 줄 수 중 하나만 정하면 원래 구간 경계를 지킵니다. 코드 도움말에는 세 옵션 모두 단어 시간(word_timestamps)이 켜져 있어야 하고, max_words_per_line은 max_line_width와 함께 쓰면 효과가 없다고 적혀 있습니다(2026년 10월 26일 다시 확인). 이번 시험은 mlx-whisper의 SRT 저장 기능으로 했고, 그 줄 나누기 코드는 OpenAI 코드의 같은 조건(구간 유지 조건, 3초 쉼)을 그대로 담고 있었습니다. 출처: openai/whisper utils.py, openai/whisper transcribe.py.
이 결과로 말할 수 없는 것
- 21초 합성 음성 1개의 결과입니다. 사람 녹음이나 더 긴 영상에서 자막 개수·길이가 같게 나온다는 뜻은 아닙니다.
- 16자, 단어 3개는 이번 시험용 값입니다. 어떤 값이 읽기 편한지는 사람이 화면에서 본 결과가 아니어서 판정하지 않았습니다.
- 0.56초 자막이 너무 짧은지, 3줄 자막이 너무 많이 가리는지도 실제 시청자 반응으로 확인한 것이 아닙니다.
- OpenAI의 유료 음성 인식 서비스는 시험하지 않았습니다. 로컬 mlx-whisper와 공개 코드만 확인했습니다.
따라 해 볼 순서
- 먼저 옵션 없이 SRT를 만들고 가장 긴 줄의 글자 수를 셉니다.
- 한 줄 자막이 필요하면 폭과 줄 수를 함께 정합니다. 이번에 실제로 같은 결과를 낸 명령은
mlx_whisper 음성.wav --model mlx-community/whisper-large-v3-turbo --language ko --word-timestamps True --max-line-width 16 --max-line-count 1 --output-format srt입니다(용어 목록은--initial-prompt로 따로 넣었습니다).--model을 빼면 기본값인 작은 모델(whisper-tiny)이 돌아 결과가 달라질 수 있습니다. - 만들어진 SRT에서 마침표·물음표 뒤에 다음 문장 어절이 붙은 자막을 찾아 둘로 나눕니다.
- 1초보다 짧은 자막은 앞뒤 자막과 합치거나 표시 시간을 늘립니다.
- 문장 경계를 꼭 지켜야 하면 단어 수 옵션(max_words_per_line)을 쓰고, 대신 짧게 지나가는 자막을 같은 방식으로 확인합니다.
- 마지막으로 최종 영상 위에서 자막을 직접 재생해 보며 가림과 읽기 속도를 봅니다.
자주 묻는 질문
max_line_width만 넣으면 한 줄 자막이 되나요?
이번 시험에서는 아니었습니다. 줄 폭 16자는 지켰지만 자막 개수는 4개 그대로였고, 한 자막에 최대 3줄이 쌓였습니다. 한 줄로 만들려면 max_line_count 1을 함께 넣어야 했습니다.
한국어인데 단어 중간에서 줄이 끊기지 않나요?
이번 21초 음성에서는 네 설정 모두 띄어쓰기 단위(어절) 중간에서 끊긴 곳이 없었습니다. 다만 “거둔”과 “뒤”처럼 함께 읽어야 할 어절이 다른 자막으로 갈린 곳은 있었습니다.
같은 음성의 받아쓰기 오류를 다룬 글: Whisper 자막이 ‘말미잘이’를 ‘말미자리’로 적을 때: 용어 프롬프트 비교