Compreensão do vídeo

É possível adicionar vídeos às solicitações do Gemini para realizar tarefas que envolvem entender o conteúdo dos vídeos incluídos. Esta página mostra como adicionar vídeos às suas solicitações para o Gemini na Vertex AI usando o console do Google Cloud e a API Vertex AI.

Modelos compatíveis

A tabela a seguir lista os modelos compatíveis com a compreensão de vídeo:

Modelo Detalhes da modalidade de vídeo

Gemini 1.5 Flash

Acessar o card de modelo em Flash do Gemini 1.5

Duração máxima do vídeo:

  • Com áudio: aproximadamente 50 minutos
  • Sem áudio: 60 minutos

Máximo de vídeos por solicitação: 10

Gemini 1.5 Pro

Acessar o card de modelo do Gemini 1.5 Pro

Duração máxima do vídeo:

  • Com áudio: aproximadamente 50 minutos
  • Sem áudio: 60 minutos

Máximo de vídeos por solicitação: 10

Gemini 1.0 Pro Vision

Acessar o card de modelo Gemini 1.0 Pro Vision

Duração máxima do vídeo: dois minutos.

Número máximo de vídeos por comando: 1

O áudio do vídeo é ignorado.

Para uma lista de linguagens compatíveis com os modelos do Gemini, consulte as informações do modelo Modelos do Google. Para saber mais sobre como criar comandos multimodais, consulte Criar comandos multimodais. Se você está procurando uma maneira de usar o Gemini diretamente no seu dispositivo móvel e e apps da Web, consulte os SDKs da Vertex AI para Firebase para apps para Android, Swift, da Web e Flutter.

Adicionar vídeos a uma solicitação

É possível adicionar um ou vários vídeos à sua solicitação ao Gemini e os vídeos podem incluir áudio.

Vídeo único

O exemplo de código em cada uma das guias a seguir mostra uma maneira diferente de identificar o conteúdo de um vídeo. Esta amostra funciona com todos os modelos multimodais do Gemini.

Python

Para saber como instalar o SDK da Vertex AI para Python, consulte Instalar o SDK da Vertex AI para Python. Saiba mais na documentação de referência da API SDK da Vertex AI para Python.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o parâmetro stream em generate_content.

  response = model.generate_content(contents=[...], stream = True)
  

Para uma resposta que não seja de streaming, remova o parâmetro ou defina-o como False.

Código de amostra

import vertexai

from vertexai.generative_models import GenerativeModel, Part

# TODO(developer): Update and un-comment below line
# project_id = "PROJECT_ID"

vertexai.init(project=project_id, location="us-central1")

vision_model = GenerativeModel("gemini-1.5-flash-001")

# Generate text
response = vision_model.generate_content(
    [
        Part.from_uri(
            "gs://cloud-samples-data/video/animals.mp4", mime_type="video/mp4"
        ),
        "What is in the video?",
    ]
)
print(response.text)

Java

Antes de testar esta amostra, siga as instruções de configuração do Java no guia de início rápido da Vertex AI. Para mais informações, consulte a documentação de referência do SDK da Vertex AI para Java para Gemini.

Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o método generateContentStream.

  public ResponseStream<GenerateContentResponse> generateContentStream(Content content)
  

Para uma resposta que não seja de streaming, use o método generateContent.

  public GenerateContentResponse generateContent(Content content)
  

Código de amostra

import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.generativeai.ContentMaker;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import com.google.cloud.vertexai.generativeai.PartMaker;
import com.google.cloud.vertexai.generativeai.ResponseHandler;
import java.io.IOException;

public class MultimodalVideoInput {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-google-cloud-project-id";
    String location = "us-central1";
    String modelName = "gemini-1.5-flash-001";

    multimodalVideoInput(projectId, location, modelName);
  }

  // Analyzes the given video input.
  public static void multimodalVideoInput(String projectId, String location, String modelName)
      throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (VertexAI vertexAI = new VertexAI(projectId, location)) {
      String videoUri = "gs://cloud-samples-data/video/animals.mp4";

      GenerativeModel model = new GenerativeModel(modelName, vertexAI);
      GenerateContentResponse response = model.generateContent(
          ContentMaker.fromMultiModalData(
              "What is in the video?",
              PartMaker.fromMimeTypeAndData("video/mp4", videoUri)
          ));

      String output = ResponseHandler.getText(response);
      System.out.println(output);
    }
  }
}

Node.js

Antes de testar esta amostra, siga as instruções de configuração do Node.js no Guia de início rápido da IA generativa usando o SDK do Node.js. Para mais informações, consulte a documentação de referência do SDK do Node.js para Gemini.

Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o método generateContentStream.

  const streamingResp = await generativeModel.generateContentStream(request);
  

Para uma resposta que não seja de streaming, use o método generateContent.

  const streamingResp = await generativeModel.generateContent(request);
  

Código de amostra

const {VertexAI} = require('@google-cloud/vertexai');

/**
 * TODO(developer): Update these variables before running the sample.
 */
