Mengirimkan aliran audio dan video

Dokumen ini menjelaskan cara mengirim streaming audio dan video ke Gemini Live API untuk komunikasi dua arah real-time dengan model Gemini. Pelajari cara mengonfigurasi dan mengirimkan data audio dan video untuk membuat aplikasi dinamis dan interaktif.

Mengirim streaming audio

Penerapan audio real-time memerlukan kepatuhan yang ketat terhadap spesifikasi frekuensi sampel dan pengelolaan buffer yang cermat untuk memastikan latensi rendah dan kemampuan interupsi alami.

Live API mendukung format audio berikut:

  • Input audio: Audio PCM 16-bit mentah pada 16 kHz, little-endian
  • Audio output: Audio PCM 16-bit mentah pada 24 kHz, little-endian

Contoh kode berikut menunjukkan cara mengirim data streaming audio:

import asyncio
# Assumes session is an active Live API session
# and chunk_data contains bytes of raw 16-bit PCM audio at 16 kHz.
from google.genai import types
# Send audio input data in chunks
await session.send_realtime_input(
    audio=types.Blob(data=chunk_data, mime_type="audio/pcm;rate=16000")
)

Klien harus mempertahankan buffer pemutaran. Server melakukan streaming audio dalam potongan dalam pesan server_content. Tanggung jawab klien adalah mendekode, mem-buffer, dan memutar data.

Contoh kode berikut menunjukkan cara memproses data streaming audio:

import asyncio
# Assumes session is an active Live API session
# and audio_queue is an asyncio.Queue for buffering audio for playback.
import numpy as np

async for msg in session.receive():
    server_content = msg.server_content
    if server_content:
        # 1. Handle Interruption
        if server_content.interrupted:
            print("\n[Interrupted] Flushing buffer...")
            # Clear the Python queue
            while not audio_queue.empty():
                try: audio_queue.get_nowait()
                except asyncio.QueueEmpty: break
            # Send signal to worker to reset hardware buffers if needed
            await audio_queue.put(None)
            continue

        # 2. Process Audio chunks
        if server_content.model_turn:
            for part in server_content.model_turn.parts:
                if part.inline_data:
                    # Add PCM data to playback queue
                    await audio_queue.put(np.frombuffer(part.inline_data.data, dtype='int16'))

Mengirim streaming video

Streaming video memberikan konteks visual. Live API mengharapkan urutan frame gambar terpisah dan mendukung input frame video pada 1 FPS. Untuk hasil terbaik, gunakan resolusi 768x768 pada 1 FPS.

Contoh kode berikut menunjukkan cara mengirim data streaming video:

import asyncio
# Assumes session is an active Live API session
# and chunk_data contains bytes of a JPEG image.
from google.genai import types
# Send video input data in chunks
await session.send_realtime_input(
    media=types.Blob(data=chunk_data, mime_type="image/jpeg")
)

Implementasi klien mengambil frame dari feed video, mengenkodekannya sebagai blob JPEG, dan mengirimkannya menggunakan struktur pesan realtime_input.

import cv2
import asyncio
from google.genai import types

async def send_video_stream(session):
    # Open webcam
    cap = cv2.VideoCapture(0)

    while True:
        ret, frame = cap.read()
        if not ret: break

        # 1. Resize to optimal resolution (768x768 max)
        frame = cv2.resize(frame, (768, 768))

        # 2. Encode as JPEG
        _, buffer = cv2.imencode('.jpg', frame,)

        # 3. Send as realtime input
        await session.send_realtime_input(
            media=types.Blob(data=buffer.tobytes(), mime_type="image/jpeg")
        )

        # 4. Wait 1 second (1 FPS)
        await asyncio.sleep(1.0)

    cap.release()

Mengonfigurasi resolusi media

Anda dapat menentukan resolusi untuk media input dengan menetapkan kolom media_resolution dalam konfigurasi sesi. Resolusi yang lebih rendah akan mengurangi penggunaan token dan latensi, sedangkan resolusi yang lebih tinggi akan meningkatkan pengenalan detail. Nilai yang didukung mencakup low, medium, dan high.

config = {
    "response_modalities": ["audio"],
    "media_resolution": "low",
}

Langkah berikutnya