Вы прочитали 2 из 3 бесплатных методичек сегодня
Безлимит →
Экстракт 17 декабря 2024

Создание мультимодальных голосовых приложений с использованием Realtime API

Mark и Kata (OpenAI) · OpenAI Верифицирован 29:45

Изучение интеграции Realtime API для создания низкозадержковых голосовых интерфейсов. Инструкция для разработчиков приложений, рассчитанная на 30 минут погружения.

⚡ Зачем читать

  • Преодоление барьера задержки: Узнайте, как переход от «сшивания» отдельных моделей (транскрипция-LLM-TTS) к нативной потоковой модели меняет пользовательский опыт.
  • Инженерное преимущество: Освойте работу с WebSocket для реализации двусторонней связи, что критически важно для создания «живых» голосовых интерфейсов.
  • Экономическая эффективность: Научитесь внедрять кэширование промптов, позволяющее снизить затраты на использование аудио-API до 80%.
7 тезисов 4 задания 5 цитат ⏱ 17 мин чтения 🎯 7 тезисов
YouTube Транскрипт Сохранить
Поделиться: TG WA VK X

Для AI-агентов и LLM

Экстракт доступен в структурированном Markdown. Скачать .md · JSON API · Site index

💡 Ключевые тезисы (7)

1 Перейдите на нативную модель #
Откажитесь от «сшивания» отдельных моделей для транскрипции, обработки и синтеза речи. Переход на модель с нативным пониманием звука сокращает задержки и позволяет ИИ слышать нюансы голоса без потери качества.
2 Используйте WebSocket для потоковой передачи #
Настройте постоянное двустороннее соединение для потоковой передачи аудиоданных в реальном времени. Это обеспечит бесшовный обмен событиями между клиентом и сервером без лишних HTTP-запросов.
3 Реализуйте обработку прерываний #
Настройте логику прерывания текущего аудиовывода при обнаружении начала речи пользователя. Используйте события API, чтобы сообщать модели, на каком моменте воспроизведение было остановлено.
4 Интегрируйте Function Calling #
Подключите внешние инструменты, такие как получение данных о местоположении или визуализация графиков. Это превращает пассивного голосового бота в активного ассистента, взаимодействующего с интерфейсом приложения.
5 Оптимизируйте стоимость с помощью кэширования #
Применяйте кэширование промптов для текста и аудио. Это снижает расходы на API до 80% для повторяющихся данных, обеспечивая экономическую эффективность при масштабировании.
6 Стримингуйте параметры инструментов #
Передавайте аргументы функций потоково, если они являются объемными массивами данных. Это позволяет приложению реагировать на данные до завершения полной генерации ответа моделью.
7 Настраивайте тон через системные сообщения #
Управляйте эмоциональной окраской голоса ассистента с помощью системных инструкций. Это позволяет персонализировать опыт взаимодействия под конкретный сценарий использования.

Методическое руководство: Разработка мультимодальных приложений с Realtime API

🗺 Карта навыков

Навык Уровень Цель
Работа с WebSocket Средний Поддержание непрерывного потока данных
Управление прерываниями Продвинутый Создание естественного диалогового ритма
Интеграция функций (Function Calling) Средний Связь ИИ с внешними API и визуализациями
Оптимизация затрат (Кэширование) Начальный Снижение стоимости API-вызовов

1. Отказ от «сшивания» моделей: Переход к нативности

Введение в архитектуру Realtime API начинается с понимания фундаментального сдвига в парадигме разработки. До недавнего времени создание голосового ассистента напоминало сборку конструктора из несовместимых деталей. Разработчику приходилось самостоятельно связывать три совершенно разных звена: сервис транскрипции (например, Whisper), языковую модель (GPT-4) и систему синтеза речи (TTS). Этот подход не только создавал высокую нагрузку на инфраструктуру из-за необходимости постоянного обмена HTTP-запросами, но и драматически снижал качество пользовательского опыта. Основная проблема заключалась в «потере нюансов». Когда вы передаете голос в транскриптор, он превращается в «сухой» текст, лишенный интонаций, пауз и эмоциональной окраски. В результате модель «не слышит» собеседника, а лишь читает его слова.

