Hiểu video

Mô hình Gemini có thể xử lý video, cho phép nhiều trường hợp sử dụng của nhà phát triển tiên phong mà trước đây cần có mô hình dành riêng cho miền. Một số tính năng thị giác của Gemini bao gồm khả năng:

  • Mô tả, phân đoạn và trích xuất thông tin từ video dài tối đa 90 phút
  • Trả lời câu hỏi về nội dung video
  • Tham chiếu đến các dấu thời gian cụ thể trong video

Gemini được xây dựng từ đầu để trở thành mô hình đa phương thức và chúng tôi tiếp tục đẩy mạnh ranh giới của những gì có thể. Hướng dẫn này cho biết cách sử dụng API Gemini để tạo câu trả lời văn bản dựa trên dữ liệu đầu vào dạng video.

Trước khi bắt đầu

Trước khi gọi Gemini API, hãy đảm bảo bạn đã cài đặt SDK mà bạn chọnkhoá Gemini API đã được định cấu hình và sẵn sàng sử dụng.

Đầu vào video

Bạn có thể cung cấp video làm dữ liệu đầu vào cho Gemini theo các cách sau:

  • Tải tệp video lên bằng File API trước khi đưa ra yêu cầu đến generateContent. Sử dụng phương thức này cho các tệp lớn hơn 20 MB, video dài hơn khoảng 1 phút hoặc khi bạn muốn sử dụng lại tệp trên nhiều yêu cầu.
  • Truyền dữ liệu video nội tuyến bằng yêu cầu đến generateContent. Sử dụng phương thức này cho các tệp nhỏ hơn (<20MB) và thời lượng ngắn hơn.
  • Thêm URL YouTube ngay trong lời nhắc.

Tải tệp video lên

Bạn có thể sử dụng API Tệp để tải tệp video lên. Luôn sử dụng API Tệp khi tổng kích thước yêu cầu (bao gồm cả tệp, lời nhắc văn bản, hướng dẫn hệ thống, v.v.) lớn hơn 20 MB, thời lượng video đáng kể hoặc nếu bạn định sử dụng cùng một video trong nhiều lời nhắc.

File API chấp nhận trực tiếp các định dạng tệp video. Ví dụ này sử dụng phim ngắn của NASA "Vết đỏ lớn trên sao Mộc co lại và phát triển". Nguồn: Trung tâm bay vũ trụ Goddard (GSFC)/David Ladd (2018).

"Jupiter's Great Red Spot Shrinks and Grows" (Đốm đỏ lớn trên sao Mộc co lại và phát triển) thuộc phạm vi công cộng và không có hình ảnh người có thể nhận dạng. (Nguyên tắc sử dụng hình ảnh và nội dung nghe nhìn của NASA.)

Mã sau đây tải video mẫu xuống, tải video đó lên bằng File API, chờ xử lý video rồi sử dụng tệp tham chiếu trong yêu cầu generateContent.

Python

from google import genai

client = genai.Client(api_key="GOOGLE_API_KEY")

myfile = client.files.upload(file="path/to/sample.mp4")

response = client.models.generate_content(
    model="gemini-2.0-flash", contents=[myfile, "Summarize this video. Then create a quiz with an answer key based on the information in this video."]
)

print(response.text)

JavaScript

import {
  GoogleGenAI,
  createUserContent,
  createPartFromUri,
} from "@google/genai";

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });

async function main() {
  const myfile = await ai.files.upload({
    file: "path/to/sample.mp4",
    config: { mimeType: "video/mp4" },
  });

  const response = await ai.models.generateContent({
    model: "gemini-2.0-flash",
    contents: createUserContent([
      createPartFromUri(myfile.uri, myfile.mimeType),
      "Summarize this video. Then create a quiz with an answer key based on the information in this video.",
    ]),
  });
  console.log(response.text);
}

await main();

Go