async function sendMultiModalPromptWithVideo(
  projectId = 'PROJECT_ID',
  location = 'us-central1',
  model = 'gemini-1.5-flash-001'
) {
  // Initialize Vertex with your Cloud project and location
  const vertexAI = new VertexAI({project: projectId, location: location});

  const generativeVisionModel = vertexAI.getGenerativeModel({
    model: model,
  });

  // Pass multimodal prompt
  const request = {
    contents: [
      {
        role: 'user',
        parts: [
          {
            fileData: {
              fileUri: 'gs://cloud-samples-data/video/animals.mp4',
              mimeType: 'video/mp4',
            },
          },
          {
            text: 'What is in the video?',
          },
        ],
      },
    ],
  };

  // Create the response
  const response = await generativeVisionModel.generateContent(request);
  // Wait for the response to complete
  const aggregatedResponse = await response.response;
  // Select the text from the response
  const fullTextResponse =
    aggregatedResponse.candidates[0].content.parts[0].text;

  console.log(fullTextResponse);
}

Go

Antes de testar esta amostra, siga as instruções de configuração do Go no Guia de início rápido da Vertex AI. Para mais informações, consulte a documentação de referência do SDK da Vertex AI para Go para Gemini.

Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o método GenerateContentStream.

  iter := model.GenerateContentStream(ctx, genai.Text("Tell me a story about a lumberjack and his giant ox. Keep it very short."))
  

Para uma resposta que não seja de streaming, use o método GenerateContent.

  resp, err := model.GenerateContent(ctx, genai.Text("What is the average size of a swallow?"))
  

Código de amostra

import (
	"context"
	"errors"
	"fmt"
	"io"
	"mime"
	"path/filepath"

	"cloud.google.com/go/vertexai/genai"
)

// generateMultimodalContent generates a response into w, based upon the prompt
// and video provided.
// video is a Google Cloud Storage path starting with "gs://"
func generateMultimodalContent(w io.Writer, prompt, video, projectID, location, modelName string) error {
	// prompt := "What is in this video?"
	// video := "gs://cloud-samples-data/video/animals.mp4"
	// location := "us-central1"
	// modelName := "gemini-1.5-flash-001"
	ctx := context.Background()

	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		return fmt.Errorf("unable to create client: %w", err)
	}
	defer client.Close()

	model := client.GenerativeModel(modelName)
	model.SetTemperature(0.4)

	// Given a video file URL, prepare video file as genai.Part
	part := genai.FileData{
		MIMEType: mime.TypeByExtension(filepath.Ext(video)),
		FileURI:  video,
	}

	res, err := model.GenerateContent(ctx, part, genai.Text(prompt))
	if err != nil {
		return fmt.Errorf("unable to generate contents: %w", err)
	}

	if len(res.Candidates) == 0 ||
		len(res.Candidates[0].Content.Parts) == 0 {
		return errors.New("empty response from model")
	}

	fmt.Fprintf(w, "generated response: %s\n", res.Candidates[0].Content.Parts[0])
	return nil
}

C#

Antes de testar este exemplo, siga as instruções de configuração do C# na Vertex AI guia de início rápido. Para mais informações, consulte a documentação de referência da Vertex AI C# .

Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o método StreamGenerateContent.

  public virtual PredictionServiceClient.StreamGenerateContentStream StreamGenerateContent(GenerateContentRequest request)
  

Para uma resposta que não seja de streaming, use o método GenerateContentAsync.

  public virtual Task<GenerateContentResponse> GenerateContentAsync(GenerateContentRequest request)
  

Para mais informações sobre como o servidor pode transmitir respostas, consulte RPCs de streaming.

Código de amostra


using Google.Api.Gax.Grpc;
using Google.Cloud.AIPlatform.V1;
using System.Text;
using System.Threading.Tasks;

public class MultimodalVideoInput
{
    public async Task<string> GenerateContent(
        string projectId = "your-project-id",
        string location = "us-central1",
        string publisher = "google",
        string model = "gemini-1.5-flash-001"
    )
    {
        var predictionServiceClient = new PredictionServiceClientBuilder
        {
            Endpoint = $"{location}-aiplatform.googleapis.com"
        }.Build();

        var generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            Contents =
            {
                new Content
                {
                    Role = "USER",
                    Parts =
                    {
                        new Part { Text = "What's in the video?" },
                        new Part { FileData = new() { MimeType = "video/mp4", FileUri = "gs://cloud-samples-data/video/animals.mp4" }}
                    }
                }
            }
        };

        using PredictionServiceClient.StreamGenerateContentStream response = predictionServiceClient.StreamGenerateContent(generateContentRequest);

        StringBuilder fullText = new();

        AsyncResponseStream<GenerateContentResponse> responseStream = response.GetResponseStream();
        await foreach (GenerateContentResponse responseItem in responseStream)
        {
            fullText.Append(responseItem.Candidates[0].Content.Parts[0].Text);
        }
        return fullText.ToString();
    }
}

REST