Марк и Ката наглядно продемонстрировали этот разрыв. В их примере с «неловким» ожиданием ответа на запрос об отмене отправки письма, система работала последовательно: сначала запись, потом транскрипция, затем генерация текста, и только в конце — синтез речи. Такая цепочка неизбежно создает задержку, которая для человеческого уха кажется вечностью. Напротив, нативная модель, которую используют в Realtime API, работает как единый нейронный контур. Она воспринимает аудиосигнал напрямую, интерпретируя его как аудио, а не как символы. Это позволяет системе мгновенно реагировать на любые изменения в голосе пользователя, будь то вопрос, уточнение или прерывание.

В видео спикеры показывают, как это выглядит на практике: при переходе на нативную модель голос ассистента становится динамичным, отзывчивым и живым. Вы больше не «говорите модели, как звучит вопрос», она слышит его сама. Это позволяет реализовать сложные сценарии, такие как эмоциональная подстройка или понимание контекста через тембр голоса. Переход на нативную модель — это не просто оптимизация производительности, это смена способа общения между человеком и машиной. Как отметила Ката, «мы перешли к единому API с моделью, которая нативно понимает речь». Это означает, что для разработчика упрощается архитектура: вместо поддержки трех разных сервисов вы подключаетесь к одному потоку событий, который управляет всем циклом взаимодействия.

Цитата из видео: «Раньше единственный способ создать голосовое взаимодействие — это сшивать разные модели вместе. Вы должны выполнить несколько шагов, соединить эти системы, и процесс становится медленным, к тому же он не может достаточно быстро реагировать, чтобы позволить естественное прерывание».

Сделайте сейчас: Проведите аудит своего текущего или планируемого приложения. Посчитайте, сколько «ходов» (HTTP-запросов) совершает ваш текущий стек для одного ответа. Если их более двух, составьте схему перехода на WebSocket-соединение с Realtime API, заменив текущий каскад вызовов на единый поток input_audio_buffer и response.audio.delta.

2. Реализация WebSocket для потоковой передачи данных

Ключ к «живости» голосового интерфейса лежит в использовании протокола WebSocket. В отличие от стандартного HTTP, который предполагает модель «запрос-ответ», WebSocket обеспечивает постоянное двустороннее соединение (full-duplex). Это означает, что сервер и клиент могут отправлять данные одновременно, не дожидаясь завершения предыдущей операции. В контексте Realtime API это критически важно: когда пользователь начинает говорить, его голос должен передаваться небольшими чанками (кусками аудиоданных) в режиме реального времени. Система не ждет окончания фразы, чтобы начать обработку — она «слушает» в процессе.

Марк в процессе лайв-кодинга показал, как инициализируется такое соединение. Весь процесс сводится к созданию объекта WebSocket, который направляется на эндпоинт v1/realtime. Важным нюансом является передача API-ключа через кастомные заголовки. Как только соединение установлено, основной задачей разработчика становится обработка событий. API присылает данные в формате JSON, где каждый тип сообщения (например, response.audio.delta) требует специфической обработки. Получая аудио-дельта-сообщения, разработчик должен декодировать их из Base64 и немедленно направлять в буфер воспроизведения (например, через WaveStreamPlayer). Это создает эффект «бесшовности».

Потоковая передача также решает проблему контроля над состоянием диалога. Поскольку соединение остается открытым (stateful), сервер постоянно «помнит» контекст беседы. Когда вы передаете аудио, вы не просто отправляете массив байтов, вы вносите вклад в текущую сессию. Это позволяет приложению реагировать на события, такие как input_audio_buffer.speech_started. Этот сигнал — важнейший инструмент для управления потоком. Когда сервер сообщает, что пользователь начал говорить, ваша задача как разработчика — мгновенно прервать текущее воспроизведение ответа модели, чтобы не «перебивать» человека. Именно здесь кроется та самая магия, которая делает разговор с ИИ похожим на человеческий диалог.

Использование WebSocket также упрощает интеграцию с фронтендом. Вам не нужны сложные библиотеки для управления очередями запросов, так как вся логика упорядочивания лежит на стороне API. Вы просто «льете» аудио в сокет и «слушаете» ответ из него. Это радикально сокращает количество кода, необходимого для создания полноценного голосового ассистента. В видео наглядно показано, что для создания базового работающего прототипа достаточно нескольких десятков строк JavaScript. Потоковая передача — это фундамент, без которого невозможно достичь низкой задержки (low latency), необходимой для комфортного голосового взаимодействия.

