Whisper로 강의록 만들기

Intro

이 글에서는 openai에서 한달 전 공개한 general-purpose speech recognition model인 Whisper을 이용해 강의록을 만드는 법을 서술합니다!

필요한 것은 CUDA가 사용 가능한 기기입니다. CPU inference도 가능은 할 거라 짐작하지만 CUDA 를 사용할 때보다 훨씬 느립니다.

자신의 컴퓨터가 CUDA가 사용 가능한지 판단하기 위해서는

  1. 그래픽카드를 확인한다. 보통 NVIDIA 그래픽카드면 지원이 되는데 아주 옛날 모델은 안될 수 도 있습니다. RTX 1060, 1080, 2060, 2080, 3080 등 가정용(게임용)으로 쓰는 모델은 대부분 가 능합니다.
  2. 그래픽카드 드라이버 버전을 확인한다. 최신 드라이버면 좋지만 1년 정도 지난 드라이버도 왠만하면 괜찮습니다.

만약 자신의 컴퓨터에서 CUDA가 실행 불가능하다면 해결 방법은 2가지가 있습니다.

  1. Google 코랩을 이용합니다. 구글 코랩을 이용하면 K80과 같은 GPU을 어느 정도 제한 하에 무 료로 쓸 수 있으며, 관련한 튜토리얼은 이 글에서 서술하지 않습니다.
  2. Whisper C++ 포팅을 이용하는 방법도 있습니 다. medium.en 모델, Macbook M1 Pro 기준 영상 시간 3분 24초를 57초에 처리했다고 하니 써볼만한 방법으로 보입니다. 관련된 설명은 이 글에 적지는 않겠습니다.

이 글은 컴퓨터공학에 대한 1,2학년 수준 교양이 있는 사람을 대상으로 합니다. 너무 기초적인 내용은 이미 제가 세팅을 한참 전에 끝내 놓은 부분이라 빼먹었을 수도 있습니다.

복잡할 거라 겁먹지 마세요! 글은 좀 긴데, 실행해야 하는 커맨드는 아래 몇 줄 밖에 없습니다. 아래 커맨드가 각각 어떤 용도인지는 차후 글에서 설명합니다. 아래 커맨드를 전부 무지성 복붙하지는 마세요..

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))


choco install anaconda3 cuda ffmpeg
conda create -n whisper python=3.9 -y
conda activate whisper
conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch -y
pip install git+https://github.com/openai/whisper.git

Environmental Settings

일단 ML 리서처나 ML 엔지니어라면 당연히 이미 설정해 두었을, 환경 설정 부분을 서술합니다. 이미 설정해둔 사람은 스킵하면 됩니다.

1. Chocolatey 설치

Chocolatey란 Linux의 apt 비슷한 패키지 매니저입니다. 쉽게 말해 notion, 크롬 브라우저, 디스코드 등을 명령어 하나로 설치할 수 있게 해주는 툴입니다.

Chocolatey를 설치하는 법은 https://chocolatey.org/install 이 공식 링크에 잘 나와 있습니다 만, 한글로 간단히 옮겨 드리자면:

  1. Powershell을 관리자 권한으로 실행한다. 아래 스크린샷 UI에서 관리자로 실행 보이시죠?
    Pasted image 20221017223941.png
  2. 아래 명령어를 복사&붙여넣기해서 실행한다. (아래 설치 명령어는 시간이 지나며 바뀔 수 있 으니 유의해야 합니다.)
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))   

그럼 끝입니다. chocolatey를 설치한 이상, 앞으로 choco install (패키지이름)관리자 권한으로 실행한 Powershell 위에서 실행하면 해당하는 패키지가 한번에 설치됩니다. 관리자 권 한으로 실행하지 않으면 예상치 못한 오류가 나타날 수 있으니 유의하셔야 합니다. (관리자 권한이 아니면 한번 경고 메시지를 띄워 주긴 합니다.)