Depois de configurou seu ambiente use REST para testar uma solicitação de texto. O exemplo a seguir envia uma solicitação ao publisher endpoint do modelo.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • LOCATION: a região para processar a solicitação. Insira uma região compatível. Para a lista completa de regiões compatíveis, consulte Locais disponíveis.

    Clicar para abrir uma lista parcial das regiões disponíveis

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: o ID do projeto.
  • FILE_URI: o URI do Cloud Storage do arquivo a ser incluído no prompt. O objeto do bucket precisa ser publicamente legível ou residir no mesmo projeto do Google Cloud que está enviando a solicitação. Você também precisa especificar o tipo de mídia (mimeType) do arquivo.

    Se você não tiver um arquivo de vídeo no Cloud Storage, use o seguinte arquivo disponível publicamente: gs://cloud-samples-data/video/animals.mp4 com um tipo MIME de video/mp4. Para acessar este vídeo, abrir o MP4 de amostra .

  • MIME_TYPE: O tipo de mídia do arquivo especificado em data ou fileUri . Os valores aceitáveis são os seguintes:

    Clique para expandir os tipos MIME.

    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
  • TEXT: as instruções de texto a serem incluídas no comando. Por exemplo, What is in the video?

Para enviar a solicitação, escolha uma destas opções:

curl

Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

cat > request.json << 'EOF'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
EOF

Depois execute o comando a seguir para enviar a solicitação REST:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent"

PowerShell

Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

@'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
'@  | Out-File -FilePath request.json -Encoding utf8

Depois execute o comando a seguir para enviar a solicitação REST:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent" | Select-Object -Expand Content

Você receberá uma resposta JSON semelhante a seguinte.

Observe o seguinte no URL deste exemplo:
  • Use o generateContent para solicitar que a resposta seja retornada depois de ser totalmente gerada. Para reduzir a percepção de latência ao público humano, transmita a resposta à medida que geradas usando o streamGenerateContent .
  • O ID do modelo multimodal está localizado no final do URL, antes do método Por exemplo, gemini-1.5-flash ou gemini-1.0-pro-vision). Este exemplo pode oferecer suporte a outras modelos de classificação.

Console

Para enviar um prompt multimodal usando o console do Google Cloud, faça o seguinte:

  1. Na seção "Vertex AI" do console do Google Cloud, acesse a página do Vertex AI Studio.

    Acessar o Vertex AI Studio

  2. Em Design de comandos (turno único), clique em Abrir.
  3. Opcional: configure o modelo e os parâmetros:

    • Modelo: selecione um modelo.
    • Região: selecione a região que você quer usar.
    • Temperatura: use o controle deslizante ou a caixa de texto para inserir um valor para a temperatura.

      A temperatura é usada para amostragem durante a geração da resposta, que ocorre quando topP e topK são aplicados. A temperatura controla o grau de aleatoriedade na seleção do token. Temperaturas mais baixas são boas para solicitações que exigem uma resposta menos aberta ou criativa, enquanto temperaturas mais altas podem levar a resultados mais diversos ou criativos. Uma temperatura de 0 significa que os tokens de maior probabilidade são sempre selecionados. Nesse caso, as respostas para uma determinada solicitação são, na maioria das vezes, deterministas, mas uma pequena variação ainda é possível.

      Se o modelo retornar uma resposta muito genérica, muito curta ou se o modelo fornecer uma resposta alternativa, tente aumentar a temperatura.

    • Limite de token de saída: use o controle deslizante ou a caixa de texto para inserir um valor para o limite de saída máximo.

      Número máximo de tokens que podem ser gerados na resposta. Um token tem cerca de quatro caracteres. 100 tokens correspondem a cerca de 60 a 80 palavras.

      Especifique um valor mais baixo para respostas mais curtas e um valor mais alto para respostas potencialmente mais longas.

    • Adicionar sequência de paradas: opcional. Insira uma sequência de paradas, que é uma série de caracteres que inclui espaços. Se o modelo encontrar uma sequência de paradas, a geração de resposta será interrompida. A sequência de paradas não é incluída na resposta, e você pode adicionar até cinco sequências de paradas.
  4. Opcional: para configurar parâmetros avançados, clique em Avançado e faça as configurações da seguinte maneira:
  5. Clique para abrir as configurações avançadas

    • Top-K: use o controle deslizante ou a caixa de texto para inserir um valor para "top-K". (incompatível com o Gemini 1.5).

      O Top-K muda a forma como o modelo seleciona tokens para saída. Um top-K de 1 significa que o próximo token selecionado é o mais provável entre todos os tokens no vocabulário do modelo (também chamado de decodificação gananciosa), enquanto um top-K de 3 significa que o próximo token está selecionado entre os três tokens mais prováveis usando a temperatura.

      Para cada etapa da seleção de tokens, são amostrados os tokens top-K com as maiores probabilidades. Em seguida, os tokens são filtrados com base no valor de top-P com o token final selecionado por meio da amostragem de temperatura.

      Especifique um valor mais baixo para respostas menos aleatórias e um valor mais alto para respostas mais aleatórias.

    • Top-P: use o controle deslizante ou a caixa de texto para inserir um valor para essa parte. Os tokens são selecionados do mais provável para o menos até que a soma das probabilidades seja igual ao valor do top-P. Para ter menos resultados de variáveis, defina top-P como 0.
    • Ativar embasamento: o embasamento não é compatível com recursos multimodais. solicitações.
  6. Para enviar mídia, como arquivos MP4 e vídeos do YouTube, siga as instruções seguinte:
    1. Clique em Inserir mídia e selecione uma origem.

      Se você escolher o Google Drive como seu origem, escolha uma conta e dê consentimento o Vertex AI Studio acesse sua conta na primeira vez que selecione essa opção. É possível fazer o upload de vários arquivos de mídia com até 10 MB. Um arquivo não pode exceder 7 MB.

      1. Clique no arquivo que você quer adicionar.
      2. Clique em Selecionar.

        A miniatura do arquivo é mostrada no painel Comando. O número total de tokens também é exibido. Se os dados do comando excederem limite de token, os tokens em excesso serão truncados.

      Se você escolher o URL do vídeo do YouTube como origem, forneça um link para um vídeo do YouTube de sua propriedade. O sistema valida que o vídeo do YouTube é de propriedade da conta que você usou para fazer login no console do Google Cloud.

      1. Clique em Validate (Validar).
      2. Clique em Inserir.

      O modelo não oferece suporte à contagem de tokens para vídeos do YouTube.

    2. Opcional: para exibir o número de tokens calculados nos seus vídeos e a soma de todos os tokens, clique em Ver tokens.

      Pode levar até 15 segundos para calcular a contagem de tokens de arquivos de mídia, como vídeos. As visualizações ID do token para texto e ID do token não mostram resultados importantes porque não há compatibilidade com tokens de mídia.

      Para fechar o painel da ferramenta tokenizadora, clique em X ou clique fora do painel.

  7. Digite o comando de texto no painel Prompt. O modelo usa as mensagens anteriores como contexto para novas respostas.
  8. Opcional: para exibir o número de tokens calculados nos seus vídeos, o número de tokens de texto e a soma de todos os tokens, clique em Ver tokens. É possível conferir os tokens ou IDs de token do comando de texto.
    • Para ver os tokens no comando de texto destacados com cores diferentes marcando o limite de cada ID de token, clique em ID do token para texto. Tokens de mídia não são aceitos.
    • Para acessar os IDs de token, clique em ID do token.

      Para fechar o painel da ferramenta tokenizadora, clique em X ou clique fora do painel.

  9. Clique em Enviar.
  10. Opcional: para salvar a solicitação em Minhas solicitações, clique em Salvar.
  11. Opcional: para receber o código Python ou um comando curl para seu prompt, clique em Ver código.
  12. Opcional: para limpar todas as mensagens anteriores, clique em Limpar conversa