Цитата из видео: «Realtime API использует WebSocket, чтобы поддерживать состояние соединения открытым, что является ключом к живости. Пользовательский ввод, включая аудио, может передаваться в API в режиме реального времени, а вывод модели будет транслироваться обратно, как только он будет сгенерирован».

Сделайте сейчас: Настройте простейший клиент на WebSocket, который подключается к эндпоинту v1/realtime. Реализуйте базовый обработчик onMessage, который фильтрует входящие JSON-сообщения и выводит в консоль только те, что имеют тип response.audio.delta. Проверьте стабильность соединения, передав тестовый аудиофайл через input_audio_buffer.append и пронаблюдайте за скоростью получения ответа от сервера.


3. Управление прерываниями: Создание естественного диалогового ритма

В реальном человеческом общении мы никогда не дожидаемся окончания фразы собеседника, чтобы вставить комментарий, задать уточняющий вопрос или просто выразить согласие. Эта динамика, которую мы называем «перебиванием» (interruption), критически важна для ощущения естественности. В архитектуре Realtime API управление прерываниями — это не просто опция, а необходимость, продиктованная скоростью работы модели. Поскольку Realtime API генерирует ответ со скоростью, часто превышающей темп человеческой речи, возникает ситуация, когда модель может продолжать «говорить» уже после того, как пользователь решил её перебить. Марк в своем лайв-кодинге показал, что для решения этой задачи необходимо использовать событийную модель WebSocket.

Основной механизм здесь строится на событии input_audio_buffer.speech_started. Когда клиентский микрофон фиксирует начало речи пользователя, приложение должно мгновенно отправить сигнал на сервер и одновременно остановить воспроизведение текущего аудиопотока на стороне клиента. В видео Марк детально демонстрирует этот процесс: «Когда пользователь начинает говорить, мы должны прервать любой вывод модели, который воспроизводился в динамиках». Важно понимать, что просто «выключить звук» недостаточно. Необходимо отправить на сервер метаданные о том, на каком именно моменте воспроизведения (offset) произошло прерывание. Это позволяет модели не «терять нить» и корректировать контекст следующего ответа, учитывая, что часть информации была пропущена.

Разработчик должен реализовать «петлю обратной связи»: микрофон -> сервер -> анализ прерывания -> команда остановки -> передача offset -> корректировка контекста. Без этой петли диалог превращается в монолог робота, который игнорирует попытки пользователя вступить в разговор, что моментально разрушает иллюзию «живого» общения. Управление прерываниями требует тонкой настройки: если реагировать слишком чувствительно, модель будет «заикаться» от фонового шума; если слишком грубо — пользователь не сможет вставить слово. Марк успешно реализовал это через обработчик onMessage, который при получении события начала речи от клиента отправляет обратно в API текущий ID фрагмента и временную метку.

Цитата из видео: «Чтобы прерывания ощущались естественными, когда пользователь начинает говорить, мы должны остановить воспроизведение аудиовывода модели. Мы отправляем сигнал в API, чтобы модель знала, на каком именно фрагменте мы остановились, что критически важно для поддержания связного контекста диалога».

Сделайте сейчас: Реализуйте в своем коде логику прерывания. Добавьте прослушиватель для события input_audio_buffer.speech_started. Внутри обработчика вызовите метод audioPlayer.stop() и отправьте JSON-сообщение с типом input_audio_buffer.clear и параметрами item_id и content_index, чтобы сбросить буфер воспроизведения на сервере и синхронизировать его с состоянием клиента.

4. Интеграция функций (Function Calling) для активного взаимодействия

Переход от пассивного голосового «болтуна» к активному помощнику, который взаимодействует с миром, происходит через Function Calling. В видео Ката продемонстрировала, как с помощью этой технологии превратить обычный чат в иммерсивное 3D-приложение. Вместо того чтобы просто давать текстовые ответы о планетах Солнечной системы, модель при использовании инструментов может «управлять» визуализацией: подсвечивать объекты, рисовать графики и даже запрашивать внешние данные в реальном времени, например, координаты МКС. Это делает ИИ не просто интерпретатором, а полноправным участником интерфейса приложения.

