Multimodal Live API

API Trực tiếp đa phương thức cho phép tương tác hai chiều bằng giọng nói và video với độ trễ thấp thông qua Gemini. Khi sử dụng API Trực tiếp đa phương thức, bạn có thể mang đến cho người dùng cuối trải nghiệm trò chuyện tự nhiên, giống như con người bằng giọng nói, đồng thời có thể ngắt lời phản hồi của mô hình bằng lệnh thoại. Mô hình này có thể xử lý dữ liệu đầu vào văn bản, âm thanh và video, đồng thời có thể cung cấp dữ liệu đầu ra văn bản và âm thanh.

Tính năng

API Trực tiếp đa phương thức bao gồm các chức năng chính sau:

  • Tính đa phương thức: Mô hình có thể nhìn, nghe và nói.
  • Tương tác theo thời gian thực có độ trễ thấp: Cung cấp phản hồi nhanh.
  • Bộ nhớ phiên: Mô hình giữ lại bộ nhớ của tất cả các lượt tương tác trong một phiên, gợi nhắc thông tin đã nghe hoặc nhìn thấy trước đó.
  • Hỗ trợ gọi hàm, thực thi mã và Tìm kiếm dưới dạng công cụ: Cho phép tích hợp với các dịch vụ và nguồn dữ liệu bên ngoài.
  • Phát hiện hoạt động giọng nói tự động (VAD): Mô hình có thể nhận dạng chính xác thời điểm người dùng bắt đầu và dừng nói. Điều này cho phép các tương tác tự nhiên, trò chuyện và cho phép người dùng làm gián đoạn mô hình bất cứ lúc nào.

Bạn có thể dùng thử API Trực tiếp đa phương thức trong Google AI Studio.

Bắt đầu

Multimodal Live API là một API có trạng thái sử dụng WebSockets.

Phần này trình bày ví dụ về cách sử dụng API trực tiếp đa phương thức để tạo văn bản sang văn bản bằng Python 3.9 trở lên.

Cài đặt thư viện Gemini API

Để cài đặt gói google-genai, hãy sử dụng lệnh pip sau:

!pip3 install google-genai

Nhập phần phụ thuộc

Cách nhập phần phụ thuộc:

from google import genai

Gửi và nhận tin nhắn văn bản

import asyncio
from google import genai

client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model_id = "gemini-2.0-flash-exp"
config = {"response_modalities": ["TEXT"]}

async def main():
    async with client.aio.live.connect(model=model_id, config=config) as session:
        while True:
            message = input("User> ")
            if message.lower() == "exit":
                break
            await session.send(message, end_of_turn=True)

            async for response in session.receive():
                if response.text is None:
                    continue
                print(response.text, end="")

if __name__ == "__main__":
    asyncio.run(main())

Hướng dẫn tích hợp

Phần này mô tả cách tích hợp với API Trực tiếp đa phương thức.

Phiên

Một phiên đại diện cho một kết nối WebSocket duy nhất giữa ứng dụng và máy chủ Gemini.

Sau khi ứng dụng khởi tạo một kết nối mới, phiên có thể trao đổi thông báo với máy chủ để:

  • Gửi văn bản, âm thanh hoặc video đến máy chủ Gemini.
  • Nhận phản hồi âm thanh, văn bản hoặc lệnh gọi hàm từ máy chủ Gemini.

Cấu hình phiên được gửi trong thông báo đầu tiên sau khi kết nối. Cấu hình phiên bao gồm mô hình, thông số tạo, hướng dẫn hệ thống và các công cụ.

Hãy xem cấu hình mẫu sau:

{​​
  "model": string,
  "generation_config": {
    "candidate_count": integer,
    "max_output_tokens": integer,
    "temperature": number,
    "top_p": number,
    "top_k": integer,
    "presence_penalty": number,
    "frequency_penalty": number,
    "response_modalities": string,
    "speech_config":object
  },

  "system_instruction": "",
  "tools":[]
}

Để biết thêm thông tin, hãy xem BidiGenerateContentSetup.

Gửi tin nhắn

Thông báo là các chuỗi có định dạng JSON được trao đổi qua kết nối WebSocket.