Vídeo com áudio

Confira a seguir como resumir um arquivo de vídeo com áudio e retornar capítulos com marcações de tempo. Esta amostra funciona apenas com o Gemini 1.5 Pro.

Python

Para saber como instalar o SDK da Vertex AI para Python, consulte Instalar o SDK da Vertex AI para Python. Saiba mais na documentação de referência da API SDK da Vertex AI para Python.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o parâmetro stream em generate_content.

  response = model.generate_content(contents=[...], stream = True)
  

Para uma resposta que não seja de streaming, remova o parâmetro ou defina-o como False.

Código de amostra


import vertexai
from vertexai.generative_models import GenerativeModel, Part

# TODO(developer): Update and un-comment below lines
# project_id = "PROJECT_ID"

vertexai.init(project=project_id, location="us-central1")

model = GenerativeModel("gemini-1.5-flash-001")

prompt = """
Provide a description of the video.
The description should also contain anything important which people say in the video.
"""

video_file_uri = "gs://cloud-samples-data/generative-ai/video/pixel8.mp4"
video_file = Part.from_uri(video_file_uri, mime_type="video/mp4")

contents = [video_file, prompt]

response = model.generate_content(contents)
print(response.text)

Java

Antes de testar esta amostra, siga as instruções de configuração do Java no guia de início rápido da Vertex AI. Para mais informações, consulte a documentação de referência do SDK da Vertex AI para Java para Gemini.

Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o método generateContentStream.

  public ResponseStream<GenerateContentResponse> generateContentStream(Content content)
  

Para uma resposta que não seja de streaming, use o método generateContent.

  public GenerateContentResponse generateContent(Content content)
  

Código de amostra


import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.generativeai.ContentMaker;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import com.google.cloud.vertexai.generativeai.PartMaker;
import com.google.cloud.vertexai.generativeai.ResponseHandler;
import java.io.IOException;

public class VideoInputWithAudio {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-google-cloud-project-id";
    String location = "us-central1";
    String modelName = "gemini-1.5-flash-001";

    videoAudioInput(projectId, location, modelName);
  }

  // Analyzes the given video input, including its audio track.
  public static String videoAudioInput(String projectId, String location, String modelName)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs
    // to be created once, and can be reused for multiple requests.
    try (VertexAI vertexAI = new VertexAI(projectId, location)) {
      String videoUri = "gs://cloud-samples-data/generative-ai/video/pixel8.mp4";

      GenerativeModel model = new GenerativeModel(modelName, vertexAI);
      GenerateContentResponse response = model.generateContent(
          ContentMaker.fromMultiModalData(
              "Provide a description of the video.\n The description should also "
                  + "contain anything important which people say in the video.",
              PartMaker.fromMimeTypeAndData("video/mp4", videoUri)
          ));

      String output = ResponseHandler.getText(response);
      System.out.println(output);

      return output;
    }
  }
}

