
녹음 앞뒤에 묵음을 넣지 않은 음성으로 학습한 모델은 실제 받아쓰기에서 오류율이 40~50%까지 치솟았다. 녹음에 묵음을 더해 학습한 뒤에는 묵음이 있는 테스트에서 오류율이 5.29%로 낮아졌다.
자신의 음성으로 음성 인식 모델을 미세 조정해 Lisp 작업에 쓰려던 실험에서 Parakeet 모델이 이 변화를 보였다. 일상적인 받아쓰기에 쓸 만큼 빠르고, 자신의 음성에서 오류율 6% 이하를 목표로 하는 사람에게 참고할 만한 사례다.
이 실험에서 쓴 모델은 무엇인가?
Parakeet은 음성을 글로 바꾸는 모델이다. 음성 처리 구조는 어텐션과 합성곱 계층을 결합한 Conformer 인코더와 작은 LSTM 디코더, 두 부분의 출력을 연결하는 결합망으로 이뤄진다. 여러 작업자가 있는 조립 라인을 떠올리면 쉽다. 여기서는 인코더만 학습하고 디코더와 결합망은 고정했다.
Whisper는 입력 음성을 항상 30초 길이로 맞춰 처리하지만, Parakeet은 실제 음성 길이만 처리한다. 2.5초 음성의 예에서 Whisper는 30초에 해당하는 1,500개 인코더 단계를 처리하고, Parakeet은 실제 음성에 해당하는 32단계만 처리한다. Parakeet의 각 단계는 80밀리초 길이의 음성을 다룬다. 이 예에서 Whisper가 인코더 작업을 47배 더 많이 한다는 설명이다.
처음에는 Whisper를 자신의 음성에 맞춰 미세 조정해 Whisper Turbo의 단어 오류율(WER)을 약 6.5%까지 낮췄다. 하지만 일상적으로 쓰기에는 여전히 느렸다. 목표는 빠른 추론, 쉬운 미세 조정, 자신의 음성에서 6% 이하의 오류율이었다. Whisper Small은 빠르고 미세 조정하기 쉬운 선택지였지만 Turbo보다 더 나은 오류율을 얻기 어렵다고 판단했다. Moonshine은 미세 조정 자료가 부족해 보였고, 관련 자료가 많은 Parakeet을 선택했다.
묵음은 왜 결과를 바꿨나?
실험에 사용한 데이터는 직접 녹음한 Harvard 문장 720개였다. 이 가운데 648개(90%)를 학습에, 72개(10%)를 테스트에 썼다. 기본 Parakeet은 이 음성에서 22~25% 오류율을 기록했다. 비교 자료에 적힌 정확한 값은 전체 720개에서 22.88%, 테스트 72개에서 24.23%다. Whisper Turbo의 오류율은 53%였다.
Whisper 미세 조정에는 LoRA를 썼지만, Parakeet에서는 인코더 전체를 미세 조정했다. Parakeet의 일반적인 미세 조정 방식이 모델 자체를 학습하는 것이었기 때문이다. Whisper는 30초 패딩 때문에 느려 제한된 메모리에서 전체 모델을 학습하기 어렵다고 판단해 LoRA를 택했다.
첫 번째 학습에서는 학습률을 2e-5로 설정했다. 전체 720개 음성에서 오류율은 6.7%, 테스트 세트에서는 11%였다. 그런데 새 문장 하나를 넣자 오류율이 약 40%였고, 다시 시험했을 때는 50%였다. 학습 음성은 약 2초 길이였으며 시작과 끝에 묵음이 없었다. 실제 녹음에는 녹음 버튼을 누른 뒤 말하기까지의 간격이나 생각하는 동안의 멈춤이 생기므로, 학습 데이터와 실제 음성의 차이가 문제로 드러났다. 빠르게 말한 새 문장은 잘 처리됐다.
새로 720개 문장을 녹음하는 대신, 60초 분량의 방 안 묵음을 녹음해 각 음성의 앞뒤에 복사본을 붙이는 방식을 제안받았다. 두 번째 학습 세트에는 원본 648개와 시작·끝에 각각 무작위로 0.2~1.5초의 묵음을 넣은 복사본 648개, 총 1,296개가 들어갔다. 테스트 세트에도 같은 방식으로 묵음을 넣은 복사본을 추가했다. 실제 상황에 가까운 묵음 포함 테스트 오류율을 기준으로 가장 좋은 학습 결과를 골랐다.
| 설정 | 첫 번째 학습 | 두 번째 학습 |
|---|---|---|
| 학습 음성 | 648개 | 1,296개(원본 648개 + 묵음 포함 648개) |
| 에포크 / 단계 | 10 / 810 | 10 / 1,620 |
| 배치 크기 | 8 | 8 |
| 학습률 | 2e-5 | 1e-5 |
| 워밍업 / 학습률 일정 | 50단계, 1e-6까지 코사인 감소 | 50단계, 1e-6까지 코사인 감소 |
| 고정한 부분 | 디코더 + 결합망 | 디코더 + 결합망 |
| 오류율(%) | 기본 모델 | 첫 번째 학습 | 두 번째 학습 |
|---|---|---|---|
| 전체 720개 음성 | 22.88 | 6.69 | 2.96 |
| 테스트 72개 음성 | 24.23 | 11.26 | 6.14 |
| 묵음 포함 테스트 음성 | 22.01 | 43~89 | 5.29 |
두 번째 학습은 묵음 추가만 바꾼 실험이 아니다. 학습 음성과 학습 단계가 두 배로 늘었고, 학습률도 2e-5에서 1e-5로 낮췄다. 실험자는 낮은 학습률이 모델이 기존에 알고 있던 내용을 덜 잊게 한다고 봤다. 따라서 개선을 묵음 하나의 효과로 단정할 수는 없다.
일상에서 쓰려면 무엇을 바꿔야 하나?
두 번째 학습 결과는 전체 720개에서 오류율 2.96%, 테스트 72개에서 6.14%였다. 묵음이 있는 테스트에서는 5.29%였다. 첫 번째 학습 결과는 테스트 음성에 1초 묵음을 끝에 붙였을 때 43%, 양쪽에 묵음을 붙였을 때는 대부분 빈 출력이 나와 89%까지 기록했다. 두 번째 결과는 묵음이 있든 없든 잘 처리했고, 새 문장 두 개에서도 좋은 결과를 냈다.
실제 사용에는 OpenWhispr를 선택했다. 이 앱은 sherpa-onnx를 통해 Parakeet을 기본 지원했지만 사용자 지정 모델은 지원하지 않았다. 학습한 모델을 쓰려면 ONNX 형식으로 변환해야 했다. 기본 부동소수점 모델은 용량이 커서 8비트 정수형(int8)으로 변환했다. 변환 뒤 테스트 오류율은 6.7%에서 7.9%로 조금 올랐다. 이 측정은 학습 과정에서 얻은 6.14%와는 달리 sherpa-onnx로 했으며, 두 방식은 오류율을 조금 다르게 계산한다. 대신 인코더 크기는 2.4GB에서 622MB로 줄었다.
사용자 지정 모델을 직접 불러올 수 없어, OpenWhispr에서 Parakeet을 내려받은 뒤 인코더·디코더·결합기·토큰 파일을 자신의 모델 파일로 바꿨다. M4 Pro에서 CPU 4스레드로 2~3초 음성을 변환하는 데 약 0.06초가 걸렸다. 이 모델을 일상 작업에 쓰기 시작한 지는 2일이며, 장기적으로도 만족스러운지는 아직 지켜보는 중이다. 학습은 Kaggle 무료 등급에서 진행했다.
재현하거나 응용하려면 데이터에 실제 받아쓰기에서 생기는 묵음이 포함되는지 확인하고, 테스트 세트에도 같은 조건을 적용할 필요가 있다. 모델 변환 뒤에는 사용하려는 실행 도구로 오류율을 다시 측정해야 한다. 이 실험은 학습 데이터 수와 학습 단계, 학습률도 함께 바꿨으므로 묵음 추가만의 효과를 분리해 보여주지는 않는다. 원문은 학습에 사용한 세부 명령어와 모델 변환 절차, 장기 사용 결과를 밝히지 않는다.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요