file, err := client.UploadFileFromPath(ctx, "path/to/sample.mp4", nil)
if err != nil {
    log.Fatal(err)
}
defer client.DeleteFile(ctx, file.Name)

model := client.GenerativeModel("gemini-2.0-flash")
resp, err := model.GenerateContent(ctx,
    genai.FileData{URI: file.URI},
    genai.Text("Summarize this video. Then create a quiz with an answer key based on the information in this video."))
if err != nil {
    log.Fatal(err)
}

printResponse(resp)

REST

VIDEO_PATH="path/to/sample.mp4"
MIME_TYPE=$(file -b --mime-type "${VIDEO_PATH}")
NUM_BYTES=$(wc -c < "${VIDEO_PATH}")
DISPLAY_NAME=VIDEO

tmp_header_file=upload-header.tmp

echo "Starting file upload..."
curl "https://generativelanguage.googleapis.com/upload/v1beta/files?key=${GOOGLE_API_KEY}" \
  -D ${tmp_header_file} \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null

upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"

echo "Uploading video data..."
curl "${upload_url}" \
  -H "Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${VIDEO_PATH}" 2> /dev/null > file_info.json

file_uri=$(jq -r ".file.uri" file_info.json)
echo file_uri=$file_uri

echo "File uploaded successfully. File URI: ${file_uri}"

# --- 3. Generate content using the uploaded video file ---
echo "Generating content from video..."
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
          {"file_data":{"mime_type": "'"${MIME_TYPE}"'", "file_uri": "'"${file_uri}"'"}},
          {"text": "Summarize this video. Then create a quiz with an answer key based on the information in this video."}]
        }]
      }' 2> /dev/null > response.json

jq -r ".candidates[].content.parts[].text" response.json

Để tìm hiểu thêm về cách làm việc với tệp phương tiện, hãy xem API Tệp.

Truyền dữ liệu video cùng dòng

Thay vì tải tệp video lên bằng File API, bạn có thể truyền trực tiếp các video có kích thước nhỏ hơn trong yêu cầu đến generateContent. Phương thức này phù hợp với các video ngắn có tổng kích thước yêu cầu dưới 20 MB.

Dưới đây là ví dụ về cách cung cấp dữ liệu video cùng dòng:

Python

# Only for videos of size <20Mb
video_file_name = "/path/to/your/video.mp4"
video_bytes = open(video_file_name, 'rb').read()

response = client.models.generate_content(
    model='models/gemini-2.0-flash',
    contents=types.Content(
        parts=[
            types.Part(
                inline_data=types.Blob(data=video_bytes, mime_type='video/mp4')
            ),
            types.Part(text='Please summarize the video in 3 sentences.')
        ]
    )
)

JavaScript

import { GoogleGenAI } from "@google/genai";
import * as fs from "node:fs";

const ai = new GoogleGenAI({ apiKey: "GOOGLE_API_KEY" });
const base64VideoFile = fs.readFileSync("path/to/small-sample.mp4", {
  encoding: "base64",
});

const contents = [
  {
    inlineData: {
      mimeType: "video/mp4",
      data: base64VideoFile,
    },
  },
  { text: "Please summarize the video in 3 sentences." }
];

const response = await ai.models.generateContent({
  model: "gemini-2.0-flash",
  contents: contents,
});
console.log(response.text);

REST

VIDEO_PATH=/path/to/your/video.mp4

if [[ "$(base64 --version 2>&1)" = *"FreeBSD"* ]]; then
  B64FLAGS="--input"
else
  B64FLAGS="-w0"
fi

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
            {
              "inline_data": {
                "mime_type":"video/mp4",
                "data": "'$(base64 $B64FLAGS $VIDEO_PATH)'"
              }
            },
            {"text": "Please summarize the video in 3 sentences."}
        ]
      }]
    }' 2> /dev/null

Bao gồm URL YouTube

Gemini API và AI Studio hỗ trợ URL YouTube dưới dạng dữ liệu tệp Part. Bạn có thể đưa vào một URL YouTube cùng với lời nhắc yêu cầu mô hình tóm tắt, dịch hoặc tương tác với nội dung video.