Node.js

Antes de testar esta amostra, siga as instruções de configuração do Node.js no Guia de início rápido da IA generativa usando o SDK do Node.js. Para mais informações, consulte a documentação de referência do SDK do Node.js para Gemini.

Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o método generateContentStream.

  const streamingResp = await generativeModel.generateContentStream(request);
  

Para uma resposta que não seja de streaming, use o método generateContent.

  const streamingResp = await generativeModel.generateContent(request);
  

Código de amostra

const {VertexAI} = require('@google-cloud/vertexai');

/**
 * TODO(developer): Update these variables before running the sample.
 */
async function analyze_video_with_audio(projectId = 'PROJECT_ID') {
  const vertexAI = new VertexAI({project: projectId, location: 'us-central1'});

  const generativeModel = vertexAI.getGenerativeModel({
    model: 'gemini-1.5-flash-001',
  });

  const filePart = {
    file_data: {
      file_uri: 'gs://cloud-samples-data/generative-ai/video/pixel8.mp4',
      mime_type: 'video/mp4',
    },
  };
  const textPart = {
    text: `
    Provide a description of the video.
    The description should also contain anything important which people say in the video.`,
  };

  const request = {
    contents: [{role: 'user', parts: [filePart, textPart]}],
  };

  const resp = await generativeModel.generateContent(request);
  const contentResponse = await resp.response;
  console.log(JSON.stringify(contentResponse));
}

Go

Antes de testar esta amostra, siga as instruções de configuração do Go no Guia de início rápido da Vertex AI. Para mais informações, consulte a documentação de referência do SDK da Vertex AI para Go para Gemini.

Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o método GenerateContentStream.

  iter := model.GenerateContentStream(ctx, genai.Text("Tell me a story about a lumberjack and his giant ox. Keep it very short."))
  

Para uma resposta que não seja de streaming, use o método GenerateContent.

  resp, err := model.GenerateContent(ctx, genai.Text("What is the average size of a swallow?"))
  

Código de amostra

import (
	"context"
	"errors"
	"fmt"
	"io"
	"mime"
	"path/filepath"

	"cloud.google.com/go/vertexai/genai"
)

// generateMultimodalContent shows how to send video and text prompts to a model, writing the response to
// the provided io.Writer.
// video is a Google Cloud Storage path starting with "gs://"
func generateMultimodalContent(w io.Writer, prompt, video, projectID, location, modelName string) error {
	// prompt := `
	// 		Provide a description of the video.
	// 		The description should also contain anything important which people say in the video.
	// `
	// video := "gs://cloud-samples-data/generative-ai/video/pixel8.mp4"
	// location := "us-central1"
	// modelName := "gemini-1.5-flash-001"
	ctx := context.Background()

	client, err := genai.NewClient(ctx, projectID, location)
	if err != nil {
		return fmt.Errorf("unable to create client: %w", err)
	}
	defer client.Close()

	model := client.GenerativeModel(modelName)

	// Given a video file URL, prepare video file as genai.Part
	part := genai.FileData{
		MIMEType: mime.TypeByExtension(filepath.Ext(video)),
		FileURI:  video,
	}

	res, err := model.GenerateContent(ctx, part, genai.Text(prompt))
	if err != nil {
		return fmt.Errorf("unable to generate contents: %w", err)
	}

	if len(res.Candidates) == 0 ||
		len(res.Candidates[0].Content.Parts) == 0 {
		return errors.New("empty response from model")
	}

	fmt.Fprintf(w, "generated response: %s\n", res.Candidates[0].Content.Parts[0])
	return nil
}

C#

Antes de testar este exemplo, siga as instruções de configuração do C# na Vertex AI guia de início rápido. Para mais informações, consulte a documentação de referência da Vertex AI C# .

Para autenticar na Vertex AI, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

Respostas com e sem streaming

Escolha se o modelo vai gerar respostas de streaming ou sem streaming. Para respostas de streaming, você recebe cada resposta assim que o token de saída for gerado. Para respostas que não são de streaming, você recebe todas as respostas depois que todos os tokens de saída forem gerados.

Para uma resposta de streaming, use o método StreamGenerateContent.

  public virtual PredictionServiceClient.StreamGenerateContentStream StreamGenerateContent(GenerateContentRequest request)
  

Para uma resposta que não seja de streaming, use o método GenerateContentAsync.

  public virtual Task<GenerateContentResponse> GenerateContentAsync(GenerateContentRequest request)
  

Para mais informações sobre como o servidor pode transmitir respostas, consulte RPCs de streaming.

Código de amostra


using Google.Cloud.AIPlatform.V1;
using System;
using System.Threading.Tasks;