Để gửi thông báo, ứng dụng phải gửi thông báo ứng dụng được hỗ trợ ở dạng chuỗi được định dạng JSON qua một trong các kết nối WebSocket đang mở.

Tin nhắn được hỗ trợ của ứng dụng

Xem các thông báo ứng dụng được hỗ trợ trong bảng sau:

Thông điệp Mô tả
BidiGenerateContentSetup Cấu hình phiên sẽ được gửi trong thông báo đầu tiên
BidiGenerateContentClientContent Nội dung cập nhật gia tăng của cuộc trò chuyện hiện tại do ứng dụng gửi
BidiGenerateContentRealtimeInput Đầu vào âm thanh hoặc video theo thời gian thực
BidiGenerateContentToolResponse Phản hồi ToolCallMessage nhận được từ máy chủ

Nhận tin nhắn

Để nhận thông báo từ Gemini, hãy theo dõi sự kiện "message" (thông báo) của WebSocket, sau đó phân tích cú pháp kết quả theo định nghĩa của thông báo máy chủ được hỗ trợ.

Xem các mục sau đây:

ws.addEventListener("message", async (evt) => {
  if (evt.data instanceof Blob) {
    // Process the received data (audio, video, etc.)
  } else {
    // Process JSON response
  }
});

Thông báo máy chủ được hỗ trợ

Xem các thông báo máy chủ được hỗ trợ trong bảng sau:

Thông điệp Mô tả
BidiGenerateContentSetupComplete Tin nhắn BidiGenerateContentSetup từ ứng dụng khách, được gửi khi thiết lập xong
BidiGenerateContentServerContent Nội dung do mô hình tạo ra để phản hồi một thông báo của ứng dụng
BidiGenerateContentToolCall Yêu cầu ứng dụng chạy các lệnh gọi hàm và trả về phản hồi bằng mã nhận dạng phù hợp
BidiGenerateContentToolCallCancellation Được gửi khi lệnh gọi hàm bị huỷ do người dùng làm gián đoạn đầu ra của mô hình

Cập nhật nội dung tăng dần

Sử dụng các bản cập nhật gia tăng để gửi dữ liệu nhập văn bản, thiết lập hoặc khôi phục ngữ cảnh phiên. Đối với ngữ cảnh ngắn, bạn có thể gửi các lượt tương tác từng chặng để thể hiện trình tự chính xác của các sự kiện. Đối với các ngữ cảnh dài hơn, bạn nên cung cấp một bản tóm tắt tin nhắn duy nhất để giải phóng cửa sổ ngữ cảnh cho các lượt tương tác tiếp theo.

Xem thông báo ngữ cảnh mẫu sau:

{
  "client_content": {
    "turns": [
      {
          "parts":[
          {
            "text": ""
          }
        ],
        "role":"user"
      },
      {
          "parts":[
          {
            "text": ""
          }
        ],
        "role":"model"
      }
    ],
    "turn_complete": true
  }
}

Xin lưu ý rằng mặc dù các phần nội dung có thể thuộc loại functionResponse, nhưng bạn không nên sử dụng BidiGenerateContentClientContent để cung cấp phản hồi cho các lệnh gọi hàm do mô hình đưa ra. Bạn nên chuyển sang dùng BidiGenerateContentToolResponse. Bạn chỉ nên sử dụng BidiGenerateContentClientContent để thiết lập ngữ cảnh trước đó hoặc cung cấp dữ liệu đầu vào văn bản cho cuộc trò chuyện.

Truyền trực tuyến âm thanh và video

Lệnh gọi hàm

Tất cả các hàm phải được khai báo ở đầu phiên bằng cách gửi định nghĩa công cụ trong thông báo BidiGenerateContentSetup.

Hãy xem Hướng dẫn gọi hàm để tìm hiểu thêm về cách gọi hàm.

Từ một câu lệnh duy nhất, mô hình có thể tạo nhiều lệnh gọi hàm và mã cần thiết để tạo chuỗi đầu ra. Mã này thực thi trong môi trường hộp cát, tạo ra các thông báo BidiGenerateContentToolCall tiếp theo. Quá trình thực thi sẽ tạm dừng cho đến khi có kết quả của từng lệnh gọi hàm, đảm bảo quá trình xử lý tuần tự.