Các điểm hạn chế:

  • Bạn không thể tải nhiều hơn 8 giờ video lên YouTube mỗi ngày.
  • Mỗi yêu cầu chỉ có thể tải 1 video lên.
  • Bạn chỉ có thể tải video công khai lên (không phải video riêng tư hoặc không công khai).

Ví dụ sau đây cho biết cách thêm URL YouTube cùng với lời nhắc:

Python

response = client.models.generate_content(
    model='models/gemini-2.0-flash',
    contents=types.Content(
        parts=[
            types.Part(
                file_data=types.FileData(file_uri='https://www.youtube.com/watch?v=9hE5-98ZeCg')
            ),
            types.Part(text='Please summarize the video in 3 sentences.')
        ]
    )
)

JavaScript

import { GoogleGenerativeAI } from "@google/generative-ai";

const genAI = new GoogleGenerativeAI(process.env.GOOGLE_API_KEY);
const model = genAI.getGenerativeModel({ model: "gemini-1.5-pro" });
const result = await model.generateContent([
  "Please summarize the video in 3 sentences.",
  {
    fileData: {
      fileUri: "https://www.youtube.com/watch?v=9hE5-98ZeCg",
    },
  },
]);
console.log(result.response.text());

Go

ctx := context.Background()
client, err := genai.NewClient(ctx, option.WithAPIKey(os.Getenv("GOOGLE_API_KEY")))
if err != nil {
  log.Fatal(err)
}
defer client.Close()

model := client.GenerativeModel("gemini-2.0-flash")
resp, err := model.GenerateContent(ctx,
  genai.FileData{URI: "https://www.youtube.com/watch?v=9hE5-98ZeCg"},
  genai.Text("Please summarize the video in 3 sentences."))
if err != nil {
  log.Fatal(err)
}

// Handle the response of generated text.
for _, c := range resp.Candidates {
  if c.Content != nil {
    fmt.Println(*c.Content)
  }
}

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=$GOOGLE_API_KEY" \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[
            {"text": "Please summarize the video in 3 sentences."},
            {
              "file_data": {
                "file_uri": "https://www.youtube.com/watch?v=9hE5-98ZeCg"
              }
            }
        ]
      }]
    }' 2> /dev/null

Tham khảo dấu thời gian trong nội dung

Bạn có thể đặt câu hỏi về các thời điểm cụ thể trong video bằng cách sử dụng dấu thời gian ở dạng MM:SS.

Python

prompt = "What are the examples given at 00:05 and 00:10 supposed to show us?" # Adjusted timestamps for the NASA video

JavaScript

const prompt = "What are the examples given at 00:05 and 00:10 supposed to show us?";

Go

    prompt := []genai.Part{
        genai.FileData{URI: currentVideoFile.URI, MIMEType: currentVideoFile.MIMEType},
         // Adjusted timestamps for the NASA video
        genai.Text("What are the examples given at 00:05 and " +
            "00:10 supposed to show us?"),
    }

REST

PROMPT="What are the examples given at 00:05 and 00:10 supposed to show us?"

Chép lời video và cung cấp nội dung mô tả bằng hình ảnh

Mô hình Gemini có thể chép lời và cung cấp nội dung mô tả bằng hình ảnh về nội dung video bằng cách xử lý cả bản âm thanh và khung hình. Đối với nội dung mô tả bằng hình ảnh, mô hình lấy mẫu video với tốc độ 1 khung hình/giây. Tốc độ lấy mẫu này có thể ảnh hưởng đến mức độ chi tiết trong nội dung mô tả, đặc biệt là đối với những video có hình ảnh thay đổi nhanh chóng.

Python

prompt = "Transcribe the audio from this video, giving timestamps for salient events in the video. Also provide visual descriptions."

JavaScript