Работа с функциями в Realtime API строится на регистрации списка инструментов в сессии. Вы описываете структуру функции (название, описание параметров) в JSON-схеме, и модель сама принимает решение, когда её вызвать. Ката показала, что это происходит «на лету». Например, когда пользователь спрашивает про Юпитер, модель не только формирует голосовой ответ, но и активирует инструмент focusPlanet(planetName: 'Jupiter'). На фронтенде это триггерит визуальный переход камеры в 3D-движке. Такой подход создает эффект присутствия и глубокой интеграции ИИ в бизнес-логику приложения. Особенно интересно решение с потоковой передачей аргументов функций: если данных много (например, список лун Плутона), вы можете начинать обработку параметров еще до того, как модель закончит генерацию всего сообщения.

Еще один важный аспект — передача данных в модель. В примере с МКС, приложение вызывает внешний API для получения текущей широты и долготы станции, а затем передает этот результат обратно в модель, чтобы она озвучила его пользователю. Это создает замкнутый цикл: вопрос пользователя -> модель понимает необходимость данных -> вызов инструмента -> получение API-данных -> передача данных в модель -> ответ голосом. Такой процесс делает ассистента «информированным». Разработчику важно помнить, что инструменты должны иметь четкие описания (docstrings), так как модель принимает решение об их вызове, основываясь исключительно на семантическом сходстве запроса пользователя и описания функции.

Цитата из видео: «Не только можно задавать вопросы, но и видеть визуальные взаимодействия на экране. Когда я спросила о конкретной планете, мы автоматически переместились к ней, а когда потребовались данные, появились графики — это и есть истинная мощь инструментов в мультимодальном интерфейсе».

Сделайте сейчас: Определите одну критическую функцию для вашего приложения (например, получение данных о погоде или статусе заказа). Создайте схему JSON-объекта tools и зарегистрируйте её при инициализации сессии. Напишите обработчик для события response.done, который проверяет наличие function_call в ответе модели, исполняет соответствующий код в вашем фронтенде и отправляет результат выполнения функции обратно в сессию через событие conversation.item.create.


5. Экономика масштабирования: Оптимизация через кэширование промптов

При разработке голосовых приложений на базе Realtime API вопрос стоимости становится определяющим фактором масштабируемости. Поскольку потоковая передача аудио требует постоянного обмена данными, расходы могут быстро вырасти, если не учитывать механизмы оптимизации. В видео спикеры подчеркивают важность кэширования (Prompt Caching), которое позволяет существенно сократить бюджеты, особенно при работе с повторяющимися контекстными данными или системными инструкциями. Кэширование работает на уровне API: когда вы отправляете объемные системные промпты или исторические данные диалога, сервер сохраняет их в «горячем» доступе. При повторном обращении модель использует эти данные без необходимости их полной повторной обработки, что снижает нагрузку и стоимость.

Экономия проявляется на двух уровнях: 50% экономии на текстовых промптах и до 80% — на аудиоданных. Представьте приложение для обучения языкам, где ассистент использует неизменный сценарий или обширную базу правил произношения. Без кэширования каждый запрос пользователя сопровождается передачей этих метаданных, что съедает токены и увеличивает цену. С кэшированием вы платите лишь один раз за запись в кэш. Марк отмечает, что для стандартной 15-минутной сессии внедрение кэширования позволяет снизить итоговую стоимость использования API примерно на 30% по сравнению с моментом запуска сервиса. Это делает технологию доступной для коммерческих продуктов с высокой ежедневной аудиторией.

Разработчику важно проектировать архитектуру так, чтобы «тяжелые» статические блоки данных отправлялись в начале сессии или при изменении контекста, максимально используя возможности кэша. Использование кэширования не требует изменения логики WebSocket-сообщений, оно происходит прозрачно на стороне API. Ваша задача — правильно структурировать системные сообщения (system instructions), чтобы они могли попадать в кэш. Например, вместо передачи описания всех правил игры в каждом сообщении, вы единожды отправляете их при установке соединения, а затем ссылаетесь на них в ходе диалога.

Цитата из видео: «Мы внедрили кэширование промптов для текста и аудио, что снижает стоимость на 50% для текста и до 80% для аудио при попадании в кэш. Для типичной 15-минутной беседы это означает экономию в 30% по сравнению с запуском, делая масштабируемые голосовые интерфейсы финансово эффективными».

