언어모델 LLM/모델 및 프레임워크

Whisper 모델로 텍스트로 변환하기

General AI 2024. 7. 13. 21:20
728x90
반응형

Whisper 모델로 음성을 텍스트로 변환하기

음성을 텍스트로 변환하는 기술, 즉 음성 인식(Speech Recognition)은 인공지능 분야에서 꾸준히 발전해 왔습니다. 그 중에서도 OpenAI에서 개발한 Whisper 모델은 최근 주목받고 있는 강력한 도구입니다.

Whisper 모델로 텍스트로 변환하기

Whisper 모델이란?

Whisper는 OpenAI에서 2022년 9월에 공개한 오픈소스 음성 인식 모델입니다. 이 모델은 다음과 같은 특징을 가지고 있습니다:

  1. 다국어 지원: 영어뿐만 아니라 한국어를 포함한 다양한 언어를 인식할 수 있습니다.
  2. 강력한 성능: 노이즈가 있는 환경에서도 우수한 인식 성능을 보여줍니다.
  3. 다목적성: 음성 인식, 번역, 언어 식별 등 다양한 작업을 수행할 수 있습니다.
  4. 오픈소스: 누구나 자유롭게 사용하고 개선할 수 있습니다.

애플리케이션 구현하기

이제 실제로 애플리케이션을 구현해 보겠습니다. 먼저, 필요한 라이브러리를 설치해야 합니다.

라이브러리 설치

다음 명령어를 사용하여 필요한 라이브러리를 설치합니다:

pip install streamlit torch transformers pydub moviepy

전체 코드

다음은 애플리케이션의 전체 코드입니다. 이 코드를 app.py 파일에 저장합니다.

import os
import streamlit as st
import torch
from transformers import WhisperForConditionalGeneration, WhisperProcessor, pipeline
from pydub import AudioSegment
from moviepy.editor import VideoFileClip
import tempfile
import io

# 모델 관련 상수
MODEL_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'models', 'whisper-large-v3')
MODEL_ID = "openai/whisper-large-v3"

@st.cache_resource
def load_model():
    """모델 로드 함수"""
    try:
        model = WhisperForConditionalGeneration.from_pretrained(MODEL_PATH, local_files_only=True)
        processor = WhisperProcessor.from_pretrained(MODEL_PATH, local_files_only=True)
        st.success("로컬에서 모델을 로드했습니다.")
    except Exception as e:
        st.warning(f"로컬 모델 로드 실패: {e}. Hugging Face에서 모델을 다운로드합니다.")
        model = WhisperForConditionalGeneration.from_pretrained(MODEL_ID)
        processor = WhisperProcessor.from_pretrained(MODEL_ID)
        os.makedirs(os.path.dirname(MODEL_PATH), exist_ok=True)
        model.save_pretrained(MODEL_PATH)
        processor.save_pretrained(MODEL_PATH)
        st.success(f"모델을 {MODEL_PATH}에 저장했습니다.")
    return model, processor

def process_audio(file, file_type):
    """오디오 파일 처리 함수"""
    temp_wav = tempfile.NamedTemporaryFile(delete=False, suffix='.wav')
    temp_wav_path = temp_wav.name

    try:
        if file_type == 'wav':
            # WAV 파일 내용을 직접 읽고 씁니다
            temp_wav.write(file.getvalue())
            temp_wav.flush()
        elif file_type == 'mp3':
            audio = AudioSegment.from_mp3(io.BytesIO(file.getvalue()))
            audio.export(temp_wav_path, format="wav")
        elif file_type == 'mp4':
            with tempfile.NamedTemporaryFile(delete=False, suffix='.mp4') as temp_video:
                temp_video.write(file.getvalue())
                temp_video.flush()
                video = VideoFileClip(temp_video.name)
                video.audio.write_audiofile(temp_wav_path, verbose=False, logger=None)
                video.close()
            os.unlink(temp_video.name)
    finally:
        temp_wav.close()

    return temp_wav_path

def run_stt(model, processor, wav_file):
    """STT 실행 함수"""
    pipe = pipeline(
        "automatic-speech-recognition",
        model=model,
        tokenizer=processor.tokenizer,
        feature_extractor=processor.feature_extractor,
        chunk_length_s=30,
        device=torch.device("cuda" if torch.cuda.is_available() else "cpu")
    )
    return pipe(wav_file, batch_size=8)["text"]

# Streamlit 앱 시작
st.title("음성을 텍스트로 변환 (STT)")

model, processor = load_model()

uploaded_file = st.file_uploader("오디오 파일 선택 (WAV, MP3 또는 MP4)", type=['wav', 'mp3', 'mp4'])

if uploaded_file:
    file_type = uploaded_file.name.split('.')[-1].lower()

    if file_type in ['wav', 'mp3']:
        st.audio(uploaded_file, format=f'audio/{file_type}')
    elif file_type == 'mp4':
        st.video(uploaded_file, format='video/mp4')

    if st.button("텍스트로 변환"):
        with st.spinner("오디오 처리 및 변환 중..."):
            wav_file = process_audio(uploaded_file, file_type)
            result = run_stt(model, processor, wav_file)
            st.success("변환 완료!")
            st.write(result)
        os.remove(wav_file)

st.markdown("---")
st.write("이 앱은 OpenAI의 Whisper 모델을 사용합니다.")

애플리케이션 실행하기

코드를 저장한 후, 다음 명령어로 애플리케이션을 실행합니다:

streamlit run app.py

브라우저에서 로컬 URL(보통 http://localhost:8501)을 열면 애플리케이션을 사용할 수 있습니다.

Whisper 모델로 텍스트로 변환하기

이러한 음성-텍스트 변환 기술은 다양한 분야에서 활용될 수 있습니다: Whisper 모델과 같은 강력한 AI 도구들이 계속해서 발전함에 따라, 우리의 일상 생활과 업무 환경은 더욱 편리해질 것입니다. 음성 인식 기술에 관심이 있으시다면, 다음의 링크들을 참고해 보시기 바랍니다:

  1. OpenAI Whisper 공식 GitHub
  2. Hugging Face Transformers 라이브러리
  3. Streamlit 공식 문서
728x90
반응형