Efficient NLP - Fine-tuning Whisper to learn my Chinese dialect (Teochew)
https://youtu.be/JH_78KmP4Zk?si=ulBFE_AFcDeqn-XT
Teochew 라는 중국 방언을 Whisper로 ASR 수행하게 만들기 위한 작업.
Teochew 언어의 특징?
- 사용인구는 대략 10만명 정도.
- 대만에 인접해 있는 중국 본토 소수 지역에서 사용
- 대만어 계열인 Hokkien과 유사. 중국어 분화로만 봤을 땐 만다린어 / 광동어 쪽이긴 하지만 distantly related
Mandarin to Teochew 해주는 translate을 transfer learning하려는 것이 목적.
- 만다린어 계열은 10억 이상이 사용하고 있으며, whisper 인식률이 괜찮은 언어 중 하나.
- 인간에게는 한쪽 언어를 알면, 다른 쪽 언어를 배우기 쉽다고 함.
특이한 점이라면, 하나의 의미를 표현하기 위한 Character 방식이 사람마다 제각각이라는 것. 표준이 없다고 함.
- 일반적으로 'Write'할 때는 standard chinese에 해당하는 한자를 쓰긴 하지만, 그렇지 않은 경우도 생각해야만 한다.
- 중국 방언의 대부분이 이런 문제점을 안고 있다
Teochew는 Really Low-Resource Language.
- multilingual dataset을 다 찾아봐도 이 데이터셋은 거의 없음.
- 오픈소스도 없음.
따라서 모든 데이터셋을 직접 구축해서 써야 함.
유튜브나 빌리빌리 같은 곳에서 중국어 영상을 찾아보면, 만다린어로 된 자막은 볼 수 있다. 퀄리티도 나쁘지는 않음.
- 단, 비디오에 전부 hardcoded 되어 있음. srt 파일로 제공된 게 아니다.
- 그래서 OCR 써서 text로 변환해야 함.
120여 개 비디오 다운받는 데 60여 시간.
Step 1. OCR
이미지 1/3 잘라내서 OCR 돌렸음. PaddleOCR이 제일 성능이 좋았는데, 중국회사가 만든 거라 그런 듯
Step 2. subtitle frames into Segments
OCR 에러는 휴리스틱으로 해결
- based on Levenshtein distance : 에러인지 / different segment 인지 구분하기 위해서.
- 이외에도 OCR의 confidence score나, 직접 봐서 잘못된 것들 일부 수정하는 식
이외에도 120개 비디오 안에서 중복 요소들 제거, 9:1 비율로 train test split 수행.
최종적으로는
- subtitle segment 35000개, 각 segment는 3~5 second
- 35시간 분량 speech
Whisper Model
Whisper는 input으로 audio를 받는다는 점을 빼면, 일반적인 Encoder - Decoder 모델 아키텍처 구조를 그대로 따르고 있음.
input audio의 경우
- Padded to 30s. 30sec보다 짧을 경우 padding
- standard speech / signal processing 수행
- 80 channel spectrogram
- 10ms stride
- 즉, input tensor는 (80, 3000)로 고정된다.
Transformer Encoder -> Decoder, with cross-attention 프로세스 진행.
Whisper 자체는 100여 개의 언어를 지원하고, 680,000 hours of data로 학습된 모델
- large 모델조차도 1 GPU로 serving 가능한 크기.
아키텍처의 특징이라면 Multitask training format을 지원한다는 것.
- Blue Box: actual Data Tokens
- Orange Box: Control Tokens.
Start of transcript부터 프로세스를 짚어보면
- Language Tag: input audio가 어떤 언어인지 모르겠을 때 whisper에 feed. 응답으로 나오는 identification token을 사용함.
- Two task available; Transcribe / Translate into English
- timestamp를 제공하지 않도록 설정 가능 (no timestamp Token)
- get the output of text tokens.
위 task의 경우 lang token=Chinese, no timestamp 방식의 transcribe를 train / decode에 활용한다.
Training
https://github.com/huggingface/community-events/tree/main/whisper-fine-tuning-event#evaluation
huggingface 쪽에서 fine tuning script 예시를 제공하고 있음.
요거 참고할만은 한데, data loading 로직이 필요 이상으로 좀 복잡하다. 여긴 알아서 쉽게 바꿔쓰면 됨.
recommended batch size 제공. 사실 gpu 리소스가 얼마나 있냐에 따라 다르겠지만..
- V100 또는 메모리 16GB 정도로 적을 경우 / A100 또는 메모리 40GB 이상인 경우로 나눠서 제공
https://github.com/huggingface/community-events/tree/main/whisper-fine-tuning-event#tips-and-tricks
adam 8bit optimize 방식을 써서, 보다 적은 gpu memory로도 학습이 가능하도록 만들 수 있다.
- 약간의 accuracy 하락은 있는데, not noticeable.
cf. adafactor는 추천하지 않음.
tensorboard for visualize
학습에 사용한 모델은 small. (240M parameters)
- 10 epoch fine-tuning에 20 hours. medium의 경우 학습시간이 두 배.
Data inspection tools
streamlit for debug / visualize data.
- 3500여 개의 test set으로 WER 수행한 결과물. error rate이 꽤 높다.
- speech not clear (background music / spoken really quickly 같은...)
특정 단어가 testset에 등장했는지 / transcribe 결과는 어떤지 확인할 수도 있다.
Building Evaluation Set
TV show의 데이터를 Evaluation으로 쓰기에는 전반적으로 부적합했다. 그래서 따로 데이터를 만들었다.
- Careful Speech: podcast 대본을 직접 읽는 식으로 확보
- Conversational Speech: 위챗에서 가족들과 대화한 것들 사용
- Use SIL Saymore -> annotate phrases into Mandarin
Result
35시간 가량의 학습 이후.
- medium model이 small보다 10% 정도 성능이 더 낫다.
- medium model은 대략 70% 정도의 careful speech를 이해할 수 있다.
cf. 파라미터 훨씬 큰 Large 모델이 딱히 더 압도적인 성능을 보여주진 않았음. (Bigger GPU 클라우드에서 발급받아 학습시키는 데 $20 정도 들었다)
whisper 모델에서 제공하는 y축 WER, x축 number of audios training on 그래프.
- 더 오래 학습시킬수록 WER가 감소한다.
- 발표에 사용한 task의 경우 대략 30 hours 정도... WER는 대충 2~30 정도 나온다고 함 = Around what we're getting.
Error Rate을 낮추고 싶다면, 더 많은 데이터를 학습시켜야 한다.
Qualitative Evaluation
- 만다린어와 기원이 같은 단어의 경우 굉장히 쉽게 학습함.
- longer clip의 경우 cut off되는 경향이 있었음. 학습 데이터가 3~5초 분량이라서 그런 듯
https://huggingface.co/blog/fine-tune-whisper#building-a-demo
gradio 써서 쉽게 demo 해볼 수 있다는 듯.