Gemini 3.8 Live 는 지연 시간이 짧은 양방향 음성 및 동영상 상호작용과 대면 라이브 아바타 합성을 위해 빌드된 실시간 대화형 모델입니다. 연속 대화 워크플로를 위해 설계된 3.8 Live는 기본적으로 사용 설정된 공감형 대화, 능동적 오디오 필터링, 자동 취소 차단 도구, 동적 다국어 전환을 제공합니다.
이 문서에서는 다음 주제를 다룹니다.
- Gemini 모델 제품군에서 3.8 Live의 역할
- 3.8 Live의 주요 기능
- Google 생성형 AI SDK와의 통합
- 필수 API 규칙 및 관례
- 이전 Gemini Live API 모델에서 마이그레이션
Gemini 제품군에서의 역할
3.8 Live는 실시간 스트리밍 상호작용 을 위해 설계되었습니다. 양방향 웹 소켓에서 작동하며 24kHz 오디오와 동기화된 24FPS 동영상 아바타를 생성하는 동시에 음성, 실시간 카메라 피드, 화면 브로드캐스트를 1초 미만의 지연 시간으로 처리합니다.
모델 사양 및 비교
다음 표에서는 3.8 Live와 이전 Gemini Live API 모델 간의 사양을 비교합니다.
| 속성 | Gemini 3.8 Live | Gemini 2.5 Flash Live API 네이티브 오디오 (GA 기준) |
|---|---|---|
| 모델 ID | gemini-3.8-live |
gemini-live-2.5-flash-native-audio |
| 출시 단계 | 정식 버전 (GA) | 정식 버전 (GA) |
| 입력 모드 | 오디오 (16kHz PCM), 동영상 (1FPS JPEG), 텍스트 | 오디오 (16kHz PCM), 동영상 (1FPS JPEG), 텍스트 |
| 출력 모드 | 오디오 (24kHz PCM), 동영상 (24FPS MP4 라이브 아바타), 텍스트 | 오디오 (24kHz PCM), 텍스트 |
| 라이브 아바타 합성 | 24FPS 동기화된 동영상 출력 | 지원되지 않음 |
| 공감형 대화 | 기본적으로 사용 설정됨 | 명시적 구성 필요 |
| 능동적 오디오 | 기본적으로 사용 설정됨 | 명시적 구성 필요 |
| 함수 호출 실행 | 비동기식 비차단 및 자동 취소 차단 (behavior="BLOCKING") |
비동기식 및 동기식 |
| 통화 참여 처리 | 정중한 중단 다운그레이드 (사용자가 말할 때 대기) | 즉시 중단 (사용자 오디오와 겹칠 수 있음) |
| 언어 지원 | 지원되는 언어 간의 동적 중간 스트림 전환 | 지원 언어 |
| 도메인 바이어스 | AudioTranscriptionConfig에서 custom_vocabulary 지원 |
표준 기준 스크립트 작성 |
| 시각적 토큰 제어 | 구성 가능한 media_resolution (LOW, MEDIUM, HIGH) |
프레임당 고정 토큰 예산 |
Gemini 3.8 Live를 사용해야 하는 경우
다음 시나리오에서 3.8 Live를 사용하세요.
- 사용자가 중단 (통화 참여)할 때 대화 지연 시간이 짧고, 자연스러운 턴 테이킹, 빠른 복구가 필요합니다.
- 앱이 외부 도구를 호출하고 백엔드 시스템에서 요청을 처리하는 동안 오디오 출력이 계속되도록 비차단 실행이 필요합니다.
- 외부 렌더링 파이프라인 없이 24FPS로 동기화된 얼굴 애니메이션과 립싱크를 사용하여 말하는 디지털 아바타를 렌더링하려고 합니다.
- 사용자가 여러 언어로 대화하므로 지원되는 언어 간의 중간 스트림 언어 감지 및 전환이 필요합니다.
- 기술 용어, SKU 또는 브랜드 이름에 도메인별 어휘 바이어스가 필요합니다.
전체 사양 및 할당량 한도는 3.8 Live 모델 페이지를 참고하세요.
Gemini 3.8 Live의 주요 기능
3.8 Live는 다음과 같은 기능을 도입합니다.
24FPS 라이브 아바타 동영상 합성: 3.8 Live 는 모델 출력에서 직접 동기화된 24FPS MP4 동영상 스트림 (
response_modalities=["VIDEO"])을 생성합니다. 생성된 표정과 입술 움직임은 합성된 음성과 실시간으로 일치합니다.사전 빌드된 스톡 아바타를 사용하거나 맞춤 참고 이미지를 제공하여 디지털 컨시어지, 고객 서비스 담당자, 가상 튜터 또는 대화형 캐릭터를 빌드할 수 있습니다. 설정 세부정보는 라이브 아바타 구성을 참고하세요.
기본적으로 사용 설정된 공감형 대화 및 능동적 오디오:
- 공감형 대화: 3.8 Live에서 기본적으로 사용 설정됩니다. 모델은 사용자 오디오 입력에서 음향 운율, 음성 신호, 일시중지, 음성 굴절을 처리하여 음성 톤과 대화 속도를 조정합니다.
- 능동적 오디오: 3.8 Live에서 기본적으로 사용 설정됩니다. 모델은 주변 소음과 배경 음성을 필터링하고 사용자가 주소를 지정할 때만 오디오 응답을 생성합니다.
비동기식 및 자동 취소 차단 함수 호출: 3.8 Live는 실시간 음성을 위해 설계된 도구 호출 동작을 제공합니다:
- 비차단 비동기식 실행: 모델이 도구 호출을 생성하면 오디오 세션이 활성 상태로 유지되므로 클라이언트 앱이 백엔드 API를 호출하는 동안 에이전트가 대화형 승인 ("계정 세부정보를 가져오겠습니다...")을 스트리밍하고 후속 입력을 처리할 수 있습니다.
- 자동 취소 차단 호출 (
behavior="BLOCKING"): 함수 선언에서behavior="BLOCKING"을 설정하면 도구 응답이 도착할 때까지 생성이 일시중지됩니다. 차단 호출이 실행되는 동안 새 사용자 입력이 도착하면 Gemini Live API 서버가 대기 중인 호출을 취소합니다. - 정중한 중단 처리: 이전 모델에서는 사용자가 말하는 동안 도구
응답을
scheduling="INTERRUPT"로 반환하면 사용자 오디오가 겹쳤습니다. 3.8 Live에서는 사용자 음성이 활성 상태일 때 서버가 일정을WHEN_IDLE로 다운그레이드하고 사용자가 말을 마친 후 응답을 재생합니다.
동적 다국어 전환 및 맞춤 어휘:
- 다국어 지원: 연결을 다시 시작하거나 재구성하지 않고 세션 중간에 지원되는 언어를 감지하고 전환합니다.
- 맞춤 어휘 바이어스:
AudioTranscriptionConfig(input_audio_transcription을 통해)에서 도메인별 키워드, 고유명사, 의료 용어, 제품 코드를 허용하여custom_vocabulary를 사용하여 스크립트 작성 정확도를 개선합니다.
media_resolution제어를 통한 멀티모달 시각적 접지: 실시간 동영상 스트림 (1FPS JPEG 프레임, 권장 해상도768x768)을 허용하고media_resolution(MEDIA_RESOLUTION_LOW,MEDIA_RESOLUTION_MEDIUM,MEDIA_RESOLUTION_HIGH)을 구성하여 프레임당 토큰 사용량과 시각적 세부정보의 균형을 맞출 수 있습니다.
빠른 시작
시작하기 전에 애플리케이션 기본 사용자 인증 정보 (ADC)를 사용하여 Cloud de Confiance by S3NS 에 인증합니다.
다음 코드 샘플에서 PROJECT_ID를
프로젝트 ID Cloud de Confiance 로 바꿉니다.
SDK 설치
Google 생성형 AI SDK 및 오디오 종속 항목을 설치하거나 업데이트합니다.
pip install --upgrade google-genai websockets numpy
비동기식 도구 호출로 양방향 세션 시작
다음 예에서는 gemini-3.8-live로 실시간 세션을 설정하고, 맞춤 어휘 바이어스를 구성하고, 비차단 비동기식 함수 호출을 실행합니다.
import asyncio
from google import genai
from google.genai import types
PROJECT_ID = "PROJECT_ID"
LOCATION = "us-central1"
MODEL_ID = "gemini-3.8-live"
# Initialize the Gen AI client for enterprise.
client = genai.Client(enterprise=True, project=PROJECT_ID, location=LOCATION)
# Define a tool for asynchronous execution.
order_lookup_tool = types.FunctionDeclaration(
name="lookup_order_status",
description="Fetches real-time shipping status for a customer order ID.",
parameters=types.Schema(
type="OBJECT",
properties={
"order_id": types.Schema(
type="STRING",
description="The order ID, for example, ORD-8472",
),
},
required=["order_id"],
),
)
# Configure the live connection.
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
system_instruction=types.Content(
parts=[
types.Part.from_text(
text=(
"You are an enterprise concierge. When you call a tool, "
"briefly acknowledge the request and tell the user what you're doing. "
"If a tool returns no results, inform the user before trying again. "
"Never issue more than two consecutive tool calls without speaking."
)
)
]
),
speech_config=types.SpeechConfig(
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(voice_name="Aoede")
),
),
input_audio_transcription=types.AudioTranscriptionConfig(
custom_vocabulary=["ORD-8472", "Gemini Live", "Express Shipping"]
),
output_audio_transcription=types.AudioTranscriptionConfig(),
tools=[types.Tool(function_declarations=[order_lookup_tool])],
)
async def handle_tool_call(session, function_call):
"""Executes backend calls asynchronously without blocking incoming audio."""
order_id = function_call.args.get("order_id", "")
await asyncio.sleep(2.0) # Simulate backend API latency.
if not order_id.startswith("ORD-"):
result = {
"status": "invalid_argument",
"retryable": False,
"message": f"Order ID '{order_id}' is invalid. Ask the user to verify.",
}
else:
result = {
"status": "ok",
"retryable": False,
"order_id": order_id,
"shipping_status": "Out for delivery by 4:00 PM",
}
# Send tool response matching the call ID.
await session.send_tool_response(
function_responses=[
types.FunctionResponse(
id=function_call.id,
name=function_call.name,
response=result,
)
]
)
async def main():
async with client.aio.live.connect(model=MODEL_ID, config=config) as session:
print(f"Connected to {MODEL_ID}")
# Send initial text or stream 16 kHz PCM audio chunks.
await session.send_realtime_input(
text="Hi! Can you check the status of order ORD-8472?"
)
async for message in session.receive():
# Handle asynchronous tool calls.
if message.tool_call:
for call in message.tool_call.function_calls:
asyncio.create_task(handle_tool_call(session, call))
# Process audio output chunks and transcriptions.
if message.server_content:
if (
message.server_content.output_transcription
and message.server_content.output_transcription.text
):
print(
f"Agent: {message.server_content.output_transcription.text}",
end="",
flush=True,
)
if __name__ == "__main__":
asyncio.run(main())
필수 API 규칙 및 관례
3.8 Live로 빌드할 때는 다음 API 관례를 따르세요.
- 유용한 함수 응답: 도구 핸들러에서 빈 딕셔너리 (
{}) 또는None을 반환하지 마세요. 도구가 오류 또는 빈 페이로드를 반환하면 응답에 상태 필드가 포함되지 않는 한 3.8 Live에서 수정된 인수로 함수 호출을 반복 생성할 수 있습니다. 모든 도구 응답에서 구조화된 필드를 반환합니다.status: 기계 가독형 상태 문자열(예:"ok","no_results", 또는"invalid_argument")retryable: 호출을 반복해도 동일한 결과가 반환되는 경우false로 설정합니다.message또는guidance: 사용자에게 보고할 상태를 지정하는 텍스트입니다.
- 프롬프트 수준 도구 재시도 한도:
system_instruction에 재시도 한도를 포함합니다. 예: "도구 호출에서 결과를 반환하지 않으면 매개변수 변형으로 반복 검색하는 대신 사용자에게 알립니다. 사용자와 대화하지 않고 연속으로 두 번 이상 도구 호출을 실행하지 마세요." - 엄격한
FunctionResponse일치:- 모든
FunctionResponse턴은 이전FunctionCall의 정확한id를 제공해야 합니다. FunctionResponse.response에서 응답 객체를 직접 전달합니다.
- 모든
- 스트리밍 오디오 형식:
- 입력 오디오: 16kHz, 16비트, 리틀 엔디안, 모노 PCM(
audio/pcm;rate=16000), 20~100ms 청크로 스트리밍됩니다. - 출력 오디오: 24kHz 모노 PCM
- 입력 오디오: 16kHz, 16비트, 리틀 엔디안, 모노 PCM(
- 삭제된 기존 매개변수: 구성에서
enable_affective_dialog또는proactivity를 전달하지 마세요. 이러한 기능은 3.8 Live에서 기본적으로 사용 설정됩니다. - 대화 기록 시드:
send_client_content를 사용하여 멀티턴 기록을 시드하는 경우 클라이언트 앱이setup_complete서버 프레임을 수신할 때까지 기다리고HistoryConfig(initial_history_in_client_content=True)를 구성합니다.
Gemini 3.8 Live로 마이그레이션
gemini-live-2.5-flash-native-audio에서
gemini-3.8-live로 마이그레이션하는 방법에 관한 자세한 내용은 Gemini 2.5 Flash Live API 네이티브 오디오에서
Gemini 3.8 Live로 마이그레이션을 참고하세요.
개발자 체크리스트
앱을 배포하기 전에 다음 항목을 확인하세요.
추가 리소스
자세한 내용은 다음 리소스를 참고하세요.