public class VideoInputWithAudio
{
    public async Task<string> DescribeVideo(
        string projectId = "your-project-id",
        string location = "us-central1",
        string publisher = "google",
        string model = "gemini-1.5-flash-001")
    {

        var predictionServiceClient = new PredictionServiceClientBuilder
        {
            Endpoint = $"{location}-aiplatform.googleapis.com"
        }.Build();

        string prompt = @"Provide a description of the video.
The description should also contain anything important which people say in the video.";

        var generateContentRequest = new GenerateContentRequest
        {
            Model = $"projects/{projectId}/locations/{location}/publishers/{publisher}/models/{model}",
            Contents =
            {
                new Content
                {
                    Role = "USER",
                    Parts =
                    {
                        new Part { Text = prompt },
                        new Part { FileData = new() { MimeType = "video/mp4", FileUri = "gs://cloud-samples-data/generative-ai/video/pixel8.mp4" }}
                    }
                }
            }
        };

        GenerateContentResponse response = await predictionServiceClient.GenerateContentAsync(generateContentRequest);

        string responseText = response.Candidates[0].Content.Parts[0].Text;
        Console.WriteLine(responseText);

        return responseText;
    }
}

REST

Depois de configurou seu ambiente use REST para testar uma solicitação de texto. O exemplo a seguir envia uma solicitação ao publisher endpoint do modelo.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • LOCATION: a região para processar a solicitação. Insira uma região compatível. Para a lista completa de regiões compatíveis, consulte Locais disponíveis.

    Clicar para abrir uma lista parcial das regiões disponíveis

    • us-central1
    • us-west4
    • northamerica-northeast1
    • us-east4
    • us-west1
    • asia-northeast3
    • asia-southeast1
    • asia-northeast1
  • PROJECT_ID: o ID do projeto.
  • FILE_URI: o URI do Cloud Storage do arquivo a ser incluído no prompt. O objeto do bucket precisa ser publicamente legível ou residir no mesmo projeto do Google Cloud que está enviando a solicitação. Você também precisa especificar o tipo de mídia (mimeType) do arquivo.

    Se você não tiver um arquivo de vídeo no Cloud Storage, use o seguinte arquivo disponível publicamente: gs://cloud-samples-data/generative-ai/video/pixel8.mp4 com um tipo MIME de video/mp4. Para acessar este vídeo, abrir o MP4 de amostra .

  • MIME_TYPE: O tipo de mídia do arquivo especificado em data ou fileUri . Os valores aceitáveis são os seguintes:

    Clique para expandir os tipos MIME.

    • application/pdf
    • audio/mpeg
    • audio/mp3
    • audio/wav
    • image/png
    • image/jpeg
    • text/plain
    • video/mov
    • video/mpeg
    • video/mp4
    • video/mpg
    • video/avi
    • video/wmv
    • video/mpegps
    • video/flv
  • TEXT
    : as instruções de texto a serem incluídas no comando. Por exemplo, Provide a description of the video. The description should also contain anything important which people say in the video.

Para enviar a solicitação, escolha uma destas opções:

curl

Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

cat > request.json << 'EOF'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
EOF

Depois execute o comando a seguir para enviar a solicitação REST:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent"

PowerShell

Salve o corpo da solicitação em um arquivo chamado request.json. Execute o comando a seguir no terminal para criar ou substituir esse arquivo no diretório atual:

@'
{
  "contents": {
    "role": "USER",
    "parts": [
      {
        "fileData": {
          "fileUri": "FILE_URI",
          "mimeType": "MIME_TYPE"
        }
      },
      {
        "text": "TEXT"
      }
    ]
  }
}
'@  | Out-File -FilePath request.json -Encoding utf8

Depois execute o comando a seguir para enviar a solicitação REST:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/publishers/google/models/gemini-1.5-flash:generateContent" | Select-Object -Expand Content

Você receberá uma resposta JSON semelhante a seguinte.

Observe o seguinte no URL deste exemplo:
  • Use o generateContent para solicitar que a resposta seja retornada depois de ser totalmente gerada. Para reduzir a percepção de latência ao público humano, transmita a resposta à medida que geradas usando o streamGenerateContent .
  • O ID do modelo multimodal está localizado no final do URL, antes do método Por exemplo, gemini-1.5-flash ou gemini-1.0-pro-vision). Este exemplo pode oferecer suporte a outras modelos de classificação.

Console