Сделайте сейчас: Проведите аудит своего системного промпта. Вынесите объемные описания ролей, правил или контекста в начало сессии, чтобы они единожды попали в кэш. Замерьте количество токенов в первом запросе и в последующих 10 запросах с помощью заголовков ответов API (usage statistics), чтобы убедиться, что кэширование работает корректно и объем обрабатываемых данных во втором и последующих запросах значительно ниже.

6. Персонализация взаимодействия: Системные сообщения и эмоциональный тон

Голос — это не только передача информации, но и передача эмоций. В Realtime API управление тоном ассистента осуществляется через системные сообщения (system instructions). Это мощный инструмент для создания уникального «лица» вашего продукта. В видео была продемонстрирована разница между сухим ответом и эмоционально окрашенным диалогом, который учитывает культурный контекст или текущее состояние пользователя. Если ваш ассистент помогает в изучении иностранного языка, системная инструкция может задавать ему роль терпеливого преподавателя, который говорит медленнее и чаще хвалит студента. Если же это игровой персонаж — голос может быть энергичным и неформальным.

Настройка тона через системные сообщения работает в синергии с нативной способностью модели генерировать речь. Вам больше не нужно подбирать параметры синтеза речи (Pitch, Rate, Volume) вручную для каждого предложения. Достаточно описать желаемый стиль в начале сессии: «Ты — бодрый гид по Солнечной системе, говори с энтузиазмом, используй простые метафоры и поощряй любопытство пользователя». Модель сама интерпретирует эти инструкции и адаптирует интонацию, паузы и выбор слов. Это создает эффект «живого» присутствия, о котором упоминали Марк и Ката, цитируя Майю Энджелоу: «Дело не в том, что ты говоришь, а в том, как ты это говоришь».

Важно помнить, что системные сообщения — это база, на которой строится всё дальнейшее взаимодействие. Они должны быть лаконичными, но емкими. Избегайте противоречивых инструкций, так как это может привести к нестабильному поведению модели. Например, если вы одновременно просите модель быть «лаконичной» и «рассказывать детальные истории», это создаст когнитивный диссонанс. Протестируйте несколько вариантов системных промптов, чтобы найти тот, который лучше всего соответствует духу вашего бренда. Помните, что каждое изменение в системном промпте влияет на контекст, который хранится в текущей сессии WebSocket, поэтому лучшие практики рекомендуют настраивать тон в момент инициализации соединения.

Цитата из видео: «Системные сообщения позволяют настраивать эмоции и тон голоса под конкретные нужды вашего приложения. Поскольку модель понимает речь нативно, она способна передавать глубину чувств и нюансы, которые делают взаимодействие естественным и человечным».

Сделайте сейчас: Напишите три варианта системных инструкций для вашего приложения (профессиональный, дружелюбный, юмористический). Поочередно протестируйте их, отправив один и тот же тестовый вопрос. Проанализируйте, как модель меняет выбор слов и эмоциональный окрас ответов. Выберите наиболее подходящий вариант и встройте его в JSON-объект session.update при инициализации вашего WebSocket-соединения.


7. Обработка прерываний: Создание естественного диалога

Одним из главных вызовов при разработке голосовых интерфейсов является имитация человеческой гибкости в общении. В традиционных системах (до появления Realtime API) попытка прервать бота часто приводила к тому, что он продолжал «договаривать» свой текст, игнорируя пользователя, пока не завершит генерацию. Это создает эффект «радиоприемника», который не слышит собеседника, что мгновенно разрушает погружение. В Realtime API эта проблема решена через нативную интеграцию событий управления потоком, таких как input_audio_buffer.speech_started. Когда модель «слышит», что пользователь начал говорить, она мгновенно прекращает генерацию аудио, а фронтенд получает сигнал для немедленной остановки воспроизведения.

