Мультимодальный Live API обеспечивает двунаправленное голосовое и видео взаимодействие с Gemini с малой задержкой. Используя Multimodal Live API, вы можете предоставить конечным пользователям возможность естественного, человеческого голосового общения, а также возможность прерывать ответы модели с помощью голосовых команд. Модель может обрабатывать ввод текста, аудио и видео, а также обеспечивать вывод текста и звука.
Возможности
Мультимодальный Live API включает в себя следующие ключевые возможности:
- Мультимодальность: модель может видеть, слышать и говорить.
- Взаимодействие в реальном времени с малой задержкой: обеспечивает быструю реакцию.
- Память сеанса: модель сохраняет память обо всех взаимодействиях в течение одного сеанса, вспоминая ранее услышанную или увиденную информацию.
- Поддержка вызова функций, выполнения кода и поиска как инструмента: обеспечивает интеграцию с внешними службами и источниками данных.
- Автоматическое обнаружение голосовой активности (VAD). Модель может точно распознавать, когда пользователь начинает и прекращает говорить. Это обеспечивает естественное диалоговое взаимодействие и дает пользователям возможность прервать работу модели в любой момент.
Вы можете попробовать Multimodal Live API в Google AI Studio .
Начать
Мультимодальный Live API — это API с отслеживанием состояния, который использует WebSockets .
В этом разделе показан пример использования Multimodal Live API для преобразования текста в текст с использованием Python 3.9+.
Установите библиотеку Gemini API.
Чтобы установить пакет google-genai
, используйте следующую команду pip
:
!pip3 install google-genai
Импортировать зависимости
Чтобы импортировать зависимости:
from google import genai
Отправка и получение текстового сообщения
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())
Руководство по интеграции
В этом разделе описывается, как работает интеграция с Multimodal Live API.
Сессии
Сеанс представляет собой одно соединение WebSocket между клиентом и сервером Gemini.
После того, как клиент инициирует новое соединение, сеанс может обмениваться сообщениями с сервером, чтобы:
- Отправьте текст, аудио или видео на сервер Gemini.
- Получайте аудио-, текстовые ответы или ответы на вызовы функций с сервера Gemini.
Конфигурация сеанса отправляется в первом сообщении после подключения. Конфигурация сеанса включает модель, параметры генерации, системные инструкции и инструменты.
См. следующий пример конфигурации:
{
"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":[]
}
Дополнительные сведения см. в разделе BidiGenerateContentSetup .
Отправлять сообщения
Сообщения представляют собой строки в формате JSON, которыми обмениваются через соединение WebSocket.
Чтобы отправить сообщение, клиент должен отправить поддерживаемое клиентское сообщение в строке в формате JSON с помощью одного из открытых соединений WebSocket.
Поддерживаемые клиентские сообщения
См. поддерживаемые клиентские сообщения в следующей таблице:
Сообщение | Описание |
---|---|
BidiGenerateContentSetup | Конфигурация сеанса будет отправлена в первом сообщении |
BidiGenerateContentClientContent | Постепенное обновление контента текущего разговора, доставленное от клиента |
BidiGenerateContentRealtimeInput | Аудио или видео вход в реальном времени |
BidiGenerateContentToolResponse | Ответ на ToolCallMessage полученный от сервера |
Получать сообщения
Чтобы получать сообщения от Gemini, прослушайте событие «сообщение» WebSocket, а затем проанализируйте результат в соответствии с определением поддерживаемых сообщений сервера.
См. следующее:
ws.addEventListener("message", async (evt) => {
if (evt.data instanceof Blob) {
// Process the received data (audio, video, etc.)
} else {
// Process JSON response
}
});
Поддерживаемые сообщения сервера
См. поддерживаемые сообщения сервера в следующей таблице:
Сообщение | Описание |
---|---|
BidiGenerateContentSetupComplete | Сообщение BidiGenerateContentSetup от клиента, отправленное после завершения установки. |
BidiGenerateContentServerContent | Контент, создаваемый моделью в ответ на сообщение клиента |
BidiGenerateContentToolCall | Запрос клиента на выполнение вызовов функций и возврат ответов с совпадающими идентификаторами. |
BidiGenerateContentToolCallCancellation | Отправляется, когда вызов функции отменяется из-за того, что пользователь прерывает вывод модели. |
Дополнительные обновления контента
Используйте дополнительные обновления для отправки текстового ввода, установления или восстановления контекста сеанса. Для коротких контекстов вы можете отправлять пошаговые взаимодействия, чтобы представить точную последовательность событий. Для более длинных контекстов рекомендуется предоставить сводку одного сообщения, чтобы освободить окно контекста для последующих взаимодействий.
См. следующий пример контекстного сообщения:
{
"client_content": {
"turns": [
{
"parts":[
{
"text": ""
}
],
"role":"user"
},
{
"parts":[
{
"text": ""
}
],
"role":"model"
}
],
"turn_complete": true
}
}
Обратите внимание: хотя части контента могут иметь тип functionResponse
, BidiGenerateContentClientContent
не следует использовать для предоставления ответа на вызовы функций, выдаваемые моделью. Вместо этого следует использовать BidiGenerateContentToolResponse
. BidiGenerateContentClientContent
следует использовать только для установления предыдущего контекста или ввода текста в разговор.
Потоковое аудио и видео
Вызов функции
Все функции должны быть объявлены в начале сеанса путем отправки определений инструментов как часть сообщения BidiGenerateContentSetup
.
Дополнительную информацию о вызове функций см. в руководстве по вызову функций .
Из одного приглашения модель может генерировать несколько вызовов функций и код, необходимый для объединения их выходных данных в цепочку. Этот код выполняется в изолированной среде, генерируя последующие сообщения BidiGenerateContentToolCall
. Выполнение приостанавливается до тех пор, пока не станут доступны результаты каждого вызова функции, что обеспечивает последовательную обработку.
Клиент должен ответить BidiGenerateContentToolResponse
.
Аудиовходы и аудиовыходы отрицательно влияют на способность модели использовать вызов функций.
Аудио форматы
Мультимодальный Live API поддерживает следующие аудиоформаты:
- Формат входного аудио: необработанный 16-битный звук PCM с частотой 16 кГц с прямым порядком байтов.
- Выходной аудиоформат: необработанный 16-битный звук PCM с частотой 24 кГц с прямым порядком байтов.
Системные инструкции
Вы можете предоставить системные инструкции, чтобы лучше контролировать вывод модели и указывать тон и тональность звуковых ответов.
Системные инструкции добавляются в подсказку перед началом взаимодействия и остаются в силе на протяжении всего сеанса.
Системные инструкции можно задать только в начале сеанса, сразу после первоначального подключения. Чтобы предоставить дополнительные данные для модели во время сеанса, используйте дополнительные обновления контента.
Перебои
Пользователи могут прервать вывод модели в любой момент. Когда обнаружение голосовой активности (VAD) обнаруживает прерывание, текущая генерация отменяется и отменяется. В истории сеанса сохраняется только информация, уже отправленная клиенту. Затем сервер отправляет сообщение BidiGenerateContentServerContent
чтобы сообщить о прерывании.
Кроме того, сервер Gemini отбрасывает все ожидающие вызовы функций и отправляет сообщение BidiGenerateContentServerContent
с идентификаторами отмененных вызовов.
Голоса
Мультимодальный Live API поддерживает следующие голоса: Aoede, Charon, Fenrir, Kore и Puck.
Чтобы указать голос, задайте voice_name
в объекте speech_config
как часть конфигурации сеанса .
См. следующее JSON-представление объекта speech_config
:
{
"voice_config": {
"prebuilt_voice_config ": {
"voice_name": <var>VOICE_NAME</var>
}
}
}
Ограничения
При планировании проекта учитывайте следующие ограничения Multimodal Live API и Gemini 2.0.
Аутентификация клиента
Мультимодальный Live API обеспечивает только аутентификацию между серверами и не рекомендуется для прямого использования клиентом. Ввод клиента должен направляться через промежуточный сервер приложений для безопасной аутентификации с помощью Multimodal Live API.
Для веб-приложений и мобильных приложений мы рекомендуем использовать интеграцию от наших партнеров Daily .
История разговоров
Хотя модель отслеживает взаимодействия во время сеанса, история разговоров не сохраняется. Когда сеанс завершается, соответствующий контекст удаляется.
Чтобы восстановить предыдущий сеанс или предоставить модели исторический контекст взаимодействия с пользователем, приложение должно вести собственный журнал разговоров и использовать сообщение BidiGenerateContentClientContent
для отправки этой информации в начале нового сеанса.
Максимальная продолжительность сеанса
Продолжительность сеанса ограничена до 15 минут для аудио или до 2 минут для аудио и видео. Когда продолжительность сеанса превышает лимит, соединение разрывается.
Модель также ограничена размером контекста. Отправка больших фрагментов контента вместе с видео- и аудиопотоками может привести к более раннему завершению сеанса.
Обнаружение голосовой активности (VAD)
Модель автоматически выполняет обнаружение голосовой активности (VAD) в непрерывном входном аудиопотоке. VAD всегда включен, и его параметры нельзя настроить.
Количество токенов
Подсчет токенов не поддерживается.
Ограничения ставок
Применяются следующие ограничения по ставкам:
- 3 одновременных сеанса на каждый ключ API
- 4 миллиона токенов в минуту
Сообщения и события
BidiGenerateContentClientContent
Инкрементное обновление текущего разговора, доставленное от клиента. Весь контент здесь безоговорочно добавляется в историю разговоров и используется как часть подсказки модели для создания контента.
Сообщение здесь прервет любую текущую генерацию модели.
Поля | |
---|---|
turns[] | Необязательный. Содержимое, добавленное к текущему разговору с моделью. Для однооборотных запросов это один экземпляр. Для многоходовых запросов это повторяющееся поле, содержащее историю разговоров и последний запрос. |
turn_ complete | Необязательный. Если это правда, указывает, что генерация контента сервера должна начаться с текущего накопленного приглашения. В противном случае сервер ожидает дополнительных сообщений перед началом генерации. |
BidiGenerateContentRealtimeInput
Пользовательский ввод, который отправляется в режиме реального времени.
Это отличается от BidiGenerateContentClientContent
по нескольким причинам:
- Может отправляться непрерывно, без перерыва на генерацию модели.
- Если необходимо смешать данные, чередующиеся между
BidiGenerateContentClientContent
иBidiGenerateContentRealtimeInput
, сервер пытается оптимизировать для лучшего ответа, но нет никаких гарантий. - Конец хода не указывается явно, а скорее определяется активностью пользователя (например, окончанием речи).
- Еще до окончания хода данные обрабатываются поэтапно, чтобы оптимизировать быстрый запуск ответа модели.
- Это всегда прямой пользовательский ввод, который отправляется в режиме реального времени. Может отправляться непрерывно, без перерывов. Модель автоматически определяет начало и конец речи пользователя и соответственно запускает или прекращает потоковую передачу ответа. Данные обрабатываются постепенно по мере их поступления, что сводит к минимуму задержку.
Поля | |
---|---|
media_ chunks[] | Необязательный. Встроенные байтовые данные для ввода мультимедиа. |
BidiGenerateContentServerContent
Добавочное обновление сервера, генерируемое моделью в ответ на сообщения клиента.
Контент генерируется максимально быстро, а не в реальном времени. Клиенты могут выбрать буферизацию и воспроизведение в реальном времени.
Поля | |
---|---|
turn_ complete | Только вывод. Если это правда, указывает, что создание модели завершено. Генерация начнется только в ответ на дополнительные сообщения клиента. Может быть установлен рядом с |
interrupted | Только вывод. Если это правда, это означает, что сообщение клиента прервало генерацию текущей модели. Если клиент воспроизводит контент в реальном времени, это хороший сигнал для остановки и очистки текущей очереди воспроизведения. |
grounding_ metadata | Только вывод. Обоснование метаданных для сгенерированного контента. |
model_ turn | Только вывод. Содержимое, созданное моделью в рамках текущего разговора с пользователем. |
BidiGenerateContentSetup
Сообщение, которое будет отправлено в первом и единственном первом клиентском сообщении. Содержит конфигурацию, которая будет применяться на протяжении всего сеанса потоковой передачи.
Клиентам следует дождаться сообщения BidiGenerateContentSetupComplete
прежде чем отправлять какие-либо дополнительные сообщения.
Поля | |
---|---|
model | Необходимый. Имя ресурса модели. Это служит идентификатором для использования модели. Формат: |
generation_ config | Необязательный. Конфигурация поколения. Следующие поля не поддерживаются:
|
system_ instruction | Необязательный. Пользователь предоставил системные инструкции для модели. Примечание. В частях следует использовать только текст, а содержимое каждой части будет находиться в отдельном абзаце. |
tools[] | Необязательный. Список |
BidiGenerateContentSetupComplete
Этот тип не имеет полей.
Отправляется в ответ на сообщение BidiGenerateContentSetup
от клиента.
BidiGenerateContentToolCall
Запросите у клиента выполнение function_calls
и возврат ответов с совпадающим id
s.
Поля | |
---|---|
function_ calls[] | Только вывод. Вызов функции, который необходимо выполнить. |
BidiGenerateContentToolCallCancellation
Уведомление клиента о том, что ранее выданное ToolCallMessage
с указанными id
не было выполнено и должно быть отменено. Если эти вызовы инструментов имели побочные эффекты, клиенты могут попытаться отменить вызовы инструментов. Это сообщение появляется только в тех случаях, когда клиенты прерывают вращение сервера.
Поля | |
---|---|
ids[] | Только вывод. Идентификаторы вызовов инструментов, которые необходимо отменить. |
BidiGenerateContentToolResponse
Клиент сгенерировал ответ на ToolCall
полученный от сервера. Отдельные объекты FunctionResponse
сопоставляются с соответствующими объектами FunctionCall
по полю id
.
Обратите внимание, что в унарном и серверном API-интерфейсах GenerateContent вызов функции происходит путем обмена частями Content
, тогда как в биди-интерфейсах GenerateContent вызов функции происходит через этот выделенный набор сообщений.
Поля | |
---|---|
function_ responses[] | Необязательный. Ответ на вызовы функций. |
Дополнительная информация о распространенных типах
Дополнительные сведения о часто используемых типах ресурсов API Blob
, Content
, FunctionCall
, FunctionResponse
, GenerationConfig
, GroundingMetadata
и Tool
см. в разделе Создание контента .