프로젝트 목표
사람의 음성을 텍스트화 시키고 OpenAI API를 사용해서 내용을 요약하는 것이 목표이다.
Whisper란?
OpenAI에서 개발한 음성 인식(Speech-to-Text) 모델이다. 사람이 말한 음성을 텍스트로 변환해 주는 인공지능이다. 이는 ChatGPT, Notion AI, YouTube 방송 자막 자동화 등 다양한 곳에 쓰이고 있다.
Whisper 모델 종류
파라미터
딥러닝 모델이 학습을 통해 얻은 지식의 양.
tiny 모델은 3900만 개를 가지고 있고 large 모델은 15억 개 이상의 파라미터를 가짐.
tiny
가장 가볍고 빠르지만, 정확도는 가장 낮음.
빠르게 테스트하고 싶을 때 적절.
base
여전히 빠르고, tiny보다 정확도가 개선됨.
빠르게 테스트하고 싶을 때 적절
small
중간 정도의 성능
정확도와 속도 둘 다 고려할 때
medium
우수한 정확도
정확도와 속도 둘 다 고려할 때
large
가장 정확하지만 무겁고 느림
고정확한 인식이 필요할 때
turbo
OpenAI API 전용, 빠르고 정확한 최적화형 모델
상용 서비스화 할 경우
Whisper 모델 선정 기준
GPT한테 물어본 결과, Whisper 모델을 사용하기 위해선 위와 같은 하드웨어 사양이 필요했다. 현재 내가 노트북으로는 겨우 small 모델을 돌릴 수 있는 상황이었다. 그래서 데스크탑의 사양을 확인해봤다.
데스크탑 하드웨어를 본 결과, medium 모델을 사용하기로 결정했다. 물론 OpenAI Whisper API를 사용하는 방법도 있지만 유료이기 때문에 채택하지 않았다.
Hugging Face란?
AI 모델, 데이터셋, 관련 도구를 공유하고 협업하는 플랫폼이자 커뮤니티이다. 개발자들이 코드를 공유하는 깃허브처럼, 허깅페이스는 AI 모델과 데이터셋을 나누고 함께 성장하는 공간이다. 이 사이트를 참고하면 whisper 모델을 무료로 사용할 수 있기에 활용하였다.
openai/whisper-medium · Hugging Face
Whisper Whisper is a pre-trained model for automatic speech recognition (ASR) and speech translation. Trained on 680k hours of labelled data, Whisper models demonstrate a strong ability to generalise to many datasets and domains without the need for fine-t
huggingface.co
medium 모델을 사용하기 위해선 아래와 같은 2가지 방법이 있었다.
1) Use a pipeline as a high-level helper
from transformers import pipeline
pipe = pipeline("automatic-speech-recognition", model="openai/whisper-medium")
- pipeline은 모델, 토크나이저, 처리 로직 등을 자동으로 세팅해서 바로 사용 가능하다.
- 빠르게 테스트할 때 사용하는 방식이다.
2) Load model directly
from transformers import AutoProcessor, AutoModelForSpeechSeq2Seq
processor = AutoProcessor.from_pretrained("openai/whisper-medium")
model = AutoModelForSpeechSeq2Seq.from_pretrained("openai/whisper-medium")
- 모델과 토크나이저를 따로 로드해서, 원하는 방식으로 더 세밀하게 제어 가능하다.
- 오디오 전처리 직접 설정, 입력 형태 직접 다듬기, 파인튜닝을 해야할 때 사용한다.
- 직접 모델을 다루고 싶은 개발자용 방식이다.
빠르게 테스트할 것이기 때문에 1번 방식을 채택하였다.
Whisper 테스트
from transformers import pipeline
# Whisper 모델 로딩
pipe = pipeline("automatic-speech-recognition", model="openai/whisper-medium")
# 변환할 오디오 파일 경로
audio_path = "uploads/my_audio.wav"
# STT 수행
result = pipe(audio_path)
# 텍스트 출력
print("인식된 텍스트:")
print(result["text"])
위 코드를 실행한 결과, 에러가 발생하였다.
ValueError: You have passed more than 3000 mel input features (> 30 seconds)
→ long-form generation이 자동 활성화됨
→ return_timestamps=True 옵션이 필요함
문제점
1. 한 번에 처리할 수 있는 오디오 길이는 한계가 있다.
2. Whisper는 오디오를 30초 단위로 Tokenize하여 학습을 함. 또한 토큰 수 제한을 내부적으로 걸어둔다.
해결 방안 : 30초 단위 오디오 분할
import os
from pydub import AudioSegment
from transformers import pipeline
# pipeline 구성 (한번만 로딩)
pipe = pipeline("automatic-speech-recognition", model="openai/whisper-medium")
# 오디오 분할 함수
def split_audio(file_path, chunk_dir="uploads/chunks", chunk_length_ms=30_000):
os.makedirs(chunk_dir, exist_ok=True)
audio = AudioSegment.from_file(file_path)
chunks = []
for i in range(0, len(audio), chunk_length_ms):
chunk = audio[i:i + chunk_length_ms]
out_path = os.path.join(chunk_dir, f"chunk_{i // chunk_length_ms}.wav")
chunk.export(out_path, format="wav")
chunks.append(out_path)
return chunks
# 변환 함수 (pipeline 사용)
def transcribe(audio_path):
result = pipe(audio_path)
return result["text"]
# 실행 흐름
if __name__ == "__main__":
original_file = "uploads/my_audio.m4a"
chunks = split_audio(original_file)
for chunk_path in chunks:
print(f"처리 중: {chunk_path}")
chunk_text = transcribe(chunk_path)
print(f"변환된 텍스트: {chunk_text}")
# output.txt에 가독성 있게 저장하기 위한 코드
with open("output.txt", "a", encoding="utf-8") as f:
f.write(chunk_text.strip() + "\n\n")
결과
제이림 워크숍 장소 문의했던 내용을 넣어봤다. 약간의 오류가 있지만 잘 번역되는 것을 확인할 수 있었다.
'인수인계 작성 AI' 카테고리의 다른 글
GPT 요약 기능 추가 (0) | 2025.05.10 |
---|---|
파일 업로드 API 만들기 (0) | 2025.04.27 |
개발환경세팅_Node.js 세팅 (0) | 2025.04.27 |