Para enviar um prompt multimodal usando o console do Google Cloud, faça o seguinte:

  1. Na seção "Vertex AI" do console do Google Cloud, acesse a página do Vertex AI Studio.

    Acessar o Vertex AI Studio

  2. Em Design de comandos (turno único), clique em Abrir.
  3. Opcional: configure o modelo e os parâmetros:

    • Modelo: selecione um modelo.
    • Região: selecione a região que você quer usar.
    • Temperatura: use o controle deslizante ou a caixa de texto para inserir um valor para a temperatura.

      A temperatura é usada para amostragem durante a geração da resposta, que ocorre quando topP e topK são aplicados. A temperatura controla o grau de aleatoriedade na seleção do token. Temperaturas mais baixas são boas para solicitações que exigem uma resposta menos aberta ou criativa, enquanto temperaturas mais altas podem levar a resultados mais diversos ou criativos. Uma temperatura de 0 significa que os tokens de maior probabilidade são sempre selecionados. Nesse caso, as respostas para uma determinada solicitação são, na maioria das vezes, deterministas, mas uma pequena variação ainda é possível.

      Se o modelo retornar uma resposta muito genérica, muito curta ou se o modelo fornecer uma resposta alternativa, tente aumentar a temperatura.

    • Limite de token de saída: use o controle deslizante ou a caixa de texto para inserir um valor para o limite de saída máximo.

      Número máximo de tokens que podem ser gerados na resposta. Um token tem cerca de quatro caracteres. 100 tokens correspondem a cerca de 60 a 80 palavras.

      Especifique um valor mais baixo para respostas mais curtas e um valor mais alto para respostas potencialmente mais longas.

    • Adicionar sequência de paradas: opcional. Insira uma sequência de paradas, que é uma série de caracteres que inclui espaços. Se o modelo encontrar uma sequência de paradas, a geração de resposta será interrompida. A sequência de paradas não é incluída na resposta, e você pode adicionar até cinco sequências de paradas.
  4. Opcional: para configurar parâmetros avançados, clique em Avançado e faça as configurações da seguinte maneira:
  5. Clique para abrir as configurações avançadas

    • Top-K: use o controle deslizante ou a caixa de texto para inserir um valor para "top-K". (incompatível com o Gemini 1.5).

      O Top-K muda a forma como o modelo seleciona tokens para saída. Um top-K de 1 significa que o próximo token selecionado é o mais provável entre todos os tokens no vocabulário do modelo (também chamado de decodificação gananciosa), enquanto um top-K de 3 significa que o próximo token está selecionado entre os três tokens mais prováveis usando a temperatura.

      Para cada etapa da seleção de tokens, são amostrados os tokens top-K com as maiores probabilidades. Em seguida, os tokens são filtrados com base no valor de top-P com o token final selecionado por meio da amostragem de temperatura.

      Especifique um valor mais baixo para respostas menos aleatórias e um valor mais alto para respostas mais aleatórias.

    • Top-P: use o controle deslizante ou a caixa de texto para inserir um valor para essa parte. Os tokens são selecionados do mais provável para o menos até que a soma das probabilidades seja igual ao valor do top-P. Para ter menos resultados de variáveis, defina top-P como 0.
    • Ativar embasamento: o embasamento não é compatível com recursos multimodais. solicitações.
  6. Para enviar mídia, como arquivos MP4 e vídeos do YouTube, siga as instruções seguinte:
    1. Clique em Inserir mídia e selecione uma origem.

      Se você escolher o Google Drive como seu origem, escolha uma conta e dê consentimento o Vertex AI Studio acesse sua conta na primeira vez que selecione essa opção. É possível fazer o upload de vários arquivos de mídia com até 10 MB. Um arquivo não pode exceder 7 MB.

      1. Clique no arquivo que você quer adicionar.
      2. Clique em Selecionar.

        A miniatura do arquivo é mostrada no painel Comando. O número total de tokens também é exibido. Se os dados do comando excederem limite de token, os tokens em excesso serão truncados.

      Se você escolher o URL do vídeo do YouTube como origem, forneça um link para um vídeo do YouTube de sua propriedade. O sistema valida que o vídeo do YouTube é de propriedade da conta que você usou para fazer login no console do Google Cloud.

      1. Clique em Validate (Validar).
      2. Clique em Inserir.

      O modelo não oferece suporte à contagem de tokens para vídeos do YouTube.

    2. Opcional: para exibir o número de tokens calculados nos seus vídeos e a soma de todos os tokens, clique em Ver tokens.

      Pode levar até 15 segundos para calcular a contagem de tokens de arquivos de mídia, como vídeos. As visualizações ID do token para texto e ID do token não mostram resultados importantes porque não há compatibilidade com tokens de mídia.

      Para fechar o painel da ferramenta tokenizadora, clique em X ou clique fora do painel.

  7. Digite o comando de texto no painel Prompt. O modelo usa as mensagens anteriores como contexto para novas respostas.
  8. Opcional: para exibir o número de tokens calculados nos seus vídeos, o número de tokens de texto e a soma de todos os tokens, clique em Ver tokens. É possível conferir os tokens ou IDs de token do comando de texto.
    • Para ver os tokens no comando de texto destacados com cores diferentes marcando o limite de cada ID de token, clique em ID do token para texto. Tokens de mídia não são aceitos.
    • Para acessar os IDs de token, clique em ID do token.

      Para fechar o painel da ferramenta tokenizadora, clique em X ou clique fora do painel.

  9. Clique em Enviar.
  10. Opcional: para salvar a solicitação em Minhas solicitações, clique em Salvar.
  11. Opcional: para receber o código Python ou um comando curl para seu prompt, clique em Ver código.
  12. Opcional: para limpar todas as mensagens anteriores, clique em Limpar conversa

Definir parâmetros do modelo

Os seguintes parâmetros de modelo podem ser definidos em modelos multimodais:

Top-P

O top-p muda a forma como o modelo seleciona tokens para saída. Os tokens são selecionados do mais provável (veja o top-K) para o menos provável até que a soma das probabilidades seja igual ao valor do top-P. Por exemplo, se os tokens A, B e C tiverem uma probabilidade de 0,3, 0,2 e 0,1 e o valor de top-P for 0.5, o modelo selecionará A ou B como token seguinte usando temperatura e exclui C como candidato.