Ứng dụng sẽ phản hồi bằng BidiGenerateContentToolResponse.

Đầu vào âm thanh và đầu ra âm thanh ảnh hưởng tiêu cực đến khả năng của mô hình trong việc sử dụng lệnh gọi hàm.

Định dạng âm thanh

API Trực tiếp đa phương thức hỗ trợ các định dạng âm thanh sau:

  • Định dạng âm thanh đầu vào: Âm thanh PCM 16 bit thô ở 16 kHz little-endian
  • Định dạng âm thanh đầu ra: Âm thanh PCM 16 bit thô ở 24 kHz little-endian

Hướng dẫn về hệ thống

Bạn có thể cung cấp hướng dẫn hệ thống để kiểm soát tốt hơn đầu ra của mô hình và chỉ định giọng điệu cũng như cảm xúc của câu trả lời bằng âm thanh.

Hướng dẫn của hệ thống được thêm vào lời nhắc trước khi tương tác bắt đầu và vẫn có hiệu lực trong toàn bộ phiên.

Bạn chỉ có thể đặt hướng dẫn hệ thống ở đầu phiên, ngay sau khi kết nối ban đầu. Để cung cấp thêm dữ liệu đầu vào cho mô hình trong phiên, hãy sử dụng tính năng cập nhật nội dung gia tăng.

Gián đoạn

Người dùng có thể làm gián đoạn đầu ra của mô hình bất cứ lúc nào. Khi tính năng Phát hiện hoạt động thoại (VAD) phát hiện thấy một sự gián đoạn, quá trình tạo đang diễn ra sẽ bị huỷ và bị loại bỏ. Chỉ thông tin đã gửi đến ứng dụng mới được giữ lại trong nhật ký phiên. Sau đó, máy chủ sẽ gửi một thông báo BidiGenerateContentServerContent để báo cáo sự gián đoạn.

Ngoài ra, máy chủ Gemini sẽ loại bỏ mọi lệnh gọi hàm đang chờ xử lý và gửi thông báo BidiGenerateContentServerContent có mã nhận dạng của các lệnh gọi đã bị huỷ.

Giọng nói

Multimodal Live API hỗ trợ các giọng nói sau: Aoede, Charon, Fenrir, Kore và Puck.

Để chỉ định giọng nói, hãy đặt voice_name trong đối tượng speech_config, trong cấu hình phiên.

Xem nội dung đại diện JSON sau đây của đối tượng speech_config:

{
  "voice_config": {
    "prebuilt_voice_config ": {
      "voice_name": <var>VOICE_NAME</var>
    }
  }
}

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

Hãy cân nhắc các giới hạn sau đây của API Trực tiếp đa phương thức và Gemini 2.0 khi bạn lên kế hoạch cho dự án.

Xác thực ứng dụng

API trực tiếp đa phương thức chỉ cung cấp tính năng xác thực máy chủ với máy chủ và không nên dùng cho ứng dụng khách trực tiếp. Dữ liệu đầu vào của ứng dụng khách phải được định tuyến thông qua một máy chủ ứng dụng trung gian để xác thực an toàn bằng API trực tiếp đa phương thức.

Đối với ứng dụng web và ứng dụng di động, bạn nên sử dụng tính năng tích hợp của các đối tác của chúng tôi tại Daily.

Lịch sử cuộc trò chuyện

Mặc dù mô hình này theo dõi các lượt tương tác trong phiên, nhưng nhật ký trò chuyện sẽ không được lưu trữ. Khi một phiên kết thúc, ngữ cảnh tương ứng sẽ bị xoá.

Để khôi phục một phiên trước đó hoặc cung cấp cho mô hình ngữ cảnh trước đây về các lượt tương tác của người dùng, ứng dụng phải duy trì nhật ký trò chuyện của riêng mình và sử dụng thông báo BidiGenerateContentClientContent để gửi thông tin này khi bắt đầu một phiên mới.

Thời lượng phiên tối đa

Thời lượng phiên được giới hạn ở tối đa 15 phút đối với âm thanh hoặc tối đa 2 phút đối với âm thanh và video. Khi thời lượng phiên vượt quá giới hạn, kết nối sẽ bị chấm dứt.

