Các 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ó các mô hình dành riêng cho miền. Một số tính năng về 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
- Trả lời câu hỏi về nội dung video
- Đề cập đến dấu thời gian cụ thể trong video
Gemini được xây dựng từ đầu theo hướng đa phương thức và chúng tôi tiếp tục mở rộng giới hạn của những gì có thể. Hướng dẫn này trình bày cách sử dụng Gemini API để tạo câu trả lời dạng văn bản dựa trên dữ liệu đầu vào là video.
Đầu vào video
Bạn có thể cung cấp video làm dữ liệu đầu vào cho Gemini theo những 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 trong nhiều yêu cầu. - Truyền dữ liệu video trong dòng bằng yêu cầu đến
generateContent
. Hãy sử dụng phương thức này cho các tệp nhỏ (<20 MB) và thời lượng ngắn. - Thêm URL của YouTube trực tiếp vào câu lệnh.
Tải tệp video lên
Bạn có thể dùng Files API để tải một tệp video lên. Luôn sử dụng Files API khi tổng kích thước yêu cầu (bao gồm cả tệp, lời nhắc bằng 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 dự đị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.
Đoạn mã sau đây tải video mẫu xuống, tải video đó lên bằng File API, đợi video được xử lý, rồi sử dụng thông tin tham chiếu về tệp trong một yêu cầu generateContent
.
Python
from google import genai
client = genai.Client()
myfile = client.files.upload(file="path/to/sample.mp4")
response = client.models.generate_content(
model="gemini-2.5-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({});
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.5-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
uploadedFile, _ := client.Files.UploadFromPath(ctx, "path/to/sample.mp4", nil)
parts := []*genai.Part{
genai.NewPartFromText("Summarize this video. Then create a quiz with an answer key based on the information in this video."),
genai.NewPartFromURI(uploadedFile.URI, uploadedFile.MIMEType),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
result, _ := client.Models.GenerateContent(
ctx,
"gemini-2.5-flash",
contents,
nil,
)
fmt.Println(result.Text())
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" \
-H "x-goog-api-key: $GEMINI_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.5-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_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 nội dung nghe nhìn, hãy xem API Tệp.
Truyền dữ liệu video nội tuyến
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 nhỏ hơn trong yêu cầu đến generateContent
. Phương thức này phù hợp với những 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 nội tuyến:
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.5-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({});
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.5-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.5-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_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
Thêm một URL của YouTube
Gemini API và AI Studio hỗ trợ URL của YouTube dưới dạng dữ liệu tệp Part
. Bạn có thể thêm một URL trên YouTube vào câu lệnh 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ế:
- Đối với gói miễn phí, bạn không thể tải quá 8 giờ video trên YouTube lên mỗi ngày.
- Đối với gói có tính phí, không có giới hạn về thời lượng video.
- Đối với các mẫu trước phiên bản 2.5, bạn chỉ có thể tải 1 video lên cho mỗi yêu cầu. Đối với các mô hình sau 2.5, bạn có thể tải tối đa 10 video lên mỗi yêu cầu.
- Bạn chỉ có thể tải video công khai lên (không thể tải video riêng tư hoặc không công khai lên).
Ví dụ sau đây minh hoạ cách thêm một URL của YouTube kèm theo câu lệnh:
Python
response = client.models.generate_content(
model='models/gemini-2.5-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
package main
import (
"context"
"fmt"
"os"
"google.golang.org/genai"
)
func main() {
ctx := context.Background()
client, err := genai.NewClient(ctx, nil)
if err != nil {
log.Fatal(err)
}
parts := []*genai.Part{
genai.NewPartFromText("Please summarize the video in 3 sentences."),
genai.NewPartFromURI("https://www.youtube.com/watch?v=9hE5-98ZeCg","video/mp4"),
}
contents := []*genai.Content{
genai.NewContentFromParts(parts, genai.RoleUser),
}
result, _ := client.Models.GenerateContent(
ctx,
"gemini-2.5-flash",
contents,
nil,
)
fmt.Println(result.Text())
}
REST
curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent" \
-H "x-goog-api-key: $GEMINI_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ề những thời điểm cụ thể trong video bằng cách sử dụng dấu thời gian có 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.NewPartFromURI(currentVideoFile.URI, currentVideoFile.MIMEType),
// Adjusted timestamps for the NASA video
genai.NewPartFromText("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
Các mô hình Gemini có thể chép lời và cung cấp nội dung mô tả bằng hình ảnh cho 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.NewPartFromURI(currentVideoFile.URI, currentVideoFile.MIMEType),
genai.NewPartFromText("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."
Tuỳ chỉnh quy trình xử lý video
Bạn có thể tuỳ chỉnh quy trình xử lý video trong Gemini API bằng cách thiết lập khoảng thời gian cắt hoặc cung cấp chế độ lấy mẫu tốc độ khung hình tuỳ chỉnh.
Đặt khoảng thời gian cắt
Bạn có thể cắt video bằng cách chỉ định videoMetadata
với độ lệch bắt đầu và kết thúc.
Python
response = client.models.generate_content(
model='models/gemini-2.5-flash',
contents=types.Content(
parts=[
types.Part(
file_data=types.FileData(file_uri='https://www.youtube.com/watch?v=XEzRZ35urlk'),
video_metadata=types.VideoMetadata(
start_offset='1250s',
end_offset='1570s'
)
),
types.Part(text='Please summarize the video in 3 sentences.')
]
)
)
Đặt tốc độ khung hình tuỳ chỉnh
Bạn có thể thiết lập chế độ lấy mẫu tốc độ khung hình tuỳ chỉnh bằng cách truyền một đối số fps
đến videoMetadata
.
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.5-flash',
contents=types.Content(
parts=[
types.Part(
inline_data=types.Blob(
data=video_bytes,
mime_type='video/mp4'),
video_metadata=types.VideoMetadata(fps=5)
),
types.Part(text='Please summarize the video in 3 sentences.')
]
)
)
Theo mặc định, 1 khung hình/giây (FPS) sẽ được lấy mẫu từ video. Bạn nên đặt FPS thấp (< 1) cho video dài. Điều này đặc biệt hữu ích đối với những video tĩnh (ví dụ: bài giảng). Nếu bạn muốn ghi lại nhiều chi tiết hơn trong hình ảnh thay đổi nhanh chóng, hãy cân nhắc việc đặt giá trị FPS cao hơn.
Đị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ả các mô hình Gemini 2.0 và 2.5 đều có thể xử lý dữ liệu video.
- Các mô hình có cửa sổ ngữ cảnh 2M có thể xử lý video dài tối đa 2 giờ ở độ phân giải mặc định của nội dung nghe nhìn hoặc dài tối đa 6 giờ ở độ phân giải thấp của nội dung nghe nhìn, trong khi các mô hình có cửa sổ ngữ cảnh 1M có thể xử lý video dài tối đa 1 giờ ở độ phân giải mặc định của nội dung nghe nhìn hoặc dài tối đa 3 giờ ở độ phân giải thấp của nội dung nghe nhìn.
- Xử lý bằng File API: Khi sử dụng File API, video được lấy mẫu ở tốc độ 1 khung hình/giây (FPS) và âm thanh được xử lý ở tốc độ 1 Kbps (một kênh).
Dấu thời gian được thêm vào mỗi giây.
- Những tỷ lệ này có thể thay đổi trong tương lai để cải thiện khả năng suy luận.
- Cách tính mã thông báo: Mỗi giây video được mã hoá như sau:
- Khung hình riêng lẻ (lấy mẫu ở tốc độ 1 khung hình/giây):
- Nếu
mediaResolution
được đặt thành thấp, các khung hình sẽ được mã hoá thành 66 mã thông báo trên mỗi khung hình. - Nếu không, các khung hình sẽ được mã hoá thành 258 mã thông báo cho mỗi khung hình.
- Nếu
- Â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 số: Khoảng 300 mã thông báo cho mỗi giây video ở độ phân giải mặc định của nội dung nghe nhìn hoặc 100 mã thông báo cho mỗi giây video ở độ phân giải thấp của nội dung nghe nhìn.
- Khung hình riêng lẻ (lấy mẫu ở tốc độ 1 khung hình/giây):
- Đị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, 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 tạo 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 câu lệnh bằng văn bản sau phần video trong mảng
contents
. - Xin lưu ý rằng các cảnh hành động diễn ra nhanh có thể bị mất chi tiết do tốc độ lấy mẫu 1 FPS. Hãy cân nhắ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 giú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: 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 đưa ra câu lệnh cho tệp: Gemini API hỗ trợ đưa ra câu lệnh bằng dữ liệu văn bản, hình ảnh, âm thanh và video, còn được gọi là câu lệnh đa phương thức.
- Hướng dẫn về sự an toàn: Đôi khi, các 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. Việc xử lý hậu kỳ và đánh giá thủ công là điều cần thiết để hạn chế nguy cơ gây hại từ những kết quả như vậy.