Especifique um valor mais baixo para respostas menos aleatórias e um valor mais alto para respostas mais aleatórias.

Top-K

O top-k muda a forma como o modelo seleciona tokens para saída. Um top-K de 1 significa que o próximo token selecionado é o mais provável entre todos os tokens no vocabulário do modelo (também chamado de decodificação gananciosa), enquanto um top-K de 3 significa que o próximo token está selecionado entre os três tokens mais prováveis usando a temperatura.

Para cada etapa da seleção de tokens, são amostrados os tokens top-K com as maiores probabilidades. Em seguida, os tokens são filtrados com base no valor de top-P com o token final selecionado por meio da amostragem de temperatura.

Especifique um valor mais baixo para respostas menos aleatórias e um valor mais alto para respostas mais aleatórias.

Temperatura

A temperatura é usada para amostragem durante a geração da resposta, que ocorre quando topP e topK são aplicados. A temperatura controla o grau de aleatoriedade na seleção do token. Temperaturas mais baixas são boas para solicitações que exigem uma resposta menos aberta ou criativa, enquanto temperaturas mais altas podem levar a resultados mais diversos ou criativos. Uma temperatura de 0 significa que os tokens de maior probabilidade são sempre selecionados. Nesse caso, as respostas para uma determinada solicitação são, na maioria das vezes, deterministas, mas uma pequena variação ainda é possível.

Se o modelo retornar uma resposta muito genérica, muito curta ou se o modelo fornecer uma resposta alternativa, tente aumentar a temperatura.

Valores de parâmetro válidos

Parâmetro Gemini 1.0 Pro Vision Gemini 1.5 Pro Gemini 1.5 Flash
Top-K 1 - 40 (padrão 32) Sem suporte Sem suporte
Top-P 0 - 1.0 (padrão 1.0) 0 - 1.0 (padrão 0.95) 0 - 1.0 (padrão 0.95)
Temperatura 0 - 1.0 (padrão 0.4) 0 - 2.0 (padrão 1.0) 0 - 2.0 (padrão 1.0)

Requisitos de vídeo

As amostras dos vídeos são feitas a 1 fps. Cada frame de vídeo representa 258 tokens.

Para o Gemini 1.5 Flash e Gemini 1.5 Pro, a faixa de áudio é codificada com frames de vídeo. A faixa de áudio também é dividida em entroncamentos de um segundo que representam 32 tokens. O frame de vídeo e os tokens de áudio são intercalados com os respectivos carimbos de data/hora. Os carimbos de data/hora são representados como sete tokens.

Os modelos multimodais do Gemini são compatíveis com os seguintes tipos MIME de vídeo:

Tipo de vídeo MIME Gemini 1.5 Flash Gemini 1.5 Pro Gemini 1.0 Pro Vision
FLV - video/x-flv
MOV - video/mov
MPEG - video/mpeg
MPEGPS - video/mpegps
MPG - video/mpg
MP4 - video/mp4
WEBM - video/webm
WMV - video/wmv
3GPP - video/3gpp

Práticas recomendadas

Ao usar vídeos, siga as práticas recomendadas e informações abaixo para ter os melhores resultados:

  • Use no máximo um vídeo por comando.
  • Se o comando contiver um único vídeo, coloque o vídeo antes do comando de texto.
  • Se você estiver usando o Gemini 1.0 Pro Vision, o modelo processará os vídeos como frames de imagem não contíguos do vídeo. O áudio não está incluído. Se você notar que falta algum conteúdo do vídeo no modelo, tente encurtar o vídeo para que ele capture uma parte maior do conteúdo.
  • Se você estiver usando o Gemini 1.0 Pro Vision, apenas as informações nos primeiros dois minutos serão processadas.
  • Se você estiver usando o Gemini 1.0 Pro Vision, nenhuma informação de áudio ou metadados de carimbo de data/hora serão analisados. Por isso, o modelo pode não funcionar bem em casos de uso que exigem entrada de áudio, como legendas de áudio, ou informações relacionadas ao tempo, como velocidade ou ritmo.
  • Quando a localização de carimbo de data/hora em um vídeo com áudio for necessária, peça ao modelo para gerar carimbos de data/hora no formato MM:SS, em que os dois primeiros dígitos representam minutos e os dois últimos dígitos representam segundos. Use o mesmo formato para perguntas sobre carimbo de data/hora.

Limitações

Embora os modelos multimodais do Gemini sejam eficientes em muitos casos de usuários multimodais, é importante entender as limitações dos modelos:

  • Moderação de conteúdo: os modelos se recusam a fornecer respostas sobre vídeos que violam nossas políticas de segurança.
  • Reconhecimento de som sem fala: os modelos compatíveis com áudio podem cometer erros ao reconhecer sons que não são fala.
  • Movimento de alta velocidade: devido à taxa de amostragem fixa de 1 frame por segundo (QPS), os modelos podem cometer erros na compreensão do movimento de alta velocidade nos vídeos.
  • Pontuação de transcrição: as transcrições retornadas pelo Gemini 1.5 Flash podem não incluir pontuação.

A seguir