Live API обеспечивает двунаправленное голосовое и видео взаимодействие с Gemini с малой задержкой. Используя Live API, вы можете предоставить конечным пользователям возможность естественного, человеческого голосового общения, а также возможность прерывать ответы модели с помощью голосовых команд. Модель может обрабатывать ввод текста, аудио и видео, а также обеспечивать вывод текста и звука.
Вы можете попробовать Live API в Google AI Studio .
Что нового
У Live API появились новые функции и возможности!
Новые возможности:
- Два новых голоса и 30 новых языков с настраиваемым языком вывода.
- Настраиваемое разрешение изображения 66/256 токенов
- Настраиваемый охват поворота: отправляйте все входные данные постоянно или только тогда, когда пользователь говорит.
- Настройте, должен ли ввод прерывать модель или нет
- Настраиваемое обнаружение голосовой активности и новые события клиента для сигнализации конца поворота
- Количество токенов
- Клиентское событие для сигнализации об окончании потока.
- Потоковая передача текста
- Настраиваемое возобновление сеанса, данные сеанса хранятся на сервере в течение 24 часов.
- Поддержка более длительных сеансов с помощью скользящего контекстного окна.
Новые клиентские события:
- Конец аудиопотока/микрофон закрыт
- События начала/конца активности для ручного управления переходом поворота
Новые события на сервере:
- Уведомление об уходе, сигнализирующее о необходимости перезапустить сеанс
- Генерация завершена
Используйте Live API
В этом разделе описывается, как использовать Live API с одним из наших SDK. Дополнительные сведения о базовом API WebSockets см. в справочнике по API WebSockets .
Отправлять и получать текст
import asyncio
from google import genai
client = genai.Client(api_key="GEMINI_API_KEY")
model = "gemini-2.0-flash-live-001"
config = {"response_modalities": ["TEXT"]}
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
while True:
message = input("User> ")
if message.lower() == "exit":
break
await session.send_client_content(
turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
)
async for response in session.receive():
if response.text is not None:
print(response.text, end="")
if __name__ == "__main__":
asyncio.run(main())
Получить аудио
В следующем примере показано, как получить аудиоданные и записать их в .wav
файл.
import asyncio
import wave
from google import genai
client = genai.Client(api_key="GEMINI_API_KEY", http_options={'api_version': 'v1alpha'})
model = "gemini-2.0-flash-live-001"
config = {"response_modalities": ["AUDIO"]}
async def main():
async with client.aio.live.connect(model=model, config=config) as session:
wf = wave.open("audio.wav", "wb")
wf.setnchannels(1)
wf.setsampwidth(2)
wf.setframerate(24000)
message = "Hello? Gemini are you there?"
await session.send_client_content(
turns={"role": "user", "parts": [{"text": message}]}, turn_complete=True
)
async for idx,response in async_enumerate(session.receive()):
if response.data is not None:
wf.writeframes(response.data)
# Un-comment this code to print audio data info
# if response.server_content.model_turn is not None:
# print(response.server_content.model_turn.parts[0].inline_data.mime_type)
wf.close()
if __name__ == "__main__":
asyncio.run(main())
Аудио форматы
Live API поддерживает следующие аудиоформаты:
- Формат входного аудио: необработанный 16-битный звук PCM с частотой 16 кГц с прямым порядком байтов.
- Выходной аудиоформат: необработанный 16-битный звук PCM с частотой 24 кГц с прямым порядком байтов.
Потоковое аудио и видео
Системные инструкции
Системные инструкции позволяют вам управлять поведением модели в зависимости от ваших конкретных потребностей и вариантов использования. Системные инструкции могут быть установлены в конфигурации установки и будут действовать в течение всего сеанса.
from google.genai import types
config = {
"system_instruction": types.Content(
parts=[
types.Part(
text="You are a helpful assistant and answer in a friendly tone."
)
]
),
"response_modalities": ["TEXT"],
}
Дополнительные обновления контента
Используйте дополнительные обновления для отправки текстового ввода, установления контекста сеанса или восстановления контекста сеанса. Для коротких контекстов вы можете отправлять пошаговые взаимодействия, чтобы представить точную последовательность событий:
Питон
turns = [
{"role": "user", "parts": [{"text": "What is the capital of France?"}]},
{"role": "model", "parts": [{"text": "Paris"}]},
]
await session.send_client_content(turns=turns, turn_complete=False)
turns = [{"role": "user", "parts": [{"text": "What is the capital of Germany?"}]}]
await session.send_client_content(turns=turns, turn_complete=True)
JSON
{
"clientContent": {
"turns": [
{
"parts":[
{
"text": ""
}
],
"role":"user"
},
{
"parts":[
{
"text": ""
}
],
"role":"model"
}
],
"turnComplete": true
}
}
Для более длинных контекстов рекомендуется предоставить сводку одного сообщения, чтобы освободить окно контекста для последующих взаимодействий.
Изменение голоса
Live API поддерживает следующие голоса: Puck, Charon, Kore, Fenrir, Aoede, Leda, Orus и Zephyr.
Чтобы указать голос, задайте имя голоса в объекте speechConfig
как часть конфигурации сеанса:
Питон
from google.genai import types
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
speech_config=types.SpeechConfig(
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(voice_name="Kore")
)
)
)
JSON
{
"voiceConfig": {
"prebuiltVoiceConfig": {
"voiceName": "Kore"
}
}
}
Используйте вызов функции
Вы можете определять инструменты с помощью Live API. Дополнительную информацию о вызове функций см. в руководстве по вызову функций.
Инструменты должны быть определены как часть конфигурации сеанса:
config = types.LiveConnectConfig(
response_modalities=["TEXT"],
tools=[set_light_values]
)
async with client.aio.live.connect(model=model, config=config) as session:
await session.send_client_content(
turns={
"role": "user",
"parts": [{"text": "Turn the lights down to a romantic level"}],
},
turn_complete=True,
)
async for response in session.receive():
print(response.tool_call)
Из одного приглашения модель может генерировать несколько вызовов функций и код, необходимый для объединения их выходных данных в цепочку. Этот код выполняется в изолированной среде, генерируя последующие сообщения BidiGenerateContentToolCall . Выполнение приостанавливается до тех пор, пока не станут доступны результаты каждого вызова функции, что обеспечивает последовательную обработку.
Клиент должен ответить BidiGenerateContentToolResponse .
Аудиовходы и аудиовыходы отрицательно влияют на способность модели использовать вызов функций.
Обработка прерываний
Пользователи могут прервать вывод модели в любой момент. Когда обнаружение голосовой активности (VAD) обнаруживает прерывание, текущая генерация отменяется и отменяется. В истории сеанса сохраняется только информация, уже отправленная клиенту. Затем сервер отправляет сообщение BidiGenerateContentServerContent , чтобы сообщить о прерывании.
Кроме того, сервер Gemini отбрасывает все ожидающие вызовы функций и отправляет сообщение BidiGenerateContentServerContent
с идентификаторами отмененных вызовов.
async for response in session.receive():
if response.server_content.interrupted is not None:
# The generation was interrupted
Настройка обнаружения голосовой активности (VAD)
По умолчанию модель автоматически выполняет обнаружение голосовой активности (VAD) в непрерывном входном аудиопотоке. VAD можно настроить с помощью поля realtimeInputConfig.automaticActivityDetection
конфигурации установки .
Когда аудиопоток приостанавливается более чем на секунду (например, из-за того, что пользователь выключил микрофон), должно быть отправлено событие audioStreamEnd
для очистки любого кэшированного звука. Клиент может возобновить отправку аудиоданных в любое время.
Альтернативно, автоматический VAD можно отключить, установив для realtimeInputConfig.automaticActivityDetection.disabled
значение true
в сообщении настройки. В этой конфигурации клиент отвечает за обнаружение речи пользователя и отправку сообщений activityStart
и activityEnd
в подходящее время. audioStreamEnd
не отправляется в этой конфигурации. Вместо этого любое прерывание потока отмечается сообщением activityEnd
.
Поддержка этой функции в SDK будет доступна в ближайшие недели.
Получить количество токенов
Общее количество использованных токенов можно найти в поле useMetadata возвращаемого сообщения сервера.
from google.genai import types
async with client.aio.live.connect(
model='gemini-2.0-flash-live-001',
config=types.LiveConnectConfig(
response_modalities=['AUDIO'],
),
) as session:
# Session connected
while True:
await session.send_client_content(
turns=types.Content(role='user', parts=[types.Part(text='Hello world!')])
)
async for message in session.receive():
# The server will periodically send messages that include
# UsageMetadata.
if message.usage_metadata:
usage = message.usage_metadata
print(
f'Used {usage.total_token_count} tokens in total. Response token'
' breakdown:'
)
for detail in usage.response_tokens_details:
match detail:
case types.ModalityTokenCount(modality=modality, token_count=count):
print(f'{modality}: {count}')
# For the purposes of this example, placeholder input is continually fed
# to the model. In non-sample code, the model inputs would come from
# the user.
if message.server_content and message.server_content.turn_complete:
break
Настроить возобновление сеанса
Чтобы предотвратить завершение сеанса, когда сервер периодически сбрасывает соединение WebSocket, настройте поле sessionResumption в конфигурации установки .
Передача этой конфигурации заставляет сервер отправлять сообщения SessionResumptionUpdate , которые можно использовать для возобновления сеанса путем передачи последнего токена возобновления в качестве SessionResumptionConfig.handle
последующего соединения.
from google.genai import types
print(f"Connecting to the service with handle {previous_session_handle}...")
async with client.aio.live.connect(
model="gemini-2.0-flash-live-001",
config=types.LiveConnectConfig(
response_modalities=["AUDIO"],
session_resumption=types.SessionResumptionConfig(
# The handle of the session to resume is passed here,
# or else None to start a new session.
handle=previous_session_handle
),
),
) as session:
# Session connected
while True:
await session.send_client_content(
turns=types.Content(
role="user", parts=[types.Part(text="Hello world!")]
)
)
async for message in session.receive():
# Periodically, the server will send update messages that may
# contain a handle for the current state of the session.
if message.session_resumption_update:
update = message.session_resumption_update
if update.resumable and update.new_handle:
# The handle should be retained and linked to the session.
return update.new_handle
# For the purposes of this example, placeholder input is continually fed
# to the model. In non-sample code, the model inputs would come from
# the user.
if message.server_content and message.server_content.turn_complete:
break
Получите сообщение до разрыва сеанса
Сервер отправляет сообщение GoAway , которое сигнализирует о том, что текущее соединение скоро будет разорвано. Это сообщение включает в себя timeLeft , указывающее оставшееся время и позволяющее вам предпринять дальнейшие действия, прежде чем соединение будет прервано как ABORTED.
Получите сообщение, когда генерация будет завершена
Сервер отправляет сообщение GenerationComplete , которое сигнализирует о том, что модель завершила генерацию ответа.
Включить сжатие контекстного окна
Чтобы включить более длительные сеансы и избежать внезапного прекращения соединения, вы можете включить сжатие контекстного окна, установив поле contextWindowCompression как часть конфигурации сеанса.
В ContextWindowCompressionConfig вы можете настроить механизм скользящего окна и количество токенов , запускающих сжатие.
from google.genai import types
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
context_window_compression=(
# Configures compression with default parameters.
types.ContextWindowCompressionConfig(
sliding_window=types.SlidingWindow(),
)
),
)
Изменить разрешение мультимедиа
Вы можете указать разрешение мультимедиа для входного мультимедиа, задав поле mediaResolution
как часть конфигурации сеанса:
from google.genai import types
config = types.LiveConnectConfig(
response_modalities=["AUDIO"],
media_resolution=types.MediaResolution.MEDIA_RESOLUTION_LOW,
)
Ограничения
При планировании проекта учитывайте следующие ограничения Live API и Gemini 2.0.
Способы реагирования
Вы можете установить только одну модальность ответа ( TEXT
или AUDIO
) для каждого сеанса в конфигурации сеанса. Попытка установить оба параметра приведет к появлению сообщения об ошибке конфигурации. Это означает, что вы можете настроить модель для ответа либо текстом, либо звуком, но не тем и другим в одном сеансе.
Аутентификация клиента
Live API обеспечивает только аутентификацию между серверами и не рекомендуется для прямого использования клиентом. Ввод клиента должен направляться через промежуточный сервер приложений для безопасной аутентификации с помощью Live API.
Продолжительность сеанса
Продолжительность сеанса можно увеличить до неограниченного значения, включив сжатие сеанса. Без сжатия сеансы только с аудио ограничены 15 минутами, а сеансы с аудио и видео — 2 минутами. Превышение этих ограничений без сжатия приведет к разрыву соединения.
Контекстное окно
Сеанс имеет ограничение контекстного окна в 32 тыс. токенов.
Поддерживаемые языки
Live API поддерживает следующие языки:
Язык | Код BCP-47 |
---|---|
Немецкий (Германия) | де-DE |
английский (Австралия) | ru-AU |
Английский (Великобритания) | ru-GB |
английский (Индия) | ru-IN |
английский (США) | ru-US |
Испанский (США) | es-США |
Французский (Франция) | пт-пятница |
Хинди (Индия) | привет-IN |
Португальский (Бразилия) | пт-БР |
Арабский (общий) | ар-ХА |
Испанский (Испания) | эс-ES |
Французский (Канада) | фр-Калифорния |
Индонезийский (Индонезия) | я сделал |
Итальянский (Италия) | это-ИТ |
Японский (Япония) | ja-JP |
Турецкий (Турция) | тр-ТР |
Вьетнамский (Вьетнам) | ви-ВН |
Бенгальский (Индия) | бн-ИН |
Гуджарати (Индия) | гу-ИН |
Каннада (Индия) | кн-ИН |
Малаялам (Индия) | мл-ИН |
Маратхи (Индия) | г-н-ИН |
Тамильский (Индия) | та-ИН |
Телугу (Индия) | те-ИН |
Голландский (Нидерланды) | нл-нл |
Корейский (Южная Корея) | ко-КР |
Мандаринский китайский (Китай) | cmn-CN |
Польский (Польша) | пл-ПЛ |
Русский (Россия) | ру-RU |
Тайский (Таиланд) | эт-Т |
Сторонние интеграции
Для развертывания веб-приложений и мобильных приложений вы можете изучить варианты: