본문 바로가기
AI2024년 5월 20일6분 읽기

Whisper API로 음성 인식 앱 만들기 — 한국어 STT 구현

YS
김영삼
조회 227

Whisper란?

Whisper는 OpenAI가 공개한 범용 음성 인식(ASR) 모델입니다. 680,000시간의 다국어 데이터로 학습되었으며, 한국어를 포함한 99개 언어를 지원합니다. API로 간편하게 사용하거나, 오픈소스 모델을 로컬에서 실행할 수도 있습니다.

Whisper API 기본 사용법

Python에서 사용하기

from openai import OpenAI

client = OpenAI()

with open("recording.mp3", "rb") as audio_file:
    transcript = client.audio.transcriptions.create(
        model="whisper-1",
        file=audio_file,
        language="ko",
        response_format="text"
    )
print(transcript)

Node.js에서 사용하기

const OpenAI = require('openai');
const fs = require('fs');

const openai = new OpenAI();

async function transcribe(filePath) {
  const transcript = await openai.audio.transcriptions.create({
    model: 'whisper-1',
    file: fs.createReadStream(filePath),
    language: 'ko',
    response_format: 'verbose_json',
    timestamp_granularities: ['segment']
  });

  transcript.segments.forEach((seg) => {
    console.log(\`[\${seg.start.toFixed(1)}s] \${seg.text}\`);
  });
  return transcript;
}

transcribe('./meeting-recording.mp3');

한국어 정확도 향상 기법

프롬프트 활용

transcript = client.audio.transcriptions.create(
    model="whisper-1",
    file=audio_file,
    language="ko",
    prompt="이 회의는 쿠버네티스 클러스터 마이그레이션에 관한 것입니다. "
           "참석자: 김영수 팀장, 박지민 선임. "
           "주요 키워드: Kubernetes, Helm, ArgoCD, GitOps, Istio"
)

오디오 전처리

from pydub import AudioSegment

def preprocess_audio(input_path, output_path):
    audio = AudioSegment.from_file(input_path)
    audio = audio.set_channels(1)
    audio = audio.set_frame_rate(16000)
    from pydub.effects import normalize
    audio = normalize(audio)

    chunk_ms = 10 * 60 * 1000
    chunks = []
    for i in range(0, len(audio), chunk_ms):
        chunk = audio[i:i + chunk_ms]
        chunk_path = f"{output_path}_{i // chunk_ms}.mp3"
        chunk.export(chunk_path, format="mp3", bitrate="64k")
        chunks.append(chunk_path)
    return chunks

실시간 음성 인식 구현

async function startRecording() {
  const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
  const mediaRecorder = new MediaRecorder(stream, {
    mimeType: 'audio/webm;codecs=opus'
  });
  const chunks = [];

  mediaRecorder.ondataavailable = (e) => chunks.push(e.data);
  mediaRecorder.onstop = async () => {
    const blob = new Blob(chunks, { type: 'audio/webm' });
    const formData = new FormData();
    formData.append('file', blob, 'recording.webm');
    const res = await fetch('/api/transcribe', { method: 'POST', body: formData });
    const { text } = await res.json();
    document.getElementById('result').textContent = text;
  };

  mediaRecorder.start();
  setTimeout(() => mediaRecorder.stop(), 30000);
}

비용 및 제한사항

항목내용
가격$0.006 / 분
파일 크기 제한25MB
지원 형식mp3, mp4, mpeg, mpga, m4a, wav, webm
한국어 정확도WER ~10-15% (깨끗한 음성 기준)

로컬 실행 vs API 비교

  • API 장점: 설치 불필요, 항상 최신 모델, GPU 불필요
  • 로컬 장점: 비용 없음, 개인정보 보호, 오프라인 사용 가능
  • 로컬 실행 시 pip install openai-whisper로 설치하고, large-v3 모델은 VRAM 10GB+ 필요
  • Whisper.cpp(C++ 포팅)를 사용하면 CPU에서도 합리적인 속도로 실행 가능합니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록