Mô hình cũng bị giới hạn bởi kích thước ngữ cảnh. Việc gửi các phần nội dung lớn cùng với luồng video và âm thanh có thể khiến phiên kết thúc sớm hơn.

Phát hiện hoạt động giọng nói (VAD)

Mô hình này tự động thực hiện tính năng phát hiện hoạt động giọng nói (VAD) trên một luồng đầu vào âm thanh liên tục. VAD luôn bật và không thể định cấu hình các thông số của nó.

Số lượng mã thông báo

Không hỗ trợ số lượng mã thông báo.

Giới hạn số lượng yêu cầu

Các giới hạn tốc độ sau đây sẽ được áp dụng:

  • 3 phiên đồng thời cho mỗi khoá API
  • 4 triệu mã thông báo mỗi phút

Tin nhắn và sự kiện

BidiGenerateContentClientContent

Nội dung cập nhật gia tăng của cuộc trò chuyện hiện tại được gửi từ ứng dụng. Tất cả nội dung ở đây được thêm vào nhật ký cuộc trò chuyện một cách vô điều kiện và được dùng làm một phần của câu lệnh để mô hình tạo nội dung.

Thông báo tại đây sẽ làm gián đoạn mọi hoạt động tạo mô hình hiện tại.

Trường
turns[]

Content

Không bắt buộc. Nội dung được thêm vào cuộc trò chuyện hiện tại với mô hình.

Đối với truy vấn một lượt, đây là một thực thể duy nhất. Đối với các truy vấn nhiều lượt, đây là trường lặp lại chứa nhật ký trò chuyện và yêu cầu mới nhất.

turn_complete

bool

Không bắt buộc. Nếu đúng, hãy cho biết rằng quá trình tạo nội dung máy chủ sẽ bắt đầu bằng lời nhắc hiện đã tích luỹ. Nếu không, máy chủ sẽ chờ thêm thông báo trước khi bắt đầu tạo.

BidiGenerateContentRealtimeInput

Dữ liệu do người dùng nhập được gửi theo thời gian thực.

Phương thức này khác với BidiGenerateContentClientContent ở một số điểm:

  • Có thể gửi liên tục mà không bị gián đoạn để tạo mô hình.
  • Nếu cần kết hợp dữ liệu được xen kẽ trên BidiGenerateContentClientContentBidiGenerateContentRealtimeInput, máy chủ sẽ cố gắng tối ưu hoá để phản hồi tốt nhất, nhưng không có gì đảm bảo.
  • Điểm kết thúc lượt nói không được chỉ định rõ ràng, mà được lấy từ hoạt động của người dùng (ví dụ: kết thúc lời nói).
  • Ngay cả trước khi kết thúc lượt, dữ liệu vẫn được xử lý tăng dần để tối ưu hoá việc bắt đầu nhanh phản hồi từ mô hình.
  • Luôn là dữ liệu đầu vào trực tiếp của người dùng được gửi theo thời gian thực. Có thể gửi liên tục mà không bị gián đoạn. Mô hình tự động phát hiện thời điểm bắt đầu và kết thúc lời nói của người dùng, đồng thời bắt đầu hoặc kết thúc truyền trực tuyến phản hồi cho phù hợp. Dữ liệu được xử lý tăng dần khi đến, giúp giảm thiểu độ trễ.
Trường
media_chunks[]

Blob

Không bắt buộc. Dữ liệu byte nội tuyến cho dữ liệu đầu vào đa phương tiện.

BidiGenerateContentServerContent

Nội dung cập nhật máy chủ gia tăng do mô hình tạo ra để phản hồi thông báo của ứng dụng khách.

Nội dung được tạo nhanh nhất có thể chứ không phải theo thời gian thực. Ứng dụng có thể chọn lưu vào bộ đệm và phát theo thời gian thực.

Trường
turn_complete

bool

Chỉ có đầu ra. Nếu là true, cho biết mô hình đã tạo xong. Quá trình tạo sẽ chỉ bắt đầu khi phản hồi các thông báo khác của ứng dụng. Có thể được đặt cùng với content, cho biết content là lượt cuối cùng.

