LLM Live 튜닝 파라미터
이 페이지는 현재값, 조정 방향과 부작용을 확인하는 기준표다. 같은 발화, 거리, 기기 볼륨과 주변 소음에서 한 번에 한 값만 바꾼다. 동작 설명은 기기 Runtime, Broker 환경 변수는 현재 Broker에서 확인한다.
세션과 턴
| 파라미터 | 현재값 | 낮추면 | 높이면 |
|---|---|---|---|
| Cloud REST 기록 | 16턴 + 현재 user, 최대 33 message | 메모리·전송량 감소 | 장기 문맥과 토큰 증가 |
speechEndTimeoutMs |
3000ms | 로컬 종료가 빨라지나 문장 절단 위험 | 긴 쉼 허용, 응답 지연 |
LIVE_RESPONSE_TIMEOUT_MS |
20000ms | 무응답 회수 빨라짐 | 느린 응답 허용 |
LIVE_BARGE_IN_RESPONSE_TIMEOUT_MS |
10000ms | 끼어든 뒤 회수 빨라짐 | 후속 응답 대기 증가 |
LIVE_LISTENING_IDLE_TIMEOUT_MS |
5000ms | 대화가 빨리 닫힘 | 다음 질문 대기 증가 |
nextInputEchoGuardMs |
500ms | 다음 발화를 빨리 받으나 잔향 오인 위험 | 빠른 발화 앞부분 손실 |
maxSessionAgeMs |
14분 | 연결을 자주 교체 | upstream 수명 경계 위험 |
Gemini 자동 VAD가 켜진 형상에서는 일반 발화 종료에 speechEndTimeoutMs보다 Gemini의
silenceDurationMs가 우선한다. 14분 RotateSession 후속 처리는 미완성이므로 운영 보장값이
아니다.
Gemini VAD
| 파라미터 | 현재값 | 조정 영향 |
|---|---|---|
automaticActivityDetectionEnabled |
true |
false면 앱이 입력 종료를 직접 보내야 함 |
activityHandling |
START_OF_ACTIVITY_INTERRUPTS |
새 사용자 발화가 모델 답변을 중단 |
startOfSpeechSensitivity |
START_SENSITIVITY_HIGH |
이미 높은 시작 감도. 추가 완화 시 오탐 측정 필요 |
endOfSpeechSensitivity |
END_SENSITIVITY_LOW |
문장 중간의 짧은 쉼 보호 |
prefixPaddingMs |
80ms | 늘리면 첫 음절 보호와 전송량 증가 |
silenceDurationMs |
800ms | 낮추면 빠르지만 문장 중간 절단 위험 |
Barge-in과 Echo gate
LivePlaybackEchoMatcher는 24 kHz 재생 PCM과 16 kHz 마이크 PCM을 시간 정렬해 파형과 음량
윤곽의 유사도를 계산한다. Echo를 제거하는 AEC가 아니라, 유사도가 높은 구간을 Gemini에
보내지 않는 gate다.
| 파라미터 | 현재값 | 더 민감하게 | 더 둔감하게 / 주의점 |
|---|---|---|---|
| 일반 음성 peak | 1800 | 낮춤 | 높이면 작은 음성 누락 |
| Barge-in 음성 peak | 3300 | 낮춤 | 낮추면 스피커 누설 후보 증가 |
minActiveSamples |
24 | 낮춤 | 낮추면 순간 소리 오탐 증가 |
| 사전 확인 | 2 x 20ms = 40ms | 1 chunk | 3 chunk는 60ms 반응 지연 |
| Echo 분석 구간 | 60ms | 짧게 | 짧으면 유사도 불안정 |
| Echo 거절 기준 | 0.74 | 높임 | 낮추면 실제 사용자 음성 거절 증가 |
| 재생 시작 보호 | 300ms | 낮춤 | 낮추면 기준 신호가 불안정 |
| 입력 전사 보호 | 100ms | 낮춤 | 너무 낮으면 Echo 전사로 오중단 |
| F1 보조 근거 | 1500ms | 길게 | 오래된 F1이 다음 잡음에 영향 |
maxAcousticDelayMs |
1000ms | 해당 없음 | 스피커-마이크 지연 검색 상한 |
delaySearchStepMs |
20ms | 낮춤 | CPU 사용 증가 |
minReferenceRms |
300 | 낮춤 | 작은 기준 신호의 불안정 계산 증가 |
| 기준 PCM 보관 | 60000ms | 낮춤 | 메모리 상한, 긴 답변 참조 범위 감소 |
| 음량 윤곽 block | 5ms, 최소 6개 | 해당 없음 | 최소 30ms 필요 |
최종 재생 중단 권한은 Gemini Interrupted 또는 의미 있는 입력 전사에 둔다. 로컬 40ms 조건만
통과했다고 AudioTrack을 끊지 않는다.
음성 재생
| 파라미터 | 현재값 | 낮추면 | 높이면 |
|---|---|---|---|
| 입력 계약 | 16 kHz PCM16 mono | 변경 금지 | 변경 금지 |
| 출력 계약 | 24 kHz PCM16 mono | 변경 금지 | 변경 금지 |
prebufferMs |
800ms | 첫 소리 빨라짐, underrun 위험 | 시작 지연, 연속성 증가 |
| stream buffer | 2초 | 메모리 감소, 여유 감소 | 메모리와 공급 여유 증가 |
| blocking write slice | 20ms | 취소 반응 빨라짐, 호출 증가 | Barge-in 후 정지 지연 |
| write retry delay | 5ms | busy loop 위험 | 공급 지연 위험 |
| drain poll / margin | 40ms / 2000ms | 완료 감지 빨라짐 / 조기 timeout | callback과 회수 지연 |
| Primary / Shadow 상한 | 4MiB / 2MiB | 긴 기준 신호를 빨리 폐기 | 메모리 증가 |
도착 PCM은 GeminiLiveAudioPlayer.playPcm16() queue에 바로 들어간다. 약 800ms가 쌓이면
재생을 시작하고 뒤의 chunk를 이어 쓴다. GenerationComplete는 남은 queue를 소진하라는
신호이며 전체 응답을 받은 뒤 재생을 시작하는 신호가 아니다.
F1/F3와 네트워크
| 파라미터 | 현재값 | 의미 |
|---|---|---|
MIN_INPUT_SPEECH_MS |
700ms | 더 짧은 F1-F3 구간은 입력 종료 근거에서 제외 |
INPUT_TAIL_FLUSH_MS |
1100ms | Gemini 800ms 무음 판단보다 늦은 F3 보조 |
LISTENING_IDLE_CLOSE_GRACE_MS |
3500ms | 답변 뒤 F3 무발화 종료 유예 |
| PCM queue | 64 x 20ms | 약 1.28초. 초과 시 drop 로그 확인 |
| connect / write timeout | 15초 / 15초 | Broker 연결과 송신 정체 회수 |
| WebSocket read timeout | 0 | 장기 수신 허용 |
| rewrite 완료 timeout | 5초 | 제품 명령 권한 전환 회수 |
Broker의 포트, path, model, ping과 max_size는 현재 Broker의 환경
변수와 WebSocket 설정을 기준으로 한다.
튜닝 순서
candidate -> Gemini Interrupted -> AudioTrack stop시각을 먼저 기록한다.- 사용자 입력 없이 기기 음성만 10회 재생해 자기 음성 중단이 0회인지 확인한다.
- 현재값으로 동일 사용자 발화 30회의 성공률과 p50/p95를 측정한다.
- 느리면 사전 확인 chunk 또는 입력 전사 보호 시간 중 하나만 조정한다.
- 음성 끊김은
prebufferMs와 underrun을 보고 Barge-in 감도와 분리한다. - 답변 소진 뒤 5초 종료와 4초 후속 발화를 함께 반복한다.
최소 실기기 검증
| 조건 | 합격 기준 |
|---|---|
| 사용자 입력 없이 응답 10회 | 자기 음성 중단 0회 |
| 가까운 거리 Barge-in 10회 | 첫 단어 보존, 빠른 응답 정지 |
| 2m Barge-in 10회 | 성공률과 정지 시간 p50/p95 기록 |
| 모터 또는 TV 소음 5분 | 잘못된 끼어들기 0회 |
| 답변 후 무발화 10회 | 5초 부근에 마이크와 WebSocket 회수 |
| 답변 후 4초 발화 10회 | 종료 취소, 같은 세션 유지 |