Марк в видео подчеркнул важность передачи метаданных при прерывании. Когда вы останавливаете плеер, вы должны отправить обратно в API информацию о том, на какой секунде (смещении) аудиопотока это произошло. Это позволяет модели «понять», что именно успел услышать пользователь, и скорректировать свой следующий ответ с учетом прерванной мысли. Например, если бот начал рассказывать длинную историю о британском музее, а пользователь перебил его вопросом «Где это находится?», модель не просто начинает новый ответ, а контекстуально связывает его с предыдущим фрагментом. Это превращает монолог в живой, динамичный диалог. Разработчикам важно реализовать грамотную логику управления состоянием плеера (audio playback queue), чтобы переключение между «слушанием» и «говорением» было бесшовным и не создавало аудиальных артефактов (щелчков или задержек).

Помимо технической реализации прерывания, критически важным является «ощущение времени». Модель должна реагировать на прерывание практически мгновенно. Использование WebSocket для передачи аудио позволяет минимизировать «мертвое время» между фразами. В коде это реализуется через обработчик событий: при получении speech_started вы не только сбрасываете буфер аудио, но и отправляете сигнал модели, что текущий контекст ответа должен быть обновлен. Это предотвращает возникновение «эха» или наложения голосов, что является частой проблемой при разработке систем с высокой задержкой. Помните, что пользователь ожидает от ИИ такой же реакции, как от человека — умения вовремя замолчать и выслушать аргумент.

Цитата из видео: «Чтобы прерывания ощущались естественными, нам нужно не просто прекратить воспроизведение. Мы должны отправить обратно информацию о том, сколько аудио уже было прослушано, чтобы модель понимала, на каком моменте беседы остановился пользователь, и могла продолжить с того же контекста».

Сделайте сейчас: Реализуйте в вашем фронтенд-плеере логику «Flush». При срабатывании события input_audio_buffer.speech_started немедленно вызывайте метод stop() у вашего аудиоплеера и очищайте очередь аудиоданных. Отправьте JSON-сообщение conversation.item.truncate с указанием item_id и content_index, чтобы модель синхронизировала свои внутренние «воспоминания» о том, что именно было сказано до момента прерывания.

8. Будущее мультимодальности: Потоковая передача аргументов

По мере усложнения задач, которые мы делегируем ИИ, объем передаваемых данных в рамках вызова функций (Function Calling) начинает расти. Когда модель должна вернуть не просто ответ «да» или «нет», а сложный структурированный объект — например, список всех лун Плутона или детализированную таблицу финансовых показателей — обычный подход «дождаться полного ответа и отправить» становится узким местом. В Realtime API реализована возможность стриминга аргументов функций. Это означает, что вы можете начать отображать визуализацию данных или обрабатывать параметры еще до того, как модель закончит формирование всего объекта JSON.

Ката продемонстрировала этот подход на примере списка спутников. Вместо того чтобы заставлять пользователя ждать 3-4 секунды, пока модель «сочинит» полный список, приложение начинает отрисовывать элементы интерфейса по мере их поступления в потоке аргументов. Это создает ощущение мгновенного отклика. С технической точки зрения, модель отправляет аргументы функции частями (delta), и ваш клиентский код должен уметь собирать их «на лету» (incremental parsing). Это особенно актуально для приложений, работающих с 3D-движками или сложными UI-компонентами, где визуальная синхронизация с голосом является ключевым фактором пользовательского опыта.

Разработчикам стоит сфокусироваться на создании идемпотентных функций: то есть таких, выполнение которых можно безопасно перезапускать или дополнять данными без риска нарушения логики приложения. Если вы передаете список объектов, убедитесь, что ваш UI-компонент умеет принимать частичные данные и обновлять состояние без полной перерисовки. Этот подход не только повышает скорость, но и позволяет создавать глубоко интегрированные интерфейсы, где грань между «голосом» и «графикой» стирается. Будущее API заключается в том, чтобы сделать этот процесс прозрачным, позволяя разработчикам фокусироваться на логике приложения, а не на парсинге потоковых JSON-объектов.

Цитата из видео: «Если у вас есть большой массив данных или длинный список параметров, вы можете начинать их обработку в режиме реального времени, пока модель продолжает генерацию. Это позволяет приложению реагировать на контент еще до того, как функция будет окончательно зафиксирована моделью, что радикально меняет пользовательский опыт».

Сделайте сейчас: Настройте обработку событий response.done (или промежуточных delta для function_call). Вместо ожидания завершения вызова функции, создайте парсер, который будет обновлять состояние UI (например, добавлять пункты в список или обновлять значения в графике) при получении каждой новой части аргумента функции. Протестируйте это на функции, которая возвращает длинный список (более 10 элементов).

