[faster-qwen3-tts] nano-parakeet으로 참조 오디오 자동 전사 기능 추가
PR 링크: andimarafioti/faster-qwen3-tts#22 상태: Merged | 변경: +403 / -9
들어가며
faster-qwen3-tts의 voice cloning은 참조 오디오와 함께 그 오디오의 텍스트 전사(ref_text)가 필요하다. 특히 ICL(In-Context Learning) 모드에서는 정확한 전사가 필수인데, 사용자가 직접 입력하는 것은 번거롭고 오류가 많다. 이 PR은 nano-parakeet ASR 모델을 통합하여 참조 오디오를 업로드하면 자동으로 전사하는 기능을 추가한다.
핵심 코드 분석
ASR 모델 로딩 및 GPU 공존
# nano-parakeet을 TTS와 같은 GPU에서 로드
from nano_parakeet import from_pretrained as parakeet_from_pretrained
_parakeet_model = None
_parakeet_lock = asyncio.Lock()
async def _load_parakeet():
global _parakeet_model
if _parakeet_model is None:
_parakeet_model = parakeet_from_pretrained(device="cuda")
_parakeet_model.warmup(duration_s=3.0)
전사 API 엔드포인트
@app.post("/transcribe")
async def transcribe_audio(audio: UploadFile = File(...)):
if _parakeet_model is None:
raise HTTPException(status_code=503, detail="Transcription model not loaded")
content = await audio.read()
def run():
wav, sr = sf.read(io.BytesIO(content), dtype="float32", always_2d=False)
# 16kHz 리샘플링 후 전사
transcript = _parakeet_model.transcribe(wav_tensor)
return transcript
return await asyncio.get_event_loop().run_in_executor(None, run)
GPU 메모리 공존 벤치마크
PR에는 TTS와 ASR 모델의 GPU 메모리 공존이 TTS 성능에 미치는 영향을 측정하는 벤치마크(parakeet_coexistence.py)도 포함되어 있다:
# 5가지 조건 테스트:
# A) TTS 단독 (baseline)
# B) Parakeet GPU 상주 + TTS
# C) Parakeet 전사 2초 후 TTS
# D) Parakeet CPU 오프로드 후 TTS
# E) Parakeet 전사 + 대기 + 오프로드 + TTS
왜 이게 좋은가
- UX 대폭 개선: "오디오 업로드 → 자동 전사 → 즉시 voice cloning" 워크플로우가 원클릭으로 완성된다.
- 공존 검증: 벤치마크로 ASR 모델이 TTS 성능에 미치는 영향을 정량적으로 검증했다.
- Lazy loading: parakeet 모델은 첫 전사 요청 시에만 로드되어 TTS 전용 사용자에게 메모리 오버헤드가 없다.
정리
TTS와 ASR을 하나의 GPU에서 공존시키는 것은 demo 환경에서 실용적인 접근이다. nano-parakeet의 경량 특성(~100MB)과 lazy loading, 공존 벤치마크까지 포함한 체계적인 통합이다.
참고 자료
이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 코드 분석과 해석에서 오류가 있을 수 있으니, 정확한 내용은 원본 PR을 참고해주세요.
관련 포스트
PR Analysis 의 다른글
- 이전글 [Gradio] 서브탭/아코디언 컴포넌트 Lazy Loading 도입
- 현재글 : [faster-qwen3-tts] nano-parakeet으로 참조 오디오 자동 전사 기능 추가
- 다음글 [Grafana Loki] 오브젝트 스토어 클라이언트에 요청 레이턴시 히스토그램 메트릭 추가
댓글