chocolatey의 간단한 사용법에 대해 알려드리겠습니다. 만약 자신이 디스코드를 chocolatey를 통해 설치하고 싶다고 가정해 봅시다.

  1. 먼저 아래 웹페이지에 들어가서 discord를 검색해봅니다.
    https://community.chocolatey.org/packages
    그럼 아래와 같이 검색 결과가 나옵니다.
    Pasted image 20221017230443.png
    나온 대로 Discord 1.0.9005(검색 결과 최상단에 나온 거)를 설치하고 싶다면, choco install discord를 입력하면 됩니다. 스크린샷에 설치 커맨드 나와 있는 거 보이시죠?
    아니면 커맨드라인으로 choco find discord 처럼 입력해도 무방합니다. 다만 이 경우 이 패키 지가 뭐하는 패키지인지 자세한 정보를 확인하기 힘들다는 단점이 있습니다.

  2. 위에서 찾은 명령어대로 choco install discord를 관리자 권한으로 실행한 파워셀에서 실행합니다.
    여담입니다만 powershell보다는 Windows Terminal이 미관상 좋습니다만 필요 없는 사람 은 굳이 설치할 필요 없습니다. Windows 11부터는 기본 제공이고 Windows 10은 사용자가 설치해 야 될겁니다.
    Pasted image 20221017230749.png

  3. 제거하고 싶으면 choco uninstall discord 처럼 install만 uninstall로 바꿔주면 됩니다.

2. anaconda 설치

anaconda가 뭔지 아주 간략히 설명해 드리자면, 가상환경을 조성하는 데 쓰는 프로그램입니다만 주로 파이썬 패키지를 가상환경에 설치하는데 씁니다.

choco install anaconda3
관리자 권한으로 실행한 파워쉘 위에서 위 커맨드를 실행하면 설치됩니다.

3. cuda 설치

choco install cuda
마찬가지로 관리자 권한으로 실행합니다. 설치 중간 모니터 껏다켜짐이나 설치 후 재부팅 등이 필요할 수 있습니다.

4. ffmpeg 설치

anaconda, cuda는 pytorch를 돌리기 위해 필요해서 설치했고, ffmpeg는 whisper을 설치하기 전 필요한 프로그램이어서 설치해야 합니다.

choco install ffmpeg

위 명령어 실행하면 설치됩니다. 이 쯤 되면 왜 굳이 chocolatey를 설치하라고 했는지 감이 오실겁니다. 무슨 프로그램이든지간에 chocolatey에 등록이 되어 있으면 한 줄로 설치가 됩니다.

Whisper 설치

1. Anaconda 가상환경 설정

anaconda 위에서 whisper을 설치하기 위한 전용 가상환경을 따로 만들어 주는 것이 좋습니다. anaconda를 자주 써본 사람이라면 익숙한 이야기일겁니다.

conda create -n whisper python=3.9 -y

위 명령어로 whisper라는 이름의 python 3.9가 설치된 가상환경을 만듭니다. 이후 반드시 conda activate whisper을 통해 whisper라는 가상환경을 활성화(activate)시켜준 후 pytorch과 whisper을 설치해야 합니다. whisper을 activate 시키지 않고 무언가를 설치하면 base, 가장 기본 가 상환경에 무언가가 설치되게 되고 그러다가 base environment가 망가지면 좋지 않은 일이 일어날 수 있습니다. (경험담)

주의: 터미널 종류에 따라 anaconda 가상환경 설정이 되지 않을 수 있습니다. 그럴 경우 해당 터미널에서 conda init을 입력해주면 자동으로 그 터미널에서 앞으로 anaconda를 사용할 수 있도록 해줍니다만, 혹시 안 되는 경우 해결책을 따로 구글링해보셔야 됩니다. 혹시 필요하다면 이 글을 참고해보세요.

2. pytorch 설치

Whisper을 설치할 때 pytorch가 설치되어 있지 않으면 자동으로 설치해 주긴 합니다만 경험상 pytorch를 직접 설치하지 않고 디펜던시가 pytorch인 패키지를 설치하며 pip가 pytorch를 설치하게 냅두면 좋지 않은 일이 일어납니다. 그 예시는 다음과 같습니다.

  1. torch를 설치해주지만 torchvision torchaudio cudatoolkit 등 필요한 디펜던시를 싹 다 무시하고 설치해줍니다.
  2. cpu 버전 torch를 설치해주는 경우도 있었습니다.

