Update된 OpenAI Whisper로 받아쓰기

(이전 버전의 Whisper로 작성했던 글을 새 버전에 맞춰 수정했습니다.)

OpenAI에서 공개한 Whisper는 인공지능 음성 인식 프로그램입니다. Whisper 사용법을 알아봅시다. 실험을 위한 음성 파일이 필요하다면 유튜브 영상에서 음성을 mp3로 추출한 후 사용하면 됩니다.

Youtube에서 mp3 추출하기

!pip install pytube
from pytube import YouTube

video = YouTube(url)
stream = video.streams.filter(only_audio=True).first()
mp3_filename = stream.download(filename="test.mp3")

Whisper models

Whisper는 OpenAI API를 통해 사용할 수도 있고, open source로 공개된 프로그램을 받아서 사용할 수도 있습니다. 2023년 11월 현재 사용 가능한 모델들은 다음 표와 같습니다.

ModelParametersRequired VRAMRelative speed
tiny39 M~1 GB~32x
base74 M~1 GB~16x
small244 M~2 GB~6x
medium769 M~5 GB~2x
large1550 M~10 GB1x
Whisper models

VRAM은 open source 프로그램을 받아서 GPU로 실행할 때 필요한 비디오 메모리 용량을 의미합니다. 영어 전용 모델도 있는데, 여기서는 다국어 모델을 사용하겠습니다. 오류율(character error rates)을 보면 한글의 경우 5% 약간 넘게 틀린다고 하네요.

OpenAI API 이용하기

먼저 API를 이용하는 방법을 보겠습니다. API에서는 large 모델을 제공합니다.

API를 이용하면 사용료가 드는 대신, GPU가 없어도 빠르게 결과를 얻을 수 있습니다. 사용료는 음성 파일 분당 $0.006입니다(2023년 11월). 100분 분량의 음성을 받아 적어도 1000원이 안 됩니다. 직접 받아 적는 노력을 생각하면 저렴하다고 할 수 있겠죠.

입력할 수 있는 최대 파일 크기는 25 MB, 입력 파일의 형식은 mp3, mp4, mpeg, mpga, m4a, wav, webm 형식을 지원합니다. 파일 크기가 크다면 pydub 등을 이용해 잘라서 사용하면 됩니다.

사용법은 다음과 같습니다.

from openai import OpenAI
client = OpenAI(api_key = 'sk-')

def stt(mp3_filename, response_format='text'):
  audio_file = open(mp3_filename, 'rb')
  return client.audio.transcriptions.create(
      model = "whisper-1", 
      file = audio_file, 
      response_format=response_format
      )

text_en = stt(mp3_filename, 'text')

위 코드에서 response_format은 text 외에도 json, verbose_json, srt, vtt 형식을 사용할 수 있습니다. Open source 버전은 사용법이 약간 다릅니다.

Whisper Open Source

Open source 버전도 간단하게 설치해서 사용할 수 있습니다.

! pip install git+https://github.com/openai/whisper.git -q
import whisper
model = whisper.load_model("medium")
result = model.transcribe(mp3_filename)

## results
{'text': "...",
'segments': [
{'id':0, 'start':0.0, 'end':3.0', 'text': "..", ...},
{'id':1, ...}, ...
],
'language': '..'}

결과는 딕셔너리 형식으로, API와 차이가 있습니다. 받아쓰기한 글은 딕셔너리의 text 항목에서 찾을 수 있고, 자동으로 파악한 입력 언어는 language에서 찾을 수 있습니다. segments 리스트에는 시간대별로 나눠진 텍스트가 들어 있습니다. 각 segment의 id와 시작 시간, 마치는 시간 정보도 들어있으니 srt, vtt와 같은 자막 형식이 필요하다면 segments 리스트의 항목들을 이용하면 됩니다.

OpenAI의 공식 Whisper 외에도 CPU에서 빨리 돌아가도록 개선한 whisper.cpp, faster-whisper, 문장이 아닌, 단어 단위 시간을 반환하는 whisperX, whisper-timestamped 같은 모델도 있습니다.

댓글 남기기