🏋️ Практикум

  1. Hello World WebSocket: Инициализируйте соединение wss://api.openai.com/v1/realtime с использованием session.update, настроив голос на 'alloy'.
  2. Обработка аудио: Напишите функцию, которая принимает response.audio.delta, декодирует Base64 и подает данные в AudioContext браузера.
  3. Интеграция прерываний: Реализуйте логику прослушивания события input_audio_buffer.speech_started и принудительную очистку текущего аудиопотока.
  4. Function Calling (База): Создайте инструмент getWeather(city: string) и зарегистрируйте его в сессии. Проверьте через console.log, что модель вызывает его при вопросе «Какая погода в Москве?».
  5. Продвинутый Function Calling: Реализуйте поток аргументов для функции, возвращающей список из 20 элементов, с визуализацией каждого элемента по мере поступления.
  6. Оптимизация кэша: Замерьте использование токенов для одного и того же запроса с использованием System Instructions в кэше и без него.

🏋️ Практикум

0 / 4 выполнено

Настройка WebSocket-соединения

⏱ 15 мин 🎯 Цель: Установить связь с Realtime API. Шаги: 1. Откройте WebSocket-соединение с эндпоинтом v1/realtime. 2. Реализуйте обработчик onmessage для приема аудиоданных. 3. Напишите функцию для отправки PCM-аудио с микрофона. ✅ Результат: Работающая базовая передача голоса в обе стороны.

Внедрение механики прерываний

⏱ 10 мин 🎯 Цель: Сделать диалог естественным. Шаги: 1. Подпишитесь на событие input_audio_buffer.speech_started. 2. Добавьте логику остановки текущего аудиопотока. 3. Отправьте смещение (offset) обратно в API. ✅ Результат: Ассистент замолкает, когда пользователь начинает говорить.

Интеграция внешних инструментов (Function Calling)

⏱ 20 мин 🎯 Цель: Добавить динамику в приложение. Шаги: 1. Опишите схему функции (например, получение данных). 2. Настройте обработку вызова функции на стороне клиента. 3. Отправьте результат выполнения обратно в модель. ✅ Результат: Ассистент озвучивает данные из внешнего API.

Тестирование новых голосов

⏱ 5 мин 🎯 Цель: Выбор подходящего тембра. Шаги: 1. Ознакомьтесь с доступными голосами в документации. 2. Переключите параметр voice в настройках сессии. ✅ Результат: Конфигурация приложения с выбранным голосом.
🎉
Все задания выполнены!
Отлично — знания превращены в навыки

💬 Цитаты (5)

«Раньше для создания голосового опыта приходилось объединять разные модели, что делало процесс медленным и лишенным естественных реакций.» #

Объяснение причины необходимости перехода на нативный Realtime API.

«Человеческий голос — самый красивый инструмент, но им сложнее всего владеть. Важно не только то, что вы говорите, но и как вы это говорите.» #

Обоснование важности эмоциональной настройки голоса ИИ.

«Реализация прерываний критически важна: модель должна понимать, когда пользователь перебивает её, чтобы беседа ощущалась живой.» #

Техническая необходимость обработки состояний пользователя.

«Благодаря кэшированию промптов стоимость использования API для аудио снижается на 80%, что делает масштабируемые решения доступнее.» #

Экономическая выгода для разработчиков при построении бизнес-приложений.

«Мы видим это как начало нового поколения продуктов, созданных быть нативно мультимодальными.» #

Видение будущего развития технологий OpenAI.

Читать далее

Мастерство агентной разработки: как превращать идеи в работающие продукты за часы

OpenAI

Мастерство агентной разработки: как превращать идеи в работающие продукты за часы

Питер Штайнбергер

Понравился экстракт?
Подписывайтесь — лучшие материалы каждую неделю.
Telegram Дайджест →

Поделитесь с коллегами

Telegram ВКонтакте X / Twitter
Открыть в Telegram

Экстракт Знаний в Telegram

Экстракты и дистилляты из лучших YouTube-каналов — сразу после публикации.

Подписаться

Дайджест Экстрактов

Лучшие методички за неделю — каждый понедельник