const prompt = "Transcribe the audio from this video, giving timestamps for salient events in the video. Also provide visual descriptions.";

Go

    prompt := []genai.Part{
        genai.FileData{URI: currentVideoFile.URI, MIMEType: currentVideoFile.MIMEType},
        genai.Text("Transcribe the audio from this video, giving timestamps for salient events in the video. Also " +
            "provide visual descriptions."),
    }

REST

PROMPT="Transcribe the audio from this video, giving timestamps for salient events in the video. Also provide visual descriptions."

Định dạng video được hỗ trợ

Gemini hỗ trợ các loại MIME định dạng video sau:

  • video/mp4
  • video/mpeg
  • video/mov
  • video/avi
  • video/x-flv
  • video/mpg
  • video/webm
  • video/wmv
  • video/3gpp

Thông tin chi tiết về kỹ thuật của video

  • Mô hình và ngữ cảnh được hỗ trợ: Tất cả mô hình Gemini 2.0 và 2.5 đều có thể xử lý dữ liệu video.
    • Mô hình có cửa sổ ngữ cảnh 2 triệu có thể xử lý video dài tối đa 2 giờ, còn mô hình có cửa sổ ngữ cảnh 1 triệu có thể xử lý video dài tối đa 1 giờ.
  • Xử lý API tệp: Khi sử dụng API tệp, video được lấy mẫu ở tốc độ 1 khung hình/giây (FPS) và âm thanh được xử lý ở tốc độ 1 Kb/giây (kênh đơn). Dấu thời gian được thêm vào mỗi giây.
    • Các tỷ lệ này có thể thay đổi trong tương lai để cải thiện khả năng suy luận.
  • Tính toán mã thông báo: Mỗi giây của video được mã hoá như sau:
    • Khung hình riêng lẻ (lấy mẫu ở tốc độ 1 khung hình/giây): 258 mã thông báo trên mỗi khung hình.
    • Âm thanh: 32 mã thông báo mỗi giây.
    • Siêu dữ liệu cũng được đưa vào.
    • Tổng cộng: Khoảng 300 mã thông báo mỗi giây video.
  • Định dạng dấu thời gian: Khi đề cập đến những khoảnh khắc cụ thể trong video trong câu lệnh của bạn, hãy sử dụng định dạng MM:SS (ví dụ: 01:15 trong 1 phút 15 giây).
  • Các phương pháp hay nhất:
    • Chỉ sử dụng một video cho mỗi yêu cầu về câu lệnh để có kết quả tối ưu.
    • Nếu kết hợp văn bản và một video, hãy đặt lời nhắc văn bản sau phần video trong mảng contents.
    • Xin lưu ý rằng các cảnh hành động nhanh có thể bị mất chi tiết do tốc độ lấy mẫu 1 FPS. Hãy cân nhắc việc làm chậm những đoạn video như vậy nếu cần.

Bước tiếp theo

Hướng dẫn này trình bày cách tải tệp video lên và tạo đầu ra văn bản từ đầu vào video. Để tìm hiểu thêm, hãy xem các tài nguyên sau:

  • Hướng dẫn hệ thống: Hướng dẫn hệ thống cho phép bạn điều hướng hành vi của mô hình dựa trên nhu cầu và trường hợp sử dụng cụ thể của bạn.
  • Files API (API Tệp): Tìm hiểu thêm về cách tải lên và quản lý tệp để sử dụng với Gemini.
  • Chiến lược nhắc tệp: Gemini API hỗ trợ nhắc bằng dữ liệu văn bản, hình ảnh, âm thanh và video, còn gọi là nhắc đa phương thức.
  • Hướng dẫn về an toàn: Đôi khi, mô hình AI tạo sinh tạo ra kết quả không mong muốn, chẳng hạn như kết quả không chính xác, thiên vị hoặc phản cảm. Quá trình xử lý hậu kỳ và đánh giá của con người là điều cần thiết để hạn chế rủi ro gây hại từ những kết quả như vậy.