그러니까 꼭, 반드시, pip로 whisper 설치 도중에 설치가 안 되어 있던 pytorch를 불완전하게 설치하도록 냅두지 말고, whisper 설치 전에 pytorch를 완전히 설치해야 합니다.
짐작하기로 pip install이 아니라 conda install로 whisper로 설치한다면, pip보다 conda가 디펜던시를 엄격하게 따져주기에 문제가 없을 것 같으나 whisper 공식 github에 pip로 설치하는 방법만 나와 있으니 가능한 방법은 아닙니다. 애초에 pytorch를 기반으로 한 패키지를 제작하는 개발자는 이걸 설치하는 사람 컴퓨터에 pytorch가 설치되어 있지 않을 거라 가정하지 않습니다. 그냥 꼭 pytorch 먼저 설치하고 다른 거 설치하세요.

일단 pytorch는 이 https://pytorch.org/get-started/locally/ 링크에서 설치 방법을 알려주고 있습니다. 마찬가지로 영어 글이 많으니 한 줄로 요약하자면, CUDA 최신 버전을 설치해 두셨다면 그냥 conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch 입력하면 pytorch가 설치됩니다.

2.1 (Optional) cuda 사용 가능 여부 확인

Pasted image 20221017225940.png

위 스크린샷과 같이 python으로 torch.cuda.is_available()을 입력해 True가 나온다면(당연히 import torch 먼저 실행해야 합니다) CUDA가 사용 가능한 것으로, 성공적으로 pytorch를 설치했으리라 짐작할 수 있습니다. False가 나온다면 무언가 좋지 않은 일이 있는 것으로 원인을 찾아 해결해야 합니다. 혹시 이렇게 되면 원인은 다 케바케니 알아서 해결하셔야 됩니다..

3. whisper 설치

이제 whisper을 설치하면 됩니다. whisper 설치법은 공식 github repository https://github.com/openai/whisper 에 잘 나와 있습니다만, 이 글에서는 한글로 간단하게 옮겨서 서술합니다.

pip install git+https://github.com/openai/whisper.git
마찬가지로 한 줄로 설치가 됩니다.

완료!

이제 whisper을 마음대로 사용하면 됩니다. 일단 whisper을 커맨드라인에서 실행해 봅시다.
Pasted image 20221017231252.png

그럼 이런 식으로 어떻게 인자를 입력해서 실행해야 하는 것인지 알려줍니다. 예를 들어 설명해 드리겠습니다. D:\Users\MilkClouds\Documents\강의소개.mp4의 강의록을 추출하고 싶다고 합시다.

  1. 터미널을 켭니다. Windows Terminal이든 Powershell이든 뭐든 anaconda 가상환경이 사용 가능한 거면 됩니다. 그리고 conda activate whisper로 가상환경을 활성화합니다.
  2. cd (경로) 명령어를 통해 강의 파일이 존재하는 위치로 이동합니다.
  3. whisper (파일명)으로 강의록을 추출합니다.

Pasted image 20221017231906.png

자세한 예시는 위 스크린샷을 참고하시면 됩니다. 참고로 가상환경 활성화 안 하면 위 스크린샷처럼 오류 납니다.

Pasted image 20221017232045.png
기본 설정이 small 모델을 사용하므로 더 작은 tiny나 더 큰 모델을 사용하고 싶다면 --model medium ,--model tiny 등을 붙여주면 됩니다. 예를 들어, 위의 예제에서 whisper 강의소 개.mp4 --model medium 처럼 바꿔 실행하면 됩니다. 써본 경험으로 small 정도면 나쁘지 않은 성능을 보여주고 tiny면 알아보기 힘들 정도로 좋지 않았습니다. medium은 이상하게 오히려 small보다 나쁜 느낌이었고 large는 가장 무거운 만큼 가장 좋았습니다.

medium까지는 왠만하면 문제 없을텐데 large 모델의 경우 자신이 사용하는 GPU의 VRAM이 작을 경우(8GB 등) 실행이 되지 않을 수 있습니다.

실행 후에 srt, vtt 등 자막 파일도 알아서 만들어주기 때문에 자막과 영상을 동시에 틀어놓고 볼 수도 있습니다.
Pasted image 20221017232157.png