interrupted

bool

Chỉ có đầu ra. Nếu đúng, cho biết rằng một thông báo của ứng dụng đã làm gián đoạn quá trình tạo mô hình hiện tại. Nếu ứng dụng đang phát nội dung theo thời gian thực, thì đây là tín hiệu tốt để dừng và làm trống hàng đợi phát hiện tại.

grounding_metadata

GroundingMetadata

Chỉ có đầu ra. Siêu dữ liệu cơ sở cho nội dung được tạo.

model_turn

Content

Chỉ có đầu ra. Nội dung mà mô hình đã tạo trong cuộc trò chuyện hiện tại với người dùng.

BidiGenerateContentSetup

Thông báo sẽ được gửi trong thông báo đầu tiên và duy nhất của ứng dụng khách. Chứa cấu hình sẽ áp dụng trong suốt phiên phát trực tuyến.

Ứng dụng nên đợi thông báo BidiGenerateContentSetupComplete trước khi gửi thêm thông báo.

Trường
model

string

Bắt buộc. Tên tài nguyên của mô hình. Đây là mã nhận dạng để Mô hình sử dụng.

Định dạng models/{model}

generation_config

GenerationConfig

Không bắt buộc. Cấu hình tạo.

Các trường sau đây không được hỗ trợ:

  • response_logprobs
  • response_mime_type
  • logprobs
  • response_schema
  • stop_sequence
  • routing_config
  • audio_timestamp
system_instruction

Content

Không bắt buộc. Người dùng đã cung cấp hướng dẫn hệ thống cho mô hình.

Lưu ý: Chỉ nên sử dụng văn bản trong các phần và nội dung trong mỗi phần sẽ nằm trong một đoạn riêng.

tools[]

Tool

Không bắt buộc. Danh sách Tools mà mô hình có thể sử dụng để tạo phản hồi tiếp theo.

Tool là một đoạn mã cho phép hệ thống tương tác với các hệ thống bên ngoài để thực hiện một hành động hoặc một tập hợp hành động nằm ngoài kiến thức và phạm vi của mô hình.

BidiGenerateContentSetupComplete

Loại này không có trường nào.

Được gửi để phản hồi một thông báo BidiGenerateContentSetup từ ứng dụng khách.

BidiGenerateContentToolCall

Yêu cầu ứng dụng khách thực thi function_calls và trả về các phản hồi bằng id phù hợp.

Trường
function_calls[]

FunctionCall

Chỉ có đầu ra. Lệnh gọi hàm sẽ được thực thi.

BidiGenerateContentToolCallCancellation

Thông báo cho ứng dụng khách rằng ToolCallMessage đã phát hành trước đó với các id được chỉ định không được thực thi và phải bị huỷ. Nếu có hiệu ứng phụ đối với các lệnh gọi công cụ đó, ứng dụng có thể cố gắng huỷ các lệnh gọi công cụ. Thông báo này chỉ xảy ra trong trường hợp ứng dụng làm gián đoạn lượt của máy chủ.

Trường
ids[]

string

Chỉ có đầu ra. Mã của các lệnh gọi công cụ cần huỷ.

BidiGenerateContentToolResponse

Phản hồi do ứng dụng tạo cho một ToolCall nhận được từ máy chủ. Các đối tượng FunctionResponse riêng lẻ được so khớp với các đối tượng FunctionCall tương ứng theo trường id.

Xin lưu ý rằng trong API Tạo nội dung một chiều và API Tạo nội dung truyền trực tuyến qua máy chủ, việc gọi hàm diễn ra bằng cách trao đổi các phần Content, trong khi trong API Tạo nội dung hai chiều, việc gọi hàm diễn ra qua các nhóm thông báo chuyên dụng này.

Trường
function_responses[]

FunctionResponse

Không bắt buộc. Phản hồi cho các lệnh gọi hàm.

Thông tin khác về các loại phổ biến

Để biết thêm thông tin về các loại tài nguyên API thường dùng Blob, Content, FunctionCall, FunctionResponse, GenerationConfig, GroundingMetadataTool, hãy xem phần Tạo nội dung.