본문으로 건너뛰기

[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

왜 이게 좋은가

  1. UX 대폭 개선: "오디오 업로드 → 자동 전사 → 즉시 voice cloning" 워크플로우가 원클릭으로 완성된다.
  2. 공존 검증: 벤치마크로 ASR 모델이 TTS 성능에 미치는 영향을 정량적으로 검증했다.
  3. Lazy loading: parakeet 모델은 첫 전사 요청 시에만 로드되어 TTS 전용 사용자에게 메모리 오버헤드가 없다.

정리

TTS와 ASR을 하나의 GPU에서 공존시키는 것은 demo 환경에서 실용적인 접근이다. nano-parakeet의 경량 특성(~100MB)과 lazy loading, 공존 벤치마크까지 포함한 체계적인 통합이다.

참고 자료


이 글은 AI(Claude)의 도움을 받아 작성되었습니다. 코드 분석과 해석에서 오류가 있을 수 있으니, 정확한 내용은 원본 PR을 참고해주세요.

댓글

관련 포스트

PR Analysis 의 다른글