Live API memungkinkan interaksi suara dan video dua arah dengan latensi rendah dengan Gemini. Dengan menggunakan Live API, Anda dapat memberikan pengalaman percakapan suara alami dan seperti manusia kepada pengguna akhir, serta kemampuan untuk menyela respons model menggunakan perintah suara. Live API dapat memproses input teks, audio, dan video, serta dapat memberikan output teks dan audio.
Spesifikasi
Live API memiliki spesifikasi teknis berikut:
- Input: Teks, audio, dan video
- Output: Teks dan audio (ucapan sintetis)
- Durasi sesi default: 10 menit
- Durasi sesi dapat diperpanjang dalam kelipatan 10 menit sesuai kebutuhan
- Jendela konteks: 32 ribu token
- Pilihan antara 8 suara untuk respons
- Dukungan untuk respons dalam 31 bahasa
Menggunakan Live API
Bagian berikut memberikan contoh cara menggunakan fitur Live API.
Untuk informasi selengkapnya, lihat Panduan referensi Live API.
Mengirim teks dan menerima audio
Gen AI SDK untuk Python
voice_name = "Aoede" # @param ["Aoede", "Puck", "Charon", "Kore", "Fenrir", "Leda", "Orus", "Zephyr"] config = LiveConnectConfig( response_modalities=["AUDIO"], speech_config=SpeechConfig( voice_config=VoiceConfig( prebuilt_voice_config=PrebuiltVoiceConfig( voice_name=voice_name, ) ), ), ) async with client.aio.live.connect( model=MODEL_ID, config=config, ) as session: text_input = "Hello? Gemini are you there?" display(Markdown(f"**Input:** {text_input}")) await session.send_client_content( turns=Content(role="user", parts=[Part(text=text_input)])) audio_data = [] async for message in session.receive(): if ( message.server_content.model_turn and message.server_content.model_turn.parts ): for part in message.server_content.model_turn.parts: if part.inline_data: audio_data.append( np.frombuffer(part.inline_data.data, dtype=np.int16) ) if audio_data: display(Audio(np.concatenate(audio_data), rate=24000, autoplay=True))
Mengirim dan menerima teks
Gen AI SDK for Python
Instal
pip install --upgrade google-genai
Untuk mempelajari lebih lanjut, lihat dokumentasi referensi SDK.
Tetapkan variabel lingkungan untuk menggunakan Gen AI SDK dengan Vertex AI:
# Replace the `GOOGLE_CLOUD_PROJECT` and `GOOGLE_CLOUD_LOCATION` values # with appropriate values for your project. export GOOGLE_CLOUD_PROJECT=GOOGLE_CLOUD_PROJECT export GOOGLE_CLOUD_LOCATION=global export GOOGLE_GENAI_USE_VERTEXAI=True
Mengirim audio
Gen AI SDK untuk Python
import asyncio import wave from google import genai client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'}) model = "gemini-2.0-flash-live-preview-04-09" config = {"response_modalities": ["AUDIO"]} async def main(): async with client.aio.live.connect(model=model, config=config) as session: wf = wave.open("audio.wav", "wb") wf.setnchannels(1) wf.setsampwidth(2) wf.setframerate(24000) message = "Hello? Gemini are you there?" await session.send_client_content( turns=Content(role="user", parts=[Part(text=message)])) async for idx,response in async_enumerate(session.receive()): if response.data is not None: wf.writeframes(response.data) # Un-comment this code to print audio data info # if response.server_content.model_turn is not None: # print(response.server_content.model_turn.parts[0].inline_data.mime_type) wf.close() if __name__ == "__main__": asyncio.run(main())
Format audio yang didukung
Live API mendukung format audio berikut:
- Format audio input: Audio PCM mentah 16 bit pada 16 kHz little-endian
- Format audio output: Audio PCM mentah 16 bit pada 24 kHz little-endian
Transkripsi audio
Live API dapat mentranskripsikan audio input dan output:
Gen AI SDK untuk Python
# Set model generation_config CONFIG = { 'response_modalities': ['AUDIO'], } headers = { "Content-Type": "application/json", "Authorization": f"Bearer {bearer_token[0]}", } # Connect to the server async with connect(SERVICE_URL, additional_headers=headers) as ws: # Setup the session await ws.send( json.dumps( { "setup": { "model": "gemini-2.0-flash-live-preview-04-09", "generation_config": CONFIG, 'input_audio_transcription': {}, 'output_audio_transcription': {} } } ) ) # Receive setup response raw_response = await ws.recv(decode=False) setup_response = json.loads(raw_response.decode("ascii")) # Send text message text_input = "Hello? Gemini are you there?" display(Markdown(f"**Input:** {text_input}")) msg = { "client_content": { "turns": [{"role": "user", "parts": [{"text": text_input}]}], "turn_complete": True, } } await ws.send(json.dumps(msg)) responses = [] input_transcriptions = [] output_transcriptions = [] # Receive chucks of server response async for raw_response in ws: response = json.loads(raw_response.decode()) server_content = response.pop("serverContent", None) if server_content is None: break if (input_transcription := server_content.get("inputTranscription")) is not None: if (text := input_transcription.get("text")) is not None: input_transcriptions.append(text) if (output_transcription := server_content.get("outputTranscription")) is not None: if (text := output_transcription.get("text")) is not None: output_transcriptions.append(text) model_turn = server_content.pop("modelTurn", None) if model_turn is not None: parts = model_turn.pop("parts", None) if parts is not None: for part in parts: pcm_data = base64.b64decode(part["inlineData"]["data"]) responses.append(np.frombuffer(pcm_data, dtype=np.int16)) # End of turn turn_complete = server_content.pop("turnComplete", None) if turn_complete: break if input_transcriptions: display(Markdown(f"**Input transcription >** {''.join(input_transcriptions)}")) if responses: # Play the returned audio message display(Audio(np.concatenate(responses), rate=24000, autoplay=True)) if output_transcriptions: display(Markdown(f"**Output transcription >** {''.join(output_transcriptions)}"))
Mengubah setelan suara dan bahasa
Live API menggunakan Chirp 3 untuk mendukung respons ucapan sintesis dalam 8 suara HD dan 31 bahasa.
Anda dapat memilih antara suara berikut:
Aoede
(perempuan)Charon
(laki-laki)Fenrir
(laki-laki)Kore
(perempuan)Leda
(perempuan)Orus
(laki-laki)Puck
(laki-laki)Zephyr
(perempuan)
Untuk demo suara ini dan daftar lengkap bahasa yang tersedia, lihat Chirp 3: Suara HD.
Untuk menyetel suara dan bahasa respons:
Gen AI SDK untuk Python
config = LiveConnectConfig( response_modalities=["AUDIO"], speech_config=SpeechConfig( voice_config=VoiceConfig( prebuilt_voice_config=PrebuiltVoiceConfig( voice_name=voice_name, ) ), language_code="en-US", ), )
Konsol
- Buka Vertex AI Studio > Streaming real-time.
- Di peluas Output, pilih suara dari drop-down Voice.
- Di peluas yang sama, pilih bahasa dari drop-down Bahasa.
- Klik Mulai sesi untuk memulai sesi.
Untuk hasil terbaik saat meminta dan mewajibkan model untuk merespons dalam bahasa non-Inggris, sertakan hal berikut sebagai bagian dari petunjuk sistem Anda:
RESPOND IN LANGUAGE. YOU MUST RESPOND UNMISTAKABLY IN LANGUAGE.
Melakukan percakapan yang di-streaming
Gen AI SDK untuk Python
Siapkan percakapan dengan API yang memungkinkan Anda mengirim perintah teks dan menerima respons audio:
# Set model generation_config CONFIG = {"response_modalities": ["AUDIO"]} headers = { "Content-Type": "application/json", "Authorization": f"Bearer {bearer_token[0]}", } async def main() -> None: # Connect to the server async with connect(SERVICE_URL, additional_headers=headers) as ws: # Setup the session async def setup() -> None: await ws.send( json.dumps( { "setup": { "model": "gemini-2.0-flash-live-preview-04-09", "generation_config": CONFIG, } } ) ) # Receive setup response raw_response = await ws.recv(decode=False) setup_response = json.loads(raw_response.decode("ascii")) print(f"Connected: {setup_response}") return # Send text message async def send() -> bool: text_input = input("Input > ") if text_input.lower() in ("q", "quit", "exit"): return False msg = { "client_content": { "turns": [{"role": "user", "parts": [{"text": text_input}]}], "turn_complete": True, } } await ws.send(json.dumps(msg)) return True # Receive server response async def receive() -> None: responses = [] # Receive chucks of server response async for raw_response in ws: response = json.loads(raw_response.decode()) server_content = response.pop("serverContent", None) if server_content is None: break model_turn = server_content.pop("modelTurn", None) if model_turn is not None: parts = model_turn.pop("parts", None) if parts is not None: for part in parts: pcm_data = base64.b64decode(part["inlineData"]["data"]) responses.append(np.frombuffer(pcm_data, dtype=np.int16)) # End of turn turn_complete = server_content.pop("turnComplete", None) if turn_complete: break # Play the returned audio message display(Markdown("**Response >**")) display(Audio(np.concatenate(responses), rate=24000, autoplay=True)) return await setup() while True: if not await send(): break await receive()
Mulai percakapan, masukkan perintah Anda, atau ketik q
, quit
, atau exit
untuk keluar.
await main()
Konsol
- Buka Vertex AI Studio > Streaming real-time.
- Klik Mulai sesi untuk memulai sesi percakapan.
Untuk mengakhiri sesi, klik
Hentikan sesi.Durasi sesi
Durasi maksimum sesi percakapan default adalah 10 menit. Notifikasi go_away
(BidiGenerateContentServerMessage.go_away
) akan dikirim kembali ke klien 60 detik sebelum sesi berakhir.
Saat menggunakan API, Anda dapat memperpanjang durasi sesi dengan penambahan 10 menit. Tidak ada batasan berapa kali Anda dapat memperpanjang sesi. Untuk contoh cara memperpanjang durasi sesi, lihat Mengaktifkan dan menonaktifkan lanjutan sesi. Fitur ini saat ini hanya tersedia di API, bukan di Vertex AI Studio.
Jendela konteks
Panjang konteks maksimum untuk sesi di Live API adalah 32.768 token secara default, yang dialokasikan untuk menyimpan data real-time yang di-streaming dengan kecepatan 25 token per detik (TPS) untuk audio dan 258 TPS untuk video, dan konten lainnya termasuk input berbasis teks, output model, dll.
Jika periode konteks melebihi panjang konteks maksimum, konteks putaran terlama dari periode konteks akan terpotong, sehingga ukuran periode konteks secara keseluruhan berada di bawah batasan.
Durasi konteks default sesi, dan durasi konteks target setelah
pemotongan, dapat dikonfigurasi menggunakan
kolom context_window_compression.trigger_tokens
dan
context_window_compression.sliding_window.target_tokens
dari pesan
penyiapan.
Sesi serentak
Secara default, Anda dapat memiliki hingga 10 sesi serentak per project.
Memperbarui petunjuk sistem di tengah sesi
Live API memungkinkan Anda memperbarui petunjuk sistem di tengah sesi yang aktif. Anda dapat menggunakannya untuk menyesuaikan respons model di tengah sesi, seperti mengubah bahasa yang digunakan model untuk merespons menjadi bahasa lain atau mengubah gaya bahasa yang Anda inginkan untuk direspons oleh model.
Mengubah setelan deteksi aktivitas suara
Secara default, model secara otomatis melakukan deteksi aktivitas suara (VAD) pada
streaming input audio yang berkelanjutan. VAD dapat dikonfigurasi dengan kolom
realtimeInputConfig.automaticActivityDetection
dari pesan
penyiapan.
Saat streaming audio dijeda selama lebih dari satu detik (misalnya, karena
pengguna menonaktifkan mikrofon), peristiwa
audioStreamEnd
harus dikirim untuk menghapus audio yang di-cache. Klien dapat melanjutkan pengiriman
data audio kapan saja.
Atau, VAD otomatis dapat dinonaktifkan dengan menetapkan
realtimeInputConfig.automaticActivityDetection.disabled
ke true
dalam pesan
penyiapan. Dalam konfigurasi ini, klien bertanggung jawab untuk mendeteksi ucapan
pengguna dan mengirim
pesan
activityStart
dan
activityEnd
pada waktu yang tepat. audioStreamEnd
tidak dikirim dalam konfigurasi ini. Sebagai gantinya, gangguan streaming apa pun ditandai dengan
pesan activityEnd
.
Mengaktifkan dan menonaktifkan kelanjutan sesi
Fitur ini dinonaktifkan secara default. Fitur ini harus diaktifkan oleh pengguna setiap kali mereka memanggil API dengan menentukan kolom dalam permintaan API, dan privasi tingkat project diterapkan untuk data yang di-cache. Mengaktifkan Lanjutan Sesi memungkinkan pengguna terhubung kembali ke sesi sebelumnya dalam waktu 24 jam dengan menyimpan data dalam cache, termasuk data perintah teks, video, dan audio serta output model, hingga 24 jam. Untuk mencapai retensi data nol, jangan aktifkan fitur ini.
Untuk mengaktifkan fitur melanjutkan sesi, tetapkan kolom session_resumption
pesan BidiGenerateContentSetup
. Jika diaktifkan, server akan mengambil snapshot konteks sesi yang di-cache saat ini secara berkala, dan menyimpannya di penyimpanan internal. Saat snapshot berhasil diambil, resumption_update
akan ditampilkan dengan ID nama sebutan channel yang dapat Anda rekam dan gunakan nanti untuk melanjutkan
sesi dari snapshot.
Berikut adalah contoh pengaktifan fitur melanjutkan sesi, dan mengumpulkan informasi ID nama sebutan channel:
Gen AI SDK untuk Python
# Set model generation_config CONFIG = {"response_modalities": ["TEXT"]} headers = { "Content-Type": "application/json", "Authorization": f"Bearer {bearer_token[0]}", } # Connect to the server async with connect(SERVICE_URL, additional_headers=headers) as ws: # Setup the session await ws.send( json.dumps( { "setup": { "model": "gemini-2.0-flash-live-preview-04-09", "generation_config": CONFIG, # Enable session resumption. "session_resumption": {}, } } ) ) # Receive setup response raw_response = await ws.recv(decode=False) setup_response = json.loads(raw_response.decode("ascii")) # Send text message text_input = "Hello? Gemini are you there?" display(Markdown(f"**Input:** {text_input}")) msg = { "client_content": { "turns": [{"role": "user", "parts": [{"text": text_input}]}], "turn_complete": True, } } await ws.send(json.dumps(msg)) responses = [] handle_id = "" turn_completed = False resumption_received = False # Receive chucks of server response, # wait for turn completion and resumption handle. async for raw_response in ws: response = json.loads(raw_response.decode()) server_content = response.pop("serverContent", None) resumption_update = response.pop("sessionResumptionUpdate", None) if server_content is not None: model_turn = server_content.pop("modelTurn", None) if model_turn is not None: parts = model_turn.pop("parts", None) if parts is not None: responses.append(parts[0]["text"]) # End of turn turn_complete = server_content.pop("turnComplete", None) if turn_complete: turn_completed = True elif resumption_update is not None: handle_id = resumption_update['newHandle'] resumption_received = True else: continue if turn_complete and resumption_received: break # Print the server response display(Markdown(f"**Response >** {''.join(responses)}")) display(Markdown(f"**Session Handle ID >** {handle_id}"))
Jika ingin melanjutkan sesi sebelumnya, Anda dapat menetapkan kolom handle
konfigurasi setup.session_resumption
ke ID nama sebutan channel
yang direkam sebelumnya:
Gen AI SDK untuk Python
# Set model generation_config CONFIG = {"response_modalities": ["TEXT"]} headers = { "Content-Type": "application/json", "Authorization": f"Bearer {bearer_token[0]}", } # Connect to the server async with connect(SERVICE_URL, additional_headers=headers) as ws: # Setup the session await ws.send( json.dumps( { "setup": { "model": "gemini-2.0-flash-live-preview-04-09", "generation_config": CONFIG, # Enable session resumption. "session_resumption": { "handle": handle_id, }, } } ) ) # Receive setup response raw_response = await ws.recv(decode=False) setup_response = json.loads(raw_response.decode("ascii")) # Send text message text_input = "What was the last question I asked?" display(Markdown(f"**Input:** {text_input}")) msg = { "client_content": { "turns": [{"role": "user", "parts": [{"text": text_input}]}], "turn_complete": True, } } await ws.send(json.dumps(msg)) responses = [] handle_id = "" turn_completed = False resumption_received = False # Receive chucks of server response, # wait for turn completion and resumption handle. async for raw_response in ws: response = json.loads(raw_response.decode()) server_content = response.pop("serverContent", None) resumption_update = response.pop("sessionResumptionUpdate", None) if server_content is not None: model_turn = server_content.pop("modelTurn", None) if model_turn is not None: parts = model_turn.pop("parts", None) if parts is not None: responses.append(parts[0]["text"]) # End of turn turn_complete = server_content.pop("turnComplete", None) if turn_complete: turn_completed = True elif resumption_update is not None: handle_id = resumption_update['newHandle'] resumption_received = True else: continue if turn_complete and resumption_received: break # Print the server response # Expected answer: "You just asked if I was there." display(Markdown(f"**Response >** {''.join(responses)}")) display(Markdown(f"**Session Handle >** {resumption_update}"))
Jika ingin mencapai kelancaran dalam melanjutkan sesi, Anda dapat mengaktifkan mode transparan:
Gen AI SDK untuk Python
await ws.send( json.dumps( { "setup": { "model": "gemini-2.0-flash-live-preview-04-09", "generation_config": CONFIG, # Enable session resumption. "session_resumption": { "transparent": True, }, } } ) )
Setelah mode transparan diaktifkan, indeks pesan klien yang sesuai dengan snapshot konteks akan ditampilkan secara eksplisit. Hal ini membantu mengidentifikasi pesan klien yang perlu Anda kirim lagi, saat Anda melanjutkan sesi dari handle kelanjutan.
Menggunakan panggilan fungsi
Anda dapat menggunakan panggilan fungsi untuk membuat deskripsi fungsi, lalu meneruskan deskripsi tersebut ke model dalam permintaan. Respons dari model mencakup nama fungsi yang sesuai dengan deskripsi dan argumen yang digunakan untuk memanggilnya.
Semua fungsi harus dideklarasikan di awal sesi dengan mengirimkan definisi
alat sebagai bagian dari pesan setup
.
Gen AI SDK untuk Python
# Set model generation_config CONFIG = {"response_modalities": ["TEXT"]} # Define function declarations TOOLS = { "function_declarations": { "name": "get_current_weather", "description": "Get the current weather in the given location", "parameters": { "type": "OBJECT", "properties": {"location": {"type": "STRING"}}, }, } } headers = { "Content-Type": "application/json", "Authorization": f"Bearer {bearer_token[0]}", } # Connect to the server async with connect(SERVICE_URL, additional_headers=headers) as ws: # Setup the session await ws.send( json.dumps( { "setup": { "model": "gemini-2.0-flash-live-preview-04-09", "generation_config": CONFIG, "tools": TOOLS, } } ) ) # Receive setup response raw_response = await ws.recv(decode=False) setup_response = json.loads(raw_response.decode()) # Send text message text_input = "Get the current weather in Santa Clara, San Jose and Mountain View" display(Markdown(f"**Input:** {text_input}")) msg = { "client_content": { "turns": [{"role": "user", "parts": [{"text": text_input}]}], "turn_complete": True, } } await ws.send(json.dumps(msg)) responses = [] # Receive chucks of server response async for raw_response in ws: response = json.loads(raw_response.decode("UTF-8")) if (tool_call := response.get("toolCall")) is not None: for function_call in tool_call["functionCalls"]: responses.append(f"FunctionCall: {str(function_call)}\n") if (server_content := response.get("serverContent")) is not None: if server_content.get("turnComplete", True): break # Print the server response display(Markdown("**Response >** {}".format("\n".join(responses))))
Menggunakan eksekusi kode
Anda dapat menggunakan eksekusi kode dengan Live API untuk membuat dan mengeksekusi kode Python secara langsung.
Gen AI SDK untuk Python
# Set model generation_config CONFIG = {"response_modalities": ["TEXT"]} # Set code execution TOOLS = {"code_execution": {}} headers = { "Content-Type": "application/json", "Authorization": f"Bearer {bearer_token[0]}", } # Connect to the server async with connect(SERVICE_URL, additional_headers=headers) as ws: # Setup the session await ws.send( json.dumps( { "setup": { "model": "gemini-2.0-flash-live-preview-04-09", "generation_config": CONFIG, "tools": TOOLS, } } ) ) # Receive setup response raw_response = await ws.recv(decode=False) setup_response = json.loads(raw_response.decode()) # Send text message text_input = "Write code to calculate the 15th fibonacci number then find the nearest palindrome to it" display(Markdown(f"**Input:** {text_input}")) msg = { "client_content": { "turns": [{"role": "user", "parts": [{"text": text_input}]}], "turn_complete": True, } } await ws.send(json.dumps(msg)) responses = [] # Receive chucks of server response async for raw_response in ws: response = json.loads(raw_response.decode("UTF-8")) if (server_content := response.get("serverContent")) is not None: if (model_turn:= server_content.get("modelTurn")) is not None: if (parts := model_turn.get("parts")) is not None: if parts[0].get("text"): responses.append(parts[0]["text"]) for part in parts: if (executable_code := part.get("executableCode")) is not None: display( Markdown( f"""**Executable code:** ```py {executable_code.get("code")} ``` """ ) ) if server_content.get("turnComplete", False): break # Print the server response display(Markdown(f"**Response >** {''.join(responses)}"))
Menggunakan Grounding dengan Google Penelusuran
Anda dapat menggunakan Pembumian dengan Google
Penelusuran dengan
Live API menggunakan google_search
:
Gen AI SDK untuk Python
# Set model generation_config CONFIG = {"response_modalities": ["TEXT"]} # Set google search TOOLS = {"google_search": {}} headers = { "Content-Type": "application/json", "Authorization": f"Bearer {bearer_token[0]}", } # Connect to the server async with connect(SERVICE_URL, additional_headers=headers) as ws: # Setup the session await ws.send( json.dumps( { "setup": { "model": "gemini-2.0-flash-live-preview-04-09", "generation_config": CONFIG, "tools": TOOLS, } } ) ) # Receive setup response raw_response = await ws.recv(decode=False) setup_response = json.loads(raw_response.decode()) # Send text message text_input = "What is the current weather in San Jose, CA?" display(Markdown(f"**Input:** {text_input}")) msg = { "client_content": { "turns": [{"role": "user", "parts": [{"text": text_input}]}], "turn_complete": True, } } await ws.send(json.dumps(msg)) responses = [] # Receive chucks of server response async for raw_response in ws: response = json.loads(raw_response.decode()) server_content = response.pop("serverContent", None) if server_content is None: break model_turn = server_content.pop("modelTurn", None) if model_turn is not None: parts = model_turn.pop("parts", None) if parts is not None: responses.append(parts[0]["text"]) # End of turn turn_complete = server_content.pop("turnComplete", None) if turn_complete: break # Print the server response display(Markdown("**Response >** {}".format("\n".join(responses))))
Batasan
Lihat bagian keterbatasan Live API dalam dokumentasi referensi kami untuk mengetahui daftar lengkap keterbatasan saat ini untuk Live API.
Harga
Lihat Halaman harga untuk mengetahui detailnya.
Informasi selengkapnya
Untuk informasi selengkapnya tentang Live API seperti referensi
WebSocket
API, lihat dokumentasi Gemini API.