podcast-generation
Этот навык Microsoft предназначен для сценариев, где текст нужно превратить в настоящее podcast-style аудио через Azure OpenAI Realtime API. В качестве модели в исходном workflow используется GPT Realtime Mini, а обмен с Realtime API идёт по WebSocket. Карточка полезна для full-stack реализации: источник описывает React-интерфейс, Python backend на FastAPI, потоковую передачу событий и возврат готового WAV во frontend. Это не отдельный аудиоредактор и не универсальный конвейер публикации подкастов: его задача — показать проверяемый путь от текстового prompt до аудиопотока, транскрипта и воспроизводимого файла. Перед запуском требуется подготовить три значения окружения: ключ Azure OpenAI Realtime API, базовый endpoint ресурса Azure и deployment с именем gpt-realtime-mini. Endpoint должен быть адресом ресурса без суффикса /openai/v1/; этот путь добавляется при формировании WebSocket-адреса. Backend преобразует HTTPS-схему в WSS, добавляет /openai/v1 и создаёт асинхронный клиент OpenAI с websocket_base_url и API key. После этого realtime-соединение открывается для модели gpt-realtime-mini. Такое разделение важно для диагностики: ошибочный deployment, endpoint с лишним путём или отсутствующий ключ остановит соединение до этапа генерации, поэтому значения следует проверять на границе серверной конфигурации и не передавать секрет во frontend. Основной поток начинается с обновления сессии. В неё передаётся режим вывода только audio и инструкция для диктора, например просьба говорить естественно. Затем backend создаёт пользовательское сообщение с типом input_text и текстом, который нужно озвучить, после чего запрашивает ответ. Поток событий читается до response.done. События response.output_audio.delta содержат base64-фрагменты аудио; их нужно декодировать и последовательно собрать в массив PCM-чанков. События response.output_audio_transcript.delta дают части транскрипта, поэтому приложение может одновременно сохранить текстовую расшифровку или показать её интерфейсу. Обработчик error должен остановить workflow и вывести сообщение события, а не считать незавершённый поток готовым результатом. Полученный звук в примере имеет формат PCM: частота 24 кГц, 16 бит и моно. Эти байты нельзя безоговорочно отдавать как WAV: сначала их собирают в единый буфер, затем преобразуют в WAV с помощью предусмотренного в репозитории скрипта pcm_to_wav.py или эквивалентной функции конвертации. После конвертации backend возвращает аудиоданные, а React-интерфейс превращает base64 в Uint8Array, создаёт Blob с MIME-типом audio/wav и получает object URL для воспроизведения через Audio. Object URL следует освобождать по жизненному циклу интерфейса; сам навык показывает минимальную схему воспроизведения, а не готовую библиотеку управления плейлистом. В источнике перечислены голоса alloy, echo, fable, onyx, nova и shimmer с краткими характеристиками: нейтральный, тёплый, выразительный, глубокий, дружелюбный и ясный. Это позволяет вынести выбор голоса в настройки narrative-плеера, но конкретный голос должен быть согласован с поддерживаемой конфигурацией Realtime-сессии, а не выдуман на уровне UI. Практические сценарии — озвучивание статьи или заметки, генерация аудионарратива для страницы, потоковое получение аудио и транскрипта в web-приложении, а также прототипирование podcast-style функции с React и FastAPI. Во всех этих случаях текст остаётся входом, WebSocket — транспортом потоковых событий, PCM — промежуточным форматом, а WAV — форматом выдачи, удобным для браузерного проигрывания. Ограничения следуют из самого workflow. Нужны рабочие Azure OpenAI credentials, корректный endpoint и deployment; без них источник не обещает локальную генерацию. Backend обязан собирать несколько аудиособытий и ждать response.done, иначе результат может быть обрезан. Транскрипт приходит отдельными дельтами и также требует сборки. В описанном примере нет готовых механизмов авторизации пользователей, квот, повторных попыток, хранения файлов, модерации текста, фоновой очереди или контроля расходов — их нельзя считать встроенными возможностями навыка. Перед публикацией внешнего сервиса нужно отдельно решить эти вопросы и определить, где хранятся ключи. Исходник также отсылает к отдельным материалам architecture.md, code-examples.md и pcm_to_wav.py, поэтому перед реализацией нестандартного формата следует прочитать соответствующие файлы, а не расширять минимальный пример догадками.
Для чего подходит
- Генерация podcast-style аудио из текста
- Подключение Azure OpenAI Realtime API по WebSocket
- Потоковая передача аудио и транскрипта в web-приложение
Установка
Сначала прочитайте SKILL.md и scripts в исходном репозитории. Затем выполните команду в каталоге проекта:
npx skills add https://github.com/microsoft/skills/tree/main/.github/skills/podcast-generation