Skip to content

[Step 5-1] 면접 턴 레이턴시 최적화: Gemini 3.x 통합 (목표 ≤3초) #15

@hoddukzoa12

Description

@hoddukzoa12

설명

면접 한 턴의 전체 파이프라인이 순차 실행되어 체감 지연이 큼.
목표: 전체 턴 응답 ≤3초.

현재 파이프라인 (순차, 합산 ~10-15초)

[사용자 발화 종료]
  → WebM→WAV 변환 (~0.5초)
  → STT/Whisper base, CPU (~2-5초) + 모델 로드 10초 + 300MB 메모리
  → 감정 분석/Gemini 2.5 Flash (~5.5초, thinking 포함)
  → LLM 응답/Gemini 2.5 Flash (~1-2초)
  → TTS/ElevenLabs (~1-2초)
[아바타 응답 시작]

핵심 변경: STT를 Gemini 2.0 Flash로 교체

Gemini Flash는 멀티모달이라 오디오 입력을 직접 받아 텍스트로 변환 가능.
Whisper + torch 의존성을 완전히 제거하고 Gemini API로 통합.

장점

  • Whisper(base) CPU 2-5초 → Gemini API ~1초
  • 앱 시작 시 모델 로드(10초 + 300MB) 제거
  • torch/whisper/sentence-transformers 의존성 경량화
  • TOKENIZERS_PARALLELISM mutex 문제 근본 해결

목표 파이프라인 (병렬화 + Gemini 통합)

[사용자 발화 종료]
  → WAV 변환 (~0.5초)
  → ┌ STT / Gemini 2.0 Flash (~1초)     ┐
    └ 감정 분석 / Gemini 2.0 Flash (~1초) ┘ 동시
  → LLM 응답 / Gemini 2.5 Flash (~1-2초)
  → TTS / ElevenLabs (~1-2초)
[아바타 응답 시작]
합계: ~3초 (3단계로 압축)

작업 내용

1. STT: Whisper → Gemini 2.0 Flash 교체

  • speech2text.py: Whisper 모델 로드 제거, Gemini API로 교체
  • 오디오 파일을 Part.from_bytes(mime_type="audio/wav")로 전송
  • 한국어 프롬프트: "이 오디오를 한국어로 받아적으세요. 텍스트만 출력."
  • 빈 오디오/인식 실패 시 "..." 반환 (기존 동작 유지)

2. 감정 분석 모델 변경

  • user_emotion.py: gemini-2.5-flashgemini-2.0-flash
  • max_output_tokens 1024 → 200 (thinking 없으면 충분)

3. STT + 감정 분석 병렬화

  • app.py /upload_audio: concurrent.futures.ThreadPoolExecutor 사용
  • STT와 감정 분석을 동시 실행, 둘 다 완료 후 LLM 호출

4. 의존성 정리

  • requirements.txt: openai-whisper 제거
  • app.py: TOKENIZERS_PARALLELISM 환경변수 제거 (불필요)
  • 남은 whisper import 제거

5. 레이턴시 측정 로그

  • 각 단계별 소요 시간 출력: [Latency] STT=1.2s, Emotion=0.8s, LLM=1.1s, TTS=0.9s, Total=3.0s

수정 파일

  • start_app/dialogue_manager/speech2text.py (Whisper → Gemini)
  • start_app/helper/user_emotion.py (모델 + max_tokens)
  • start_app/app.py (병렬화 + TOKENIZERS 제거)
  • requirements.txt (whisper 제거)
  • start_app/tests/ (테스트 업데이트)

완료 기준

  • 전체 턴 응답 ≤3초 (레이턴시 로그로 증명)
  • 기존 34개 테스트 통과 (STT mock 업데이트)
  • Whisper/torch 의존성 완전 제거
  • 한국어 인식 정확도 Whisper base와 동등 이상

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions