가이드
변환된 텍스트가 같은 문장을 계속 반복하는 이유
녹음 탓도 아니고 다운로드가 깨진 것도 아닙니다. 아무도 말하지 않을 때 Whisper가 하는 일이며, 이를 막는 구체적인 방법이 있습니다.
긴 녹음을 텍스트로 변환하고 파일을 열어 보면 중간 어딘가부터 이렇게 됩니다.
[ Silence ]
[ Silence ]
[ Silence ]
[ Silence ]
더 나쁜 경우에는 파일 앞부분의 실제 문장 하나를 골라 그럴듯한 타임스탬프와 함께 마흔 번 반복합니다. 마치 누군가 1분 동안 초당 한 번씩 "시청해 주셔서 감사합니다"라고 말한 것처럼요.
자동 텍스트 변환에 대한 가장 흔한 불만이고, OpenAI의 Whisper를 기반으로 한 거의 모든 도구가 어떤 형태로든 겪습니다. 원인을 이해할 가치가 있습니다. 해결책이 "더 큰 모델을 사세요"가 아니기 때문입니다.
실제로 일어나는 일 #
Whisper는 언어 모델입니다. "단어를 듣고 받아 적는" 것이 아니라, 오디오와 지금까지 쓴 내용을 바탕으로 다음에 올 가능성이 가장 높은 텍스트 덩어리를 예측합니다.
이 관점이 이 결함을 설명합니다. 오디오에 말소리가 있으면 다음에 올 가능성이 가장 높은 텍스트는 지금 말해지는 단어들입니다. 오디오에 말소리가 없으면(멈춤, 방의 잔향, 대기 음악, 박수, 강사가 칠판 쪽으로 걸어가는 시간) 모델은 그래도 무언가를 내놓아야 합니다. "여기에는 아무 일도 없었다"에 해당하는 토큰은 없습니다.
그래서 언어 모델이 신호가 없을 때 하는 일로 되돌아갑니다. 자기 말을 반복하는 것이죠. 방금 문장 하나를 썼고, 통계적으로 그 문장의 가장 유력한 다음 내용은 비슷한 문장이며, 그 추측을 반박할 것이 오디오에 없으니 루프를 돕니다. Whisper는 오디오를 30초 창 단위로 처리하므로, 한 창이 루프에 빠지면 그 창 내내 같은 줄이 나오고, 다음 창은 새로 시작했다가 흔히 같은 일을 반복합니다.
그래서 이 문제는 아주 특정한 양상으로 나타납니다.
- 긴 녹음. 무음이 더 많이 들어 있기 때문입니다.
- 파일의 중간과 끝. 중요한 부분이 끝났는데 녹음기는 계속 돌아가고 있을 때입니다.
- 음악과 박수. 단어 없이 밀도만 높은 오디오입니다.
- 화자는 조용하고 방은 시끄러운 녹음. 모델이 둘을 분리하지 못하는 경우입니다.
마이크 가까이에서 진행한 5분짜리 인터뷰에서는 거의 일어나지 않습니다. 모두가 떠난 뒤로도 녹음기가 20분 더 돌아간 두 시간짜리 회의에서는 거의 항상 일어납니다.
"[ Silence ]"와 "[BLANK_AUDIO]"가 같은 원인의 별개 증상인 이유 #
Whisper의 학습 데이터에는 [ Silence ], [BLANK_AUDIO], (music), ♪♪♪ 같은 대괄호 주석이 붙은 텍스트가 포함되어 있었습니다. 그래서 말소리가 아닌 것을 만나면 그런 표시 중 하나를 내놓을 가능성이 높고, 그것이 계속 반복됩니다.
이쪽이 그나마 나은 형태입니다. 적어도 거기에 아무것도 없다는 사실은 정직하게 말하니까요. 그래도 문서를 수백 줄의 쓰레기로 채우고, 도구가 무음을 디코딩하는 데 실제 시간을 쓰고 있다는 뜻이기도 합니다.
해결하는 네 가지 방법 #
효과가 좋은 순서에 가깝게 정리했습니다.
1. 음성 활동 감지 (진짜 해결책) #
음성 활동 감지, 즉 VAD는 텍스트 변환 이전에 돌아가면서 오디오의 어느 부분에 사람의 말소리가 있는지 표시하는 작고 독립적인 모델입니다. 그런 다음 변환기에는 그 부분만 넘어갑니다.
이것은 문제를 근원에서 해결합니다. 루프는 Whisper가 말소리 없는 오디오를 받았을 때만 생기기 때문입니다. 무음이 모델에 닿지 않으면 지어낼 대상 자체가 없습니다. 빈 방 20분을 디코딩하는 비용을 더 이상 치르지 않으므로 긴 파일이 더 빨라지기도 합니다.
널리 쓰이는 것은 Silero VAD이고, 최근 버전의 whisper.cpp가 이를 직접 지원합니다. 쓰는 앱에 VAD나 "무음 건너뛰기" 옵션이 있다면 켜세요. 없다면 개발자에게 요청할 만한 합당한 사안입니다.
2. 무음을 직접 잘라내기 #
도구에 VAD 옵션이 없다면 손으로 거친 방식을 쓸 수 있습니다. 변환하기 전에 녹음의 앞뒤를 잘라 내어, 짐 싸는 소리 20분이 아예 처리되지 않게 하는 것입니다.
어떤 오디오 편집기로도 됩니다. 번거롭고 파일 중간의 무음에는 아무 도움이 되지 않지만, "끝에 녹음기가 오래 돌아갔다"는 아주 흔한 경우라면 30초면 되고 최악의 부분을 없애 줍니다.
3. 사후에 표시를 걸러 내기 #
텍스트가 [ Silence ]와 ♪♪♪로 가득하다면, 알아볼 수 있는 형태의 온전한 줄이므로 찾아 바꾸기로 쉽게 지울 수 있습니다.
한 가지만 조심하세요. 전체가 표시인 줄만 지워야 합니다. "그리고 나서 — (웃음) — 우리는 출시했죠" 같은 줄은 실제 말이므로 남겨야 합니다. 좋은 앱이라면 바로 이 규칙을 대신 적용해 줍니다.
4. 파일 쪼개기 #
루프가 Whisper의 창 안으로 제한되기 때문에, 긴 녹음을 짧은 조각으로 나누면 피해가 줄어듭니다. 나쁜 창 하나가 반복의 벽으로 이어지는 대신 1분만 망가집니다. 일부 앱은 내부적으로 이렇게 합니다.
이는 해결책이라기보다 우회책입니다. 피해 범위를 줄일 뿐, 모델이 무음 위에서 지어내는 것을 막지는 못합니다.
해결되지 않는 것 #
더 큰 모델. Base에서 Large로 가면 시간과 디스크를 많이 쓰면서도 루프는 사라지지 않습니다. 원인이 용량 부족이 아니라 말소리가 없는 것을 변환하라고 요구받은 데 있기 때문입니다. 큰 모델도 루프를 돕니다. (크기의 절충에 대해 더 읽어 보세요.)
클라우드 서비스. 좋은 클라우드 도구는 파이프라인에서 VAD와 후처리를 돌리기 때문에 이 문제를 덜 겪습니다. 그 아래의 원리는 같고, 조용한 파일에서 "감사합니다"를 쉰 번 내놓는 서비스도 많습니다. 분당 요금을 낸다고 다른 디코더를 사는 것은 아닙니다.
다시 돌리기. Whisper의 샘플링은 완전히 결정적이지 않아서 두 번째 시도에서는 다른 곳에서 루프가 생길 수 있습니다. 해결이 아니라 동전 던지기입니다.
저희는 어떻게 하는가 #
여기서 두루뭉술한 답은 쓸모가 없으니 구체적으로 말씀드립니다.
Offline Transcription은 변환 전에 Silero VAD를 돌려서, 무음과 말소리가 아닌 구간이 디코더에 닿지 않게 합니다. 그 위에 [ Silence ] 같은 구간 전체 표시와 음악 기호만 있는 줄은 결과에서 걸러 내되, 대괄호 안의 삽입구를 포함하기만 하는 줄은 실제 말이므로 남깁니다.
긴 파일에서는 구간 단위로 변환하면서 각 구간을 오디오에서 가장 조용한 지점에서 끊습니다. 그래서 경계가 문장을 가로지르지 않고 문장 사이에 놓입니다.
솔직하게 덧붙이면, 이렇게 해서 반복 문제가 아주 드물어지는 것이지 불가능해지는 것은 아닙니다. 저희 것을 포함해 Whisper 기반 도구는 모두 예측하는 언어 모델이고, 예측하는 모델은 틀릴 수 있습니다. 정확도가 중요한 것을 변환한다면, 근거로 삼을 부분은 텍스트를 오디오와 대조해 읽어 보세요. 인터뷰 가이드에 그 빠른 방법이 나와 있습니다.
요약 #
루프는 말소리가 없는 오디오에 대해 Whisper가 텍스트를 예측하는 현상입니다. 음성 활동 감지는 그런 오디오를 아예 보여 주지 않음으로써 원인을 없앱니다. 도구에 VAD가 없다면 무음을 잘라내고 표시를 걸러 내는 것이 도움이 됩니다. 더 큰 모델은 전혀 도움이 되지 않습니다.
Offline Transcription 받기
오디오와 영상을 온전히 내 Mac에서 텍스트로 변환합니다. 업로드되는 것이 없고, 계정도 없으며, 분당 요금도 없습니다.