TL;DR

  • Parakeet TDT 0.6B 인코더를 음성 데이터 720개로 파인튜닝하고 녹음 앞뒤에 무음 데이터를 추가한 결과, 전체 데이터에서 2.96% WER, 테스트 데이터에서 6.14% WER를 기록함.
  • 디코더와 조인트 네트워크를 고정하고 Conformer 인코더 전체를 학습했으며, 1차 학습에서는 테스트 WER가 11.26%였음.
  • 학습 데이터의 무음 부재가 실제 받아쓰기 성능 저하와 관련된 것으로 보고, 원본 648개와 앞뒤에 무음을 추가한 복사본 648개를 함께 학습함.
  • 모델을 INT8 ONNX로 변환해 인코더 크기를 2.4GB에서 622MB로 줄였으며, 변환 후 테스트 WER는 7.9%였음.
  • M4 Pro CPU에서 2~3초 음성 클립을 약 0.06초에 전사해 일상 업무에 사용 중임.

파인튜닝할 음성 인식 모델 선택

  • Whisper를 기존 음성에 맞춰 파인튜닝해 Whisper Turbo의 WER를 약 6.5%까지 낮췄지만, 일상적으로 쓰기에는 속도가 느렸음.
  • 새 모델을 살펴보며 빠른 추론, 쉬운 파인튜닝, 본인 음성에서 6% 이하 WER를 기준으로 삼음. WER(단어 오류율)은 모델이 잘못 인식한 단어의 비율이며, 낮을수록 좋음.
  • 검토한 모델은 Whisper Small, Nvidia Parakeet, Moonshine임.
  • Whisper Small은 작고 빠르며 파인튜닝하기 쉽지만, Whisper Turbo가 약 6% WER를 기록한 상황에서 더 나은 결과를 기대하기 어렵다고 판단함.
  • Moonshine은 가능성이 있어 보였지만 파인튜닝 자료가 많지 않았음.
  • Parakeet은 인기가 높고 참고 자료가 많아 선택함.

Parakeet 아키텍처

  • Whisper는 전체 어텐션 인코더를 사용하지만, Parakeet 인코더는 어텐션과 합성곱 계층을 결합한 Conformer임. 디코더는 작은 LSTM과 조인트 네트워크로 구성됨.
  • 기존 Whisper 파인튜닝 경험을 적용해 디코더와 조인트 네트워크를 고정하고 인코더만 학습함.
  • Whisper는 오디오를 항상 30초로 패딩한 뒤 처리하지만, Parakeet은 실제 오디오 길이만 처리함. 2.5초 클립의 경우 Whisper는 인코더 스텝 1,500개를 처리하고 Parakeet은 80밀리초 단위로 32개를 처리해, Whisper의 인코더 작업량이 약 47배임.

파인튜닝 데이터와 기준 결과

  • 녹음한 Harvard 문장 720개를 사용함. 학습 세트는 648개(90%), 테스트 세트는 72개(10%)임.
  • 파인튜닝 전 Parakeet은 본인 음성에서 약 22~25% WER를 기록함. 비교 대상으로 언급된 Whisper Turbo의 WER는 53%임.

학습 방식과 1차 시도

  • Whisper는 LoRA로 학습했지만 Parakeet은 인코더 전체를 파인튜닝함. Parakeet의 표준 파인튜닝 방식이 모델 전체 학습이었으며, 30초 패딩으로 느린 Whisper는 제한된 메모리에서 전체 모델 파인튜닝이 어려워 LoRA를 택했던 것임.
  • 1차 학습 설정은 학습률 2e-5였으며, 720개 전체 클립에서 6.7% WER, 테스트 세트에서 11% WER를 기록함.
  • 수치가 좋아 새 문장으로 시험했지만 첫 시도에서 약 40% WER, 재시도에서 50% WER를 기록함.
  • 학습 클립은 약 2초 길이였고 시작과 끝에 무음이 없었음. 실제 받아쓰기에는 녹음 버튼을 누른 뒤 말하기까지의 지연이나 말하는 중간의 생각 등으로 무음이 생김.
  • 짧고 무음이 없는 문장에서는 인식이 잘됐지만 무음이 포함된 새 문장에서는 성능이 크게 떨어짐. 새로 720문장을 녹음하는 대신 방 안의 무음 60초를 녹음하고 각 음성 클립 앞뒤에 무음을 추가하는 방법을 사용함.

무음을 추가한 2차 학습

  • 학습 데이터에 원본 클립 648개와 시작·끝에 각각 0.2~1.5초의 무음을 무작위로 추가한 복사본 648개를 포함해 총 1,296개를 구성함.
  • 테스트 세트에도 같은 방식으로 무음을 추가하고, 실제 환경에 가까운 무음 포함 WER를 기준으로 최적 학습 결과를 선택함.
  • 1차 학습은 648개 클립, 10에포크·810스텝, 배치 크기 8, 학습률 2e-5였음. 2차 학습은 1,296개 클립, 10에포크·1,620스텝, 배치 크기 8, 학습률 1e-5였음.
  • 두 학습 모두 워밍업 50스텝 후 학습률을 1e-6까지 코사인 방식으로 낮췄으며, 디코더와 조인트 네트워크를 고정함.
  • 2차 학습은 전체 720개에서 2.96% WER, 테스트 세트에서 6.14% WER를 기록함. 무음을 넣은 테스트 세트에서는 5.29% WER였음.
  • 1차 학습은 전체 720개에서 6.69% WER, 테스트 세트에서 11.26% WER를 기록했으며, 무음 포함 테스트에서는 43~89% WER를 기록함. 1차 결과를 따로 제시한 요약 수치에는 무음 포함 테스트 22.01%도 기재됨.
  • 2차 학습에서는 무음 데이터 추가 외에도 클립과 학습 스텝을 두 배로 늘리고 학습률을 2e-5에서 1e-5로 낮춤. 낮은 학습률은 모델이 기존에 학습한 내용을 덜 잊게 하는 설정임.
  • 무음이 있을 때와 없을 때 모두 좋은 WER를 확인하고 새 문장 두 개도 시험한 뒤, 추가 파라미터 조정보다 일상 업무에서 먼저 사용하기로 함.

추론과 모델 변환

  • OpenWhispr에서 sherpa-onnx를 통해 Parakeet을 사용할 수 있어 해당 프로그램으로 모델을 시험하기로 함. 이를 위해 모델을 ONNX로 변환함.
  • 기본 부동소수점 모델은 용량이 커 INT8 변환을 적용함. 변환 후 sherpa-onnx로 측정한 테스트 WER는 6.7%에서 7.9%로 소폭 상승함. 이 측정 방식은 학습 중 기록한 6.14%와 약간 다름.
  • 대신 인코더 크기는 2.4GB에서 622MB로 줄어듦.
  • OpenWhispr는 사용자 지정 모델을 직접 지원하지 않아, 프로그램에서 Parakeet을 내려받은 뒤 인코더·디코더·조인트 네트워크·토큰 파일을 파인튜닝 모델의 파일로 교체함.

결과

  • M4 Pro에서 CPU, INT8, 스레드 4개 설정으로 2~3초 클립을 약 0.06초에 전사함.
  • 사용을 시작한 지 2일이 지난 시점에 일상 업무에 충분히 빠르고 결과에도 만족했으며, 장기 사용 결과는 지켜볼 예정임.
  • 전체 학습은 이번에 Kaggle 무료 티어에서 진행함.