학습일지/AI

Efficient NLP - Fine-tuning Whisper to learn my Chinese dialect (Teochew)

inspirit941 2024. 2. 14. 10:01
반응형

https://youtu.be/JH_78KmP4Zk?si=ulBFE_AFcDeqn-XT

Teochew 라는 중국 방언을 Whisper로 ASR 수행하게 만들기 위한 작업.

Teochew 언어의 특징?

304341063-03a8ac0f-5a32-4b41-a604-a0e9e6e8f52e304341074-2de51d5c-22cf-4b44-aab8-32cf2a0001ac

 

  • 사용인구는 대략 10만명 정도.
  • 대만에 인접해 있는 중국 본토 소수 지역에서 사용
  • 대만어 계열인 Hokkien과 유사. 중국어 분화로만 봤을 땐 만다린어 / 광동어 쪽이긴 하지만 distantly related

304343444-75b2a24d-be89-49f7-88b4-7f6e21aa0353

 

Mandarin to Teochew 해주는 translate을 transfer learning하려는 것이 목적.

  • 만다린어 계열은 10억 이상이 사용하고 있으며, whisper 인식률이 괜찮은 언어 중 하나.
  • 인간에게는 한쪽 언어를 알면, 다른 쪽 언어를 배우기 쉽다고 함.

스크린샷 2024-02-14 오전 10 11 59



특이한 점이라면, 하나의 의미를 표현하기 위한 Character 방식이 사람마다 제각각이라는 것. 표준이 없다고 함.

  • 일반적으로 'Write'할 때는 standard chinese에 해당하는 한자를 쓰긴 하지만, 그렇지 않은 경우도 생각해야만 한다.
  • 중국 방언의 대부분이 이런 문제점을 안고 있다

304345275-4d6e74d0-bfab-4d28-a885-be9a64e8d55b

 

Teochew는 Really Low-Resource Language.

  • multilingual dataset을 다 찾아봐도 이 데이터셋은 거의 없음.
  • 오픈소스도 없음.

따라서 모든 데이터셋을 직접 구축해서 써야 함.

304346285-c642d134-8999-4195-a4ce-2bef4d31597e

 

유튜브나 빌리빌리 같은 곳에서 중국어 영상을 찾아보면, 만다린어로 된 자막은 볼 수 있다. 퀄리티도 나쁘지는 않음.

  • 단, 비디오에 전부 hardcoded 되어 있음. srt 파일로 제공된 게 아니다.
  • 그래서 OCR 써서 text로 변환해야 함.

120여 개 비디오 다운받는 데 60여 시간.

Step 1. OCR

304346918-be9bc769-3fac-4b11-9150-1e754e3962f1

 

이미지 1/3 잘라내서 OCR 돌렸음. PaddleOCR이 제일 성능이 좋았는데, 중국회사가 만든 거라 그런 듯

Step 2. subtitle frames into Segments

304346923-d5529be9-2bf5-4a7d-b42b-1d642d02fb0f

 

OCR 에러는 휴리스틱으로 해결

  • based on Levenshtein distance : 에러인지 / different segment 인지 구분하기 위해서.
  • 이외에도 OCR의 confidence score나, 직접 봐서 잘못된 것들 일부 수정하는 식

304348329-c097b9a0-0f0f-4726-9326-87fe7a497a9b

 

이외에도 120개 비디오 안에서 중복 요소들 제거, 9:1 비율로 train test split 수행.

최종적으로는

  • subtitle segment 35000개, 각 segment는 3~5 second
  • 35시간 분량 speech

Whisper Model

304349183-2f279771-2ef3-4dc6-85bb-b4a21f5ee19e

 

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)로 고정된다.

304350454-fafed888-407a-4626-a377-3032c6e9b908

 

Transformer Encoder -> Decoder, with cross-attention 프로세스 진행.

Whisper 자체는 100여 개의 언어를 지원하고, 680,000 hours of data로 학습된 모델

  • large 모델조차도 1 GPU로 serving 가능한 크기.

스크린샷 2024-02-14 오전 10 17 11



아키텍처의 특징이라면 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 예시를 제공하고 있음.

https://github.com/huggingface/community-events/blob/main/whisper-fine-tuning-event/run_speech_recognition_seq2seq_streaming.py

요거 참고할만은 한데, data loading 로직이 필요 이상으로 좀 복잡하다. 여긴 알아서 쉽게 바꿔쓰면 됨.

https://github.com/huggingface/community-events/tree/main/whisper-fine-tuning-event#recommended-training-configurations

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

304357446-9613b4d9-a2d0-405f-bdc1-a1befa816b9d304357452-b0a4c74e-b9ff-4ff4-9720-ab726d2db5da

 

학습에 사용한 모델은 small. (240M parameters)

  • 10 epoch fine-tuning에 20 hours. medium의 경우 학습시간이 두 배.

Data inspection tools

304357929-d03ff306-2fca-442d-b96b-4e6b10392a51304357938-1ed17e75-950d-42f7-bc2d-84e76b76a0c5

 

streamlit for debug / visualize data.

  • 3500여 개의 test set으로 WER 수행한 결과물. error rate이 꽤 높다.
    • speech not clear (background music / spoken really quickly 같은...)

304359222-6db56363-6277-43a8-9f3e-7d0acad52f0c

 

특정 단어가 testset에 등장했는지 / transcribe 결과는 어떤지 확인할 수도 있다.

Building Evaluation Set

304359780-115a44db-bbcd-4742-93aa-885805f43b91

 

TV show의 데이터를 Evaluation으로 쓰기에는 전반적으로 부적합했다. 그래서 따로 데이터를 만들었다.

  • Careful Speech: podcast 대본을 직접 읽는 식으로 확보
  • Conversational Speech: 위챗에서 가족들과 대화한 것들 사용
    • Use SIL Saymore -> annotate phrases into Mandarin

Result

스크린샷 2024-02-14 오전 10 21 28



35시간 가량의 학습 이후.

  • medium model이 small보다 10% 정도 성능이 더 낫다.
  • medium model은 대략 70% 정도의 careful speech를 이해할 수 있다.

cf. 파라미터 훨씬 큰 Large 모델이 딱히 더 압도적인 성능을 보여주진 않았음. (Bigger GPU 클라우드에서 발급받아 학습시키는 데 $20 정도 들었다)

304361251-1505ecd6-9fc9-44be-8d94-f253cd1c5474

 

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

304362804-19e371e6-c509-4538-88d5-8a8790042e25

 

  • 만다린어와 기원이 같은 단어의 경우 굉장히 쉽게 학습함.
  • longer clip의 경우 cut off되는 경향이 있었음. 학습 데이터가 3~5초 분량이라서 그런 듯

https://huggingface.co/blog/fine-tune-whisper#building-a-demo

gradio 써서 쉽게 demo 해볼 수 있다는 듯.

반응형