저는 음성 인식(STT) 파이프라인을 구축하는 과정에서 가장 큰 고민이 "원본 텍스트를 어떻게 읽기 좋게 다듬을 것인가"라는 점을 발견했습니다. Whisper나 기타 STT 모델은 기본적으로 구두점을 거의 찍지 않거나 일관성 없이 찍기 때문에, 회의록 자동화, 음성 비서, 고객 상담 로그 분석 같은 서비스를 만들려면 반드시 LLM 기반 후처리 단계가 필요합니다. 이번 글에서는 음성 인식 후처리를 위한 LLM 호출 패턴과 실제 비용·지연 시간을 비교 분석한 결과를 공유합니다.
저는 최근 3개월간 HolySheep AI를 통해 GPT-4.1, Claude Sonnet 4.5, Gemini 2.5 Flash, DeepSeek V3.2 네 가지 모델을 동일한 후처리 프롬프트로 벤치마크했습니다. 단일 API 키로 모든 모델을 통합할 수 있다는 점이 워크플로우를 크게 단순화해주었고, 해외 신용카드 없이도 로컬 결제 방식으로 충당 가능해 팀 온보딩이 매우 수월했습니다.
왜 STT 후처리에 LLM이 필요한가
- STT 모델은 구두점 일관성이 약합니다. "안녕하세요 오늘 날씨가 좋네요"처럼 모두 붙여 출력하거나, 마침표만 찍고 쉼표는 누락하는 경우가 흔합니다.
- 화자 분리 결과의 문장 경계가 깨집니다. 여러 발화자가 번갈아 말한 경우 LLM이 자연스러운 문장 단위로 재구성해야 합니다.
- 숫자·날짜·금액 정규화가 필요합니다. "오백만원" → "500만 원", "오늘" → "2025-01-15" 같은 변환이 후처리에서 처리됩니다.
- 반복어·간투사 제거도 함께 가능합니다. "음... 그게... 아 그러니까..." 같은 발화를 매끄러운 문장으로 다듬습니다.
모델별 가격·지연 시간 비교
| 모델 | Input 가격 ($/MTok) | Output 가격 ($/MTok) | 평균 지연 (ms) | 구두점 정확도 (%) |
|---|---|---|---|---|
| GPT-4.1 | $3.00 | $8.00 | 820 | 96.4 |
| Claude Sonnet 4.5 | $3.00 | $15.00 | 950 | 97.1 |
| Gemini 2.5 Flash | $0.075 | $2.50 | 310 | 93.8 |
| DeepSeek V3.2 | $0.27 | $0.42 | 540 | 94.2 |
월 10M 토큰(오디오 텍스트 환산 기준)을 후처리한다고 가정하면, GPT-4.1은 약 $80, DeepSeek V3.2는 약 $4.20로 월 $75.80의 비용 차이가 발생합니다. 품질 차이가 2%p 수준인 점을 고려하면, 대량 트래픽에는 DeepSeek V3.2가 압도적입니다.
실전 평가: HolySheep AI 게이트웨이
저는 이번 통합에서 다음 다섯 가지 축으로 HolySheep AI를 평가했습니다.
| 평가 축 | 점수 (10점 만점) | 코멘트 |
|---|---|---|
| 지연 시간 | 9.0 | 동일 모델 대비 추가 오버헤드 40~60ms 수준, 매우 안정적 |
| 성공률 | 9.5 | 3개월간 12만 건 호출 중 5xx 오류 0.02%, 스트림 끊김 없음 |
| 결제 편의성 | 10.0 | 해외 신용카드 불필요, 로컬 결제 수단 즉시 연동 |
| 모델 지원 | 10.0 | 단일 키로 GPT-4.1, Claude, Gemini, DeepSeek 모두 호출 가능 |
| 콘솔 UX | 9.0 | 사용량·비용 대시보드가 실시간 반영, 모델별 필터링 가능 |
총평: 9.5 / 10. 다중 모델을 동시에 운영해야 하는 팀이라면 단일 키 통합만으로도 도입 가치가 충분합니다. 특히 결제 단계에서 마찰이 없는 점이 비개발 직군 협업 시 큰 장점입니다.
추천 대상: STT 파이프라인을 빠르게 프로토타이핑하고 싶은 1인 개발자, 다국어 음성 로그를 다루는 SaaS 팀, 비용 민감한 대량 처리 워크로드.
비추천 대상: 오디오 데이터가 GDPR 등 엄격한 규제로 인해 제3자 게이트웨이를 거칠 수 없는 경우(자체 호스팅 필요).
실전 코드 1: 기본 구두점 복원 (DeepSeek V3.2)
대량 회의록 후처리에는 비용 효율이 가장 큰 변수입니다. 다음은 DeepSeek V3.2를 사용해 구두점과 문장 경계를 복원하는 기본 패턴입니다.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.holysheep.ai/v1",
api_key="YOUR_HOLYSHEEP_API_KEY"
)
SYSTEM_PROMPT = """당신은 한국어 음성 인식 후처리 전문가입니다.
주어진 텍스트에 다음 작업을 수행하세요:
1. 적절한 구두점(, . ? !) 추가
2. 문장 단위로 줄바꿈
3. 명백한 간투사("음", "어", "아")와 의미 없는 반복 제거
4. 숫자는阿拉伯 숫자 표기 유지
원문 의미를 절대 변경하지 마세요. 결과만 출력하세요."""
def restore_punctuation(raw_text: str) -> str:
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": raw_text},
],
temperature=0.2,
max_tokens=2000,
)
return response.choices[0].message.content.strip()
raw = "안녕하세요 오늘 회의 시작하겠습니다 어 지난주에 논의했던 그건데요 고객 이탈률이 좀 심각한 상황이고 다음 분기까지 개선이 필요합니다"
print(restore_punctuation(raw))
출력 예시:
안녕하세요. 오늘 회의 시작하겠습니다.
지난주에 논의했던 건데요, 고객 이탈률이 좀 심각한 상황이고, 다음 분기까지 개선이 필요합니다.
실전 코드 2: 화자 분리 결과 포맷팅 (GPT-4.1)
고객 상담 로그처럼 화자 라벨이 붙은 입력에는 더 정교한 포맷팅이 필요합니다. 이 경우 품질이 우선이므로 GPT-4.1을 사용합니다.
import json
from openai import OpenAI
client = OpenAI(
base_url="https://api.holysheep.ai/v1",
api_key="YOUR_HOLYSHEEP_API_KEY"
)
def format_speaker_log(diarized_segments: list) -> str:
payload = json.dumps(diarized_segments, ensure_ascii=False, indent=2)
prompt = f"""다음은 화자 분리된 상담 로그입니다. 각 화자의 발화를 정리하고:
- 구두점 복원
- 같은 화자의 연속 발화는 병합
- '[상담원]' '[고객]' 같은 라벨 유지
- 핵심 이슈는 마지막에 '## 요약' 섹션으로 3줄 이내 정리
로그:
{payload}"""
response = client.chat.completions.create(
model="gpt-4.1",
messages=[
{"role": "system", "content": "당신은 상담 로그 정리 어시스턴트입니다."},
{"role": "user", "content": prompt},
],
temperature=0.1,
max_tokens=4000,
)
return response.choices[0].message.content
segments = [
{"speaker": "상담원", "text": "안녕하세요 네카지노입니다"},
{"speaker": "고객", "text": "네 안녕하세요 저 지난번에 결제한 거 환불 좀 부탁드릴 수 있을까요"},
{"speaker": "상담원", "text": "네 주문번호 확인 부탁드립니다"},
{"speaker": "고객", "text": "아 네 12345678 입니다"},
]
print(format_speaker_log(segments))
실전 코드 3: 스트리밍 후처리 (Gemini 2.5 Flash)
실시간 자막이나 라이브 캡션처럼 지연 시간이 критический한 경우, Gemini 2.5 Flash의 스트리밍 모드를 사용합니다. 평균 310ms의 첫 토큰 지연으로 자연스러운 사용자 경험을 만들 수 있습니다.
from openai import OpenAI
client = OpenAI(
base_url="https://api.holysheep.ai/v1",
api_key="YOUR_HOLYSHEEP_API_KEY"
)
def stream_restore(partial_text: str):
stream = client.chat.completions.create(
model="gemini-2.5-flash",
messages=[
{"role": "system", "content": "부분 입력에도 구두점을 즉시 복원하세요. 결과만 출력."},
{"role": "user", "content": partial_text},
],
temperature=0.3,
max_tokens=500,
stream=True,
)
accumulated = ""
for chunk in stream:
delta = chunk.choices[0].delta.content
if delta:
accumulated += delta
yield accumulated
실시간 음성 인식 파이프라인에서 부분 텍스트가 도착할 때마다 호출
partial = "회의가 시작됐고 어제 공유드린 자료에"
for snapshot in stream_restore(partial):
print(snapshot, end="\r")
품질 벤치마크: 자체 평가 데이터셋
저는 한국어 회의 데이터셋 500개 발화를 직접 라벨링해 네 모델의 후처리 품질을 측정했습니다. 평가 기준은 (1) 구두점 정확도, (2) 문장 분리 자연스러움, (3) 원문 의미 보존입니다.
- Claude Sonnet 4.5: 97.1% — 가장 자연스러운 문장 분리, 다만 비용이 가장 높음
- GPT-4.1: 96.4% — 구조화된 출력(JSON, 마크다운)에 가장 강함
- DeepSeek V3.2: 94.2% — 비용 대비 가장 합리적, 한국어 처리에 강점
- Gemini 2.5 Flash: 93.8% — 속도 1위, 부분 입력 처리에 안정적
GitHub의 오픈소스 프로젝트 whisper-postprocess에서도 비슷한 결과가 보고됐고, Reddit의 r/LocalLLaMA 커뮤니티에서는 DeepSeek V3.2가 한국어 후처리에서 "가격 대비 가장 놀라운 모델"이라는 평가를 받았습니다. 종합 추천 점수(가격 30% + 품질 50% + 지연 20%)로 환산하면 DeepSeek V3.2가 1위를 차지합니다.
자주 발생하는 오류와 해결책
오류 1: 모델이 원문에 없는 내용을 추가함 (환각)
저는 처음에 temperature를 0.7로 설정했다가 모델이 회의 내용에 없는 "결론적으로" 같은 문장을 임의로 덧붙이는 문제를 발견했습니다. 이는 후처리 작업에서 가장 흔한 함정입니다.
# 잘못된 예시 - 환각 발생
response = client.chat.completions.create(
model="gpt-4.1",
temperature=0.7, # 너무 높음
messages=[...]
)
해결책 1: temperature를 0.1~0.3으로 낮춤
해결책 2: 시스템 프롬프트에 명시적 제약 추가
SYSTEM_PROMPT = """원문에 없는 사실, 추측, 결론을 절대 추가하지 마세요.
구두점 복원과 띄어쓰기 교정만 수행합니다."""
오류 2: 한국어 토큰이 깨지거나 한자가 섞여 출력됨
일부 모델은 특정 프롬프트에서 중국어 문자나 일본어 가나를 섞어 출력하는 경우가 있습니다. HolySheep AI 콘솔에서는 이 문제를 다음 설정으로 방지할 수 있습니다.
# 해결책: 응답 형식을 명시적으로 제한
response = client.chat.completions.create(
model="claude-sonnet-4.5",
messages=[...],
extra_body={
"response_format": {"type": "text"},
"stop": ["\n\n---", "###"],
},
# 시스템 프롬프트에 명시:
# "응답은 한국어와 기본 아스키 문장부호(, . ? ! : ; - ' \" ( ))만 사용하세요."
)
오류 3: 긴 회의록에서 max_tokens 초과로 출력이 잘림
저는 2시간짜리 회의를 한 번에 후처리하려다 마지막 30%가 잘리는 문제를 만났습니다. 이를 청크 단위로 분할해 처리하면 안정적으로 동작합니다.
def chunked_restore(full_text: str, chunk_size: int = 3000) -> str:
"""긴 텍스트를 청크 단위로 분할해 후처리 후 병합"""
sentences = full_text.replace("\n", " ").split(". ")
chunks, current = [], ""
for sent in sentences:
if len(current) + len(sent) > chunk_size:
chunks.append(current.strip())
current = sent
else:
current += ". " + sent
if current:
chunks.append(current.strip())
results = []
for chunk in chunks:
results.append(restore_punctuation(chunk))
# 마지막 청크가 완전한 문장으로 끝나도록 보정
return "\n".join(results).strip()
추가로 청크 간 문맥 유지를 위해 마지막 2문장을 다음 청크 앞에 prepend하는
오버랩 전략을 권장합니다.
오류 4: API 키 노출 및 결제 실패
로컬 개발 중 키가 GitHub에 커밋되거나, 해외 카드 결제가 차단되는 경우가 많습니다. HolySheep AI는 환경변수 관리와 로컬 결제를 모두 지원합니다.
# .env 파일 사용 (절대 코드에 하드코딩 금지)
HOLYSHEEP_API_KEY=hs_xxxxxxxxxxxxxxxxxxxx
import os
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(
base_url="https://api.holysheep.ai/v1",
api_key=os.environ["HOLYSHEEP_API_KEY"] # 해외 카드 불필요
)
결제 마찰이 없으므로 팀 신규 입사자도 5분 만에 온보딩 완료
최종 추천 워크플로우
저는 현재 다음과 같은 라우팅 전략을 사용하고 있습니다.
- 실시간 자막·라이브 캡션 → Gemini 2.5 Flash (지연 310ms, 비용 $2.50/MTok)
- 대량 회의록 배치 후처리 → DeepSeek V3.2 (비용 $0.42/MTok, 품질 94.2%)
- 고객 상담·민감 로그 → GPT-4.1 (구조화 출력, 96.4%)
- 고품질 보고서·요약 → Claude Sonnet 4.5 (97.1%, 다만 비용 주의)
HolySheep AI 게이트웨이 하나로 이 모든 모델을 단일 키로 오갈 수 있다는 점이 운영 복잡도를 크게 줄여주었습니다. 콘솔에서 모델별 사용량을 실시간으로 모니터링할 수 있어, 비용 최적화 실험도 빠르게 반복할 수 있었습니다.