에트리 인턴과정 중 whisper 를 써 보라고 하셔서 기록을 남긴다.
1. whisper 사전 설정 및 설치
필자는 윈도우 기반의 데스크탑을 사용하여서 window 만 기술한다. 혹시 다른 운영체제가 궁금하면 whisper github 의 readme 를 참조하면 된다.(https://github.com/openai/whisper)
환경 : anaconda, jupyter lab, python 3.9, win 11
1.1. whisper python 실행을 위한 설치
pip install git+https://github.com/openai/whisper.git
1.2. whisper 커맨드라인 실행을 위한 설치
whisper 는 python 코드 뿐 아니라 커맨드라인에서도 동작할 수 있도록 지원한다. 밑은 이를 위한 사전설정이다.
window 에서 ffmpeg 을 설치하기 위해 chocolatery 를 추가로 설치했다.
# window powershell 에서 관리자 권한으로 실행하면 됨
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 를 성공적으로 설치했으면 밑의 커맨드라인을 이용하여 ffmpeg 을 설치한다.
# on Ubuntu or Debian
sudo apt update && sudo apt install ffmpeg
# on Arch Linux
sudo pacman -S ffmpeg
# on MacOS using Homebrew (https://brew.sh/)
brew install ffmpeg
# on Windows using Chocolatey (https://chocolatey.org/)
choco install ffmpeg
# on Windows using Scoop (https://scoop.sh/)
scoop install ffmpeg
2. python 코드 작성
import whisper
import os
import numpy as np
import torch
torch.cuda.is_available() # cuda gpu 가 잡히는지 확인
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
print(torch.cuda.is_available())
print(torch.rand(10).to(DEVICE))
torch.cuda.current_device()
# TODO : 작업을 실행할 mp3 파일 변수로 바꾸기 --> 유지보수용
targetDirPath = ""
targetFileName = "1_10004.mp3"
targetFilePath = targetDirPath + targetFileName
# whisper.load_model 은 model 을 호출하는 부분이다.
# model 종류는 tiny, base, small, medium, large 가 있다.
# 자세한 스펙은 아래 깃헙 주소로 들어가서 확인하면 된다.
model = whisper.load_model("base", device=DEVICE)
print(
f"Model is {'multilingual' if model.is_multilingual else 'English-only'} "
f"and has {sum(np.prod(p.shape) for p in model.parameters()):,} parameters."
)
audio = whisper.load_audio(targetFilePath)
audio = whisper.pad_or_trim(audio)
mel = whisper.log_mel_spectrogram(audio).to(model.device)
_, probs = model.detect_language(mel)
print(f"Detected language: {max(probs, key=probs.get)}")
# language option 은 본인이 텍스트화 하고 싶은 언어를 선택한다.
# 필자의 데이터셋은 한국어이므로 language="ko" 로 설정하였다.
# without_timestamp 는 시간을 기록하지 않는 플래그인데 시간이 필요해서 False 로 두었다.
options = whisper.DecodingOptions(language="ko", without_timestamps=False, fp16 = False)
result = whisper.decode(model, mel, options)
print(result.text)
# 아래의 transcribe 는 mp3 파일을 텍스트로 변환하여 보여준다.
# text 에 결과값이 저장되는데 나는 문장별로 확인을 해야 해서
# result["segments"] dict 에서 추출하였다.
# result["segments"] 의 객체 구조는 아래와 같다.
# {'id': n 번째 문장(0부터 시작), 'seek': 0,
# 'start': 문장의 시작시간, 'end': 문장의 끝시간,
# 'text': ' 뽑아낸 텍스트.',
# 'tokens': [13929, 8424, 14525, 14841, 30060, 13],
# 'temperature': 0.0, 'avg_logprob': -0.28561086654663087,
# 'compression_ratio': 1.4134078212290502, 'no_speech_prob': 0.12653490900993347}
result = model.transcribe(targetFilePath)
print(result["text"])
print(result["segments"]) # segments 에는 문장별로 분리된 정보가 저장되어 있다.
위의 코드에 대한 설명은 주석으로 달아놓았다.
python 코드의 사용법은 openai-whisper github 에 나와있긴 하나 친절한 편은 아니라서 직접 구글링 해 보는 것을 추천한다.(https://github.com/openai/whisper)
위의 코드는 아래 링크에서 도움을 받았다. 각 코드에 대한 설명이 자세하게 나와 있어서 도움이 많이 되어서 한 번 보는 것을 추천한다.
https://betterprogramming.pub/openais-whisper-tutorial-42140dd696ee
'Deep Learning > NLP, ASR' 카테고리의 다른 글
[NLP / ASR] 오디오 데이터 전처리 관련 공부용 BLOG / 자료 link (0) | 2023.01.25 |
---|---|
[NLP / ASR] pyannote.audio diarization 의문점 정리 (0) | 2023.01.19 |
[NLP / ASR] pyannote-audio 초기설치 / 설정 / dirazation 코드 실행 (0) | 2023.01.12 |