Envie streams de áudio e vídeo

Este documento descreve como enviar streams de áudio e vídeo para a API Live para comunicação bidirecional em tempo real com os modelos do Gemini. Saiba como configurar e transmitir dados de áudio e vídeo para criar aplicações dinâmicas e interativas.

Envie streams de áudio

A implementação de áudio em tempo real requer uma adesão rigorosa às especificações da taxa de amostragem e uma gestão cuidadosa do buffer para garantir uma latência baixa e uma capacidade de interrupção natural.

A API Live suporta os seguintes formatos de áudio:

  • Áudio de entrada: áudio PCM de 16 bits não processado a 16 kHz, little-endian
  • Áudio de saída: áudio PCM de 16 bits não processado a 24 kHz, little-endian

O seguinte exemplo de código mostra como enviar dados de áudio em streaming:

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")
)

O cliente tem de manter um buffer de reprodução. O servidor transmite áudio em blocos em mensagens server_content. A responsabilidade do cliente é descodificar, colocar em buffer e reproduzir os dados.

O seguinte exemplo de código mostra como processar dados de áudio em streaming:

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'))

Envie streams de vídeo

O streaming de vídeo oferece contexto visual. A API Live espera uma sequência de frames de imagens discretos e suporta a entrada de frames de vídeo a 1 FPS. Para obter os melhores resultados, use a resolução nativa de 768 x 768 a 1 FPS.

O exemplo de código seguinte mostra como enviar dados de vídeo em streaming:

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")
)

A implementação do cliente captura um frame do feed de vídeo, codifica-o como um blob JPEG e transmite-o através da estrutura de mensagens 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()

Configure a resolução de multimédia

Pode especificar a resolução para o conteúdo multimédia de entrada definindo o campo media_resolution na configuração da sessão. Uma resolução mais baixa reduz a utilização de tokens e a latência, enquanto uma resolução mais alta melhora o reconhecimento de detalhes. Os valores suportados incluem low, medium e high.

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

O que se segue?