가이드
Mac이 온디바이스로 오디오를 텍스트로 바꿀 때 실제로 일어나는 일
온디바이스 AI는 구체적이고 꽤 흥미로운 엔지니어링에 붙은 마케팅 문구입니다. 파일에서 텍스트까지, 전체 과정을 정리했습니다.
이제 모든 앱이 "온디바이스"로 처리한다고 말합니다. 그것이 실제로 무엇을 뜻하는지 알아 둘 가치가 있습니다. 로컬 텍스트 변환이 왜 그렇게 빨리 좋아졌는지 설명해 주기도 하고, 직접 검증할 수 있는 주장과 그럴 수 없는 주장을 가르는 지점이기도 하기 때문입니다.
전체 과정을 순서대로 보겠습니다.
1단계: 모든 것이 16 kHz 모노가 됩니다 #
거의 모든 앱이 쓰는 음성 인식 모델 Whisper는 딱 한 가지 입력만 받습니다. 초당 16,000 샘플, 한 채널, -1과 1 사이의 부동소수점 숫자입니다.
그래서 텍스트 변환 도구가 가장 먼저 하는 일은 오디오의 대부분을 버리는 것입니다. 48 kHz 스테레오 녹음은 다운믹스되고 다운샘플링됩니다. 영상 파일은 오디오 트랙만 추출되고 화면은 버려집니다.
파괴적으로 들리지만 대체로 그렇지 않습니다. 사람의 말소리는 8 kHz 아래에 있고, 나이퀴스트 한계에 따라 16 kHz 샘플레이트가 그것을 모두 담아냅니다. 잃는 것은 음악의 품질이지 말의 알아들을 수 있음이 아닙니다.
실용적인 결론은 이렇습니다. 비싸게 얻은 96 kHz 녹음은 이 단계에서 아무런 이득이 없고, 심하게 압축된 파일도 이 단계에서 되살아나지 않습니다.
2단계: 음성 활동 감지가 변환할 가치가 있는 부분을 정합니다 #
훨씬 작은 두 번째 모델이 먼저 돌아가면서 오디오의 어느 부분에 사람의 말소리가 있는지 표시합니다.
흔히 쓰는 모델은 Silero VAD입니다. 1 메가바이트도 되지 않고, 촘촘한 시간 격자 위에서 말소리인지 아닌지 한 가지 질문에만 답합니다.
이것이 존재하는 이유는 둘입니다. 무음을 디코딩하는 것은 낭비이므로 속도가 빨라집니다. 더 중요하게는, 말소리가 없는 오디오를 받은 Whisper가 그래도 텍스트를 만들어 내며 루프에 빠지는 실패를 막아 줍니다. 요즘 로컬 텍스트 변환에서 반복된 문장이 몇 페이지씩 나오지 않게 된 것은 VAD 덕분입니다.
3단계: 오디오가 그림이 됩니다 #
Whisper는 파형을 받아들이지 않습니다. 로그-멜 스펙트로그램을 받습니다. 가로축이 시간, 세로축이 사람의 청각에 맞춘 척도의 주파수, 밝기가 에너지인 2차원 이미지입니다.
현대 음성 인식의 실질적인 도약이 여기에 있습니다. 오디오가 이미지가 되면 컴퓨터 비전을 위해 만들어진 기계 장치를 그대로 쓸 수 있고, 다음 단계에서 정확히 그 일이 일어납니다.
4단계: 인코더가, 되도록 Neural Engine에서 돌아갑니다 #
Whisper는 두 부분으로 이루어진 트랜스포머입니다. 인코더는 스펙트로그램을 읽어 무슨 말이 있었는지를 조밀한 수치 표현으로 바꿉니다. 이쪽이 비용이 큰 절반으로, 고정 크기 입력에 대한 무겁고 규칙적인 행렬 곱셈입니다.
그리고 그것이 바로 Apple의 Neural Engine이 만들어진 목적입니다. 좁은 종류의 연산 하나를 아주 빠르게, 아주 적은 전력으로 처리하는 칩 위의 전용 블록입니다. 범용은 아니어서 임의의 코드를 돌릴 수는 없지만, 트랜스포머 인코더는 정확히 그 모양에 맞습니다.
인코더를 여기에 올리려면 모델을 미리 Core ML의 형식(.mlmodelc)으로 컴파일해야 합니다. 이를 하는 앱은 모델 가중치와 함께 Core ML 인코더를 함께 배포하며, 같은 하드웨어에서 빠른 로컬 텍스트 변환 앱과 느린 앱을 가르는 가장 큰 속도 차이가 여기서 납니다.
5단계: 디코더는 GPU에서 돌아갑니다 #
디코더는 실제 텍스트를 한 번에 토큰 하나씩 만들어 내고, 각 토큰은 그 앞의 모든 것에 조건을 둡니다.
이 절반은 순차적이므로 배치 처리를 지향하는 Neural Engine의 설계에는 맞지 않습니다. 대신 Metal을 통해 GPU에서 돌아갑니다. Apple Silicon에서는 그 GPU가 CPU와 메모리를 공유하므로 모델 가중치를 버스 너머로 복사할 필요가 없습니다. Apple Silicon이 로컬 추론에서 체급 이상의 성능을 내는 큰 이유입니다.
6단계: 타임스탬프도 같은 과정에서 나옵니다 #
Whisper는 단어 사이사이에 특별한 타임스탬프 토큰을 내보냅니다. 그래서 텍스트 덩어리가 아니라 시간이 제대로 맞은 SRT를 얻을 수 있습니다. 시간 정보는 별도의 정렬 단계가 아니라 같은 디코딩 과정에서 함께 떨어져 나옵니다.
VAD가 무음을 건너뛴 경우에는 그 시간 정보를 원래 녹음 위로 다시 대응시켜야 합니다. 그러지 않으면 첫 번째 공백 이후의 모든 타임스탬프가 어긋납니다.
모델, 그리고 생각보다 작은 이유 #
Whisper의 Base 모델은 파라미터가 7,400만 개입니다. 전체 정밀도로는 약 140 MB이고, 이 용도에서는 그중 상당 부분이 중복입니다.
양자화는 각 가중치를 더 적은 비트로 저장합니다. q5_1 모델에서는 가중치가 5비트에 블록별로 작은 배율과 오프셋이 붙어, 가중치당 16비트 대신 대략 6비트가 됩니다. 결과는 약 60 MB이고, 일상적인 발화에서는 정확도 차이를 알아채기 어렵습니다.
140 MB 다운로드와 그에 맞는 메모리가 실제 비용인 휴대폰에서는 중요한 문제입니다. "어떤 모델을 써야 하나"에 대한 솔직한 답이 대개 사람들이 생각하는 것보다 작은 쪽인 이유이기도 합니다.
긴 파일, 그리고 메모리가 어려운 이유 #
Whisper의 API는 연속된 샘플 버퍼 하나를 받습니다. 16 kHz로 두 시간이면 float가 약 470 MB이고, 여기에 비슷한 크기의 스펙트로그램이 더해집니다.
Mac에서는 괜찮습니다. iPhone에서는 앱이 시스템에 의해 종료되기에 충분한 크기이고, 일부 모바일 텍스트 변환 앱이 조용히 파일 길이를 제한하는 이유가 그것입니다.
해법은 구간 단위로 변환하는 것입니다. 디코딩한 오디오를 디스크에 두고, 한 번에 한 조각씩 매핑해 변환하고 해제합니다. 그러면 최대 메모리가 파일이 아니라 구간에 달리게 됩니다. 미묘한 부분은 어디서 자르느냐입니다. 단어 중간에서 자르면 모든 경계마다 문장이 망가지므로, 합리적인 구현은 겹치는 영역 안에서 가장 조용한 지점을 잘라 내고 각 구간의 타임스탬프를 원래 시간축으로 되돌립니다.
이것이 왜 사용자에게 중요한가 #
위의 과정에서 따라 나오는, 마케팅 문구가 아닌 세 가지가 있습니다.
네트워크 없이 동작합니다. 위의 어느 단계도 네트워크를 필요로 하지 않습니다. 30초면 확인할 수 있고, 저희를 믿지 않아도 되는 시험을 포함해 방법을 정리해 두었습니다.
녹음이 누구의 학습 데이터도 되지 않습니다. 로컬 앱이 오디오로 학습하지 않겠다고 약속하는 문제가 아닙니다. 오디오가 애초에 그럴 수 있는 곳에 간 적이 없다는 뜻입니다.
속도는 남의 대기열이 아니라 내 하드웨어에 달려 있습니다. 로컬 텍스트 변환은 Apple Silicon에서 실시간보다 몇 배 빠르게, 일요일 새벽 3시에도 한결같이, 요청 제한 없이 돌아갑니다.
요약 #
오디오는 16 kHz 모노로 다운샘플링되고, 음성 감지가 말소리 없는 부분을 걸러 내고, 남은 것은 스펙트로그램이 되고, 트랜스포머 인코더가 Neural Engine에서 그것을 처리하고, 디코더가 GPU에서 타임스탬프를 섞어 가며 텍스트를 만들어 내며, 양자화 덕분에 이 모든 것이 휴대폰에 들어갈 만큼 모델이 작아집니다.
이 중 어느 것도 서버를 필요로 하지 않고, 그것이 요점입니다.
Offline Transcription 받기
오디오와 영상을 온전히 내 Mac에서 텍스트로 변환합니다. 업로드되는 것이 없고, 계정도 없으며, 분당 요금도 없습니다.