출력 결과 예시

large 모델 기준 출력입니다. 40분 영상 처리에 RTX 3080으로 20분가량 걸렸습니다. 영어와 한국어를 섞어서 말함에도 잘 분리해서 서술함을 확인할 수 있습니다. 좀 특이하게 DDoS를 ddos나 디도스가 아니라 DDoS라 써놓은 걸 보니 Whisper도 DDoS가 뭔지 알고 있는 것 같습니다. 학습 데이터에 있었나봅니다.
Pasted image 20221017232315.png

GPU 사용 전력 200W에 20분이니 66Wh정도 먹고 뭐 비싸야 영상 하나에 백원 단위로 전기비가 나 가는 것 같습니다.

번외: 클로바 노트와의 비교

강의록을 만들어주는 대중에게 공개된 서비스 중 클로바에서 개발한 클로바 노트가 있습니다.
Pasted image 20221017232648.png
위는 클로바 노트의 출력인데, 화자가 2명이 아니라 1명임을 지정해 줘야 하는데 그 화자 수 조 정하는 UI를 제가 보지 못해서 설정하지 못해 위와 같은 출력이 나온 것 같습니다. 아무튼, 위 출력만 놓고 보았을 때 STT 결과 자체는 Whisper large보다는 약간 좋지 않은 것 같습니다. (바 로 위의 Whisper large 결과와 같은 시간대의 영상에 대한 출력으로 서로 비교할 수 있습니다.)

다만 당연히 위 출력만 놓고 봐서 whisper가 클로바노트보다 STT 성능이 좋다고는 말할 수 없을 뿐더러, whisper는 large 기준 RTX 3080으로도 inference가 20분이나 걸렸음, 그리고 화자인식이 개입되지 않았음을 감안해야 합니다. 클로바 노트는 이걸 말한 게 누구인지 화자인식까지 해주 는데다 inference 시간도 거의 즉시에 가까우니까요.

클로바 노트는 시간 제한 300분이 좀 신경 쓰이기에 whisper을 사용할 수 있는 환경이 갖춰져 있으면 whisper을 쓸만한 가치가 있을 것 같습니다.

번외 2: 사용 중 이상 현상

Pasted image 20221018030800.png
Whisper 공식 github repository를 보면 Whisper이 가끔 환청(hallucination)을 듣는다고 하며 그에 대한 이유를 추측해 둔 부분이 있습니다.

저 역시 Whisper을 사용하며 같은, 아니 어쩌면 저자가 언급한 것과 같지 않을 수도 있는 현상을 겪었습니다. 위 스크린샷이 그 내용인데..

먼저 영상에서 "두번째 row는" 이라고 말했고, Whisper은 똑바로 인식했습니다.

이후 "한 바이트씩 왼쪽으로" 영상에서 말했으나 "S1 바이트씩 왼쪽으로"라고 Whisper은 '들었고', 이후 "얘는 얘로 가고, 얘는 얘로 가고, 맨 앞에 있는 맨 뒤로"라고 말했으나 "S2 바이트씩 왼쪽으로"라고 Whisper은 '들었습니다'.

이후 계속 '바이트씩 왼쪽으로'라는 말은 전혀 하지 않았으나 Whisper은 계속 S1, S2, S3, ...S46 바이트씩 왼쪽으로 라고 들었고, 'Sinating'라는 문구로 끝이 났습니다. 'Sinating'이라는 문구 역시 영상에서는 말하지 않았습니다.

Pasted image 20221018031337.png
"다 impossibble 하다" (영상에서는 "다 invertible하다"였으나 "다 inversable하다" 정도로 발음이 들렸고 그것을 Whisper가 impossible으로 들은 것으로 보입니다)부터가 실제 영상에서 말했던 부분이고 그 이전까지는 실제 영상 내용과 일절 관련 없습니다.

굉장히 기묘한 현상인데, 무언가 Whisper이 중간에 '망가지도록' 하는 키워드나 작용 기전이 존재하지 않을까 추측이 됩니다.

비슷한 경험을 한 사람이 더 있는 듯합니다: https://twitter.com/lunixbochs/status/1574848911503634432