Поддержка Gemini 3.1 Flash Live + MiniCPM-o 4.5 vLLM Challenge — История разработки S2S Real-time Voice AI в Naia OS С тех пор я долго не мог публиковать обновления.
За это время произошло много событий. Nextain взяла на себя управление корейским христианским порталом (www.onmam.com) и обсуждала поддержку применения ИИ, а также была выбрана для участия в государственном проекте в Корее, что придало импульс развитию сервиса Naia. Похоже, мы сможем представить настоящие аватары Naia, а не стандартные аватары Vroid Hub.
В конце предыдущей статьи я писал, что на следующей неделе одолжу видеокарты, и ситуация, вероятно, станет проще. И вот теперь я смог сдержать это обещание. В среде с двумя RTX 3090 мы завершили первичную проверку работы MiniCPM-o 4.5, портированного на vLLM-omni и подключенного к клиенту Naia, включая живое англоязычное общение с аудиореференсом (клонирование голоса).
Кстати, мы первые, кто портировал MiniCPM-o 4.5 на vLLM-omni, и за рубежом тоже интересуются, насколько далеко мы продвинулись. В upstream > #1182 была попытка другого человека, но она не была объединена, и мы также работали по отдельному направлению. Мы достигли уровня, когда это достаточно хорошо работает, и сейчас находимся на стадии доработки до уровня, который примут мейнтейнеры upstream.
Почему MiniCPM-o 4.5 был целью?
Как я уже писал в предыдущей статье, MiniCPM-o 4.5 фактически является единственной омни-моделью, которую можно запустить на персональном RTX 3090, и которая одновременно поддерживает аудиореференс (клонирование голоса) и тонкую настройку.
- GPT-4o / Gemini Live — Только для облака, веса не раскрываются, тонкая настройка невозможна
- Moshi — Открытый исходный код, отличный полнодуплексный режим, но в основном английский/французский + неактивное сообщество
- Qwen3-Omni-30B — 30B, поэтому без квантования не помещается в одну 24 ГБ карту, а при квантовании голосовой вывод искажается
- MiniCPM-o 4.5 — 9B (комбинация Whisper-medium + Qwen3-8B + CosyVoice2 + SigLip2), работает на одной 24 ГБ карте, клонирование голоса с аудиореференсом, и возможна тонкая настройка
Однако отсутствие поддержки корейского языка пока является недостатком, и это то, куда мы можем внести свой вклад. Поэтому на этом AI-чемпионате мы подали заявку на выполнение тонкой настройки vLLM-omni для корейского языка и создание сервиса витуберов с использованием Naia-Memory под названием команды "Я помню тебя". Мы не смогли подать заявку в категорию 'отечественные', так как у нас не было омни-модели желаемого уровня.
"Разве не каждый хотел бы иметь AI-витубера, который помнит вас и говорит вашим голосом на вашем ПК?" Чтобы это стало возможным, мы считаем, что необходимы следующие технологии, и сосредоточены на них:
- Омни-модель, работающая локально — Не пайплайн STT/LLM/TTS, а сквозная речь-в-речь. Пайплайн-подход имеет слишком большие кумулятивные задержки и потери интонации. → MiniCPM-o 4.5
- Аудиореференс (клонирование голоса) — "Говори этим голосом" — один раз услышав, модель общается с этим тембром. → Клонирование на основе spk_emb CosyVoice2
- Долгосрочная память — Система памяти, которая не сбрасывается с каждой сессией и помнит пользователя. → Naia Memory, которую мы разрабатываем отдельно (4-уровневая система памяти, вдохновленная нейронауками)
- Корейский язык — Вышеуказанные три должны работать на корейском для повседневного использования. → Тонкая настройка CosyVoice2 для корейского языка (данные AIHub получены, немедленно приступим при поддержке GPU)
Кроме того, есть еще одно направление, которое мы скоро представим. naia-sing — думаю, по названию вы уже догадались, что это. Ждите с нетерпением. Ниже представлены реальные демонстрации работы и дополнительная техническая информация.
Демо 1 — Разговор в клиенте Naia
Прошу прощения за мой не очень хороший английский в демонстрационном видео.
Это видео демонстрирует тестирование диалога после портирования MiniCPM 4.5-o на vllm-omni и подключения к настольному приложению Naia. Аппаратное обеспечение: RTX-3090 ×2 (2-way), bf16 без квантования. Как и ожидается от омни-модели (S2S, сквозная речь-в-речь), демонстрируется плавный ход беседы и естественное выражение эмоций. В настоящее время поддерживаются английский и китайский языки.
Демо 2 — Демо-страница MiniCPM-o + Аудиореференс
Это форк официальной демонстрационной страницы MiniCPM-o 4.5, подключенный к бэкенду vllm-omni. Он включает пример работы аудиореференса (клонирования голоса). При загрузке WAV-файла ответ синтезируется с тембром и интонацией этого голоса. На стороне сервера используется LRU-кеш с SHA-256 ключами, чтобы избежать повторных вычислений для одинаковых референсов, поэтому после первого ответа дополнительных накладных расходов почти нет.
Сводка по реализации
Работа велась в трех репозиториях.
| Репозиторий | Роль |
|---|---|
nextain/vllm-omni | Форк vllm-omni — модуль модели MiniCPM-o 4.5 + 3-стадийный пайплайн Thinker→Talker→Code2Wav + добавление клонирования голоса (session.update.ref_audio) |
nextain/MiniCPM-o-Demo-forvLLM-omni | Форк официальной демонстрации PyTorch — добавлен режим backend=vllm_omni, возможность прямого ввода/проверки URL vllm-omni на странице audio-duplex |
nextain/naia-os | Настольное приложение Naia — добавлено поле MiniCpmOConfig.refAudio первого класса, AudioContext → 16 кГц моно → кодировщик base64 WAV в браузере (Tauri WebView) |
Клиент Naia напрямую подключается к /v1/realtime (совместимому с OpenAI Realtime API) vllm-omni, минуя демонстрационный шлюз. Через WebSocket передается аудио PCM16 16 кГц, а в ответ принимается моно аудио PCM16 24 кГц. Вся работа выполнялась с помощью Claude Code. Это включает код модели, YAML-конфигурацию стадий, stage_input_processor, прокси бэкенда демонстрации, TypeScript-клиент Naia + WAV-кодировщик + vitest.
- Naia находится в процессе полной переработки. Часть Naia-os, вероятно, станет структурой с бэкендом в виде гибкого CLI с naia-agent и будет объединена с Naia-memory и Naia-ADK.
Но "AI slop" все еще присутствует
В предыдущей статье я писал, что "цель этой работы — реализация AI-native Opensource экосистемы, эксперимент, который позволит ИИ корректно вносить вклад в открытый исходный код без "AI slop" (небрежности ИИ)". И сейчас это самая сложная часть, и после финальной проверки снова выявились проблемы. Однако я хотел поделиться этим как можно скорее, поэтому написал этот пост до решения этих проблем.
За последние несколько дней я четыре раза запускал других AI-агентов в качестве враждебных рецензентов. В первом раунде было 2 BLOCKER + 13 MAJOR. Один из них был откровенной ложью, например: "Пример клиента не работает — бэкенд основан на аудиовходе, но написан как текстовый". Во втором раунде 1 MAJOR (пример использовал audioop из stdlib, удаленный в Python 3.13). В третьем и четвертом раундах — чистый проход. Наши правила (2 последовательных чистых прохода) были соблюдены. Но на этом я не остановился и запустил еще раз с точки зрения мейнтейнера vllm-project, и проблемы все еще остаются.
- 3 BLOCKER:
- Изменение сквозного инварианта (whitelist→blacklist) в
chunk_transfer_adapter.pyдля функциональности одной модели prompt_len_overrideпредназначен только для MiniCPM-o, но находится в общей инфраструктуре- Сайд-канал
chat_template_kwargs.ref_audioнарушает слои — рядом есть прецедент поля первого класса
- Изменение сквозного инварианта (whitelist→blacklist) в
- 5 MAJOR + 8 MINOR
Внутренние правила пройдены, но по критериям внешних мейнтейнеров слияние не произойдет в первом раунде. Кроме того, upstream/main снова обновился после merge-base нашего форка, и работы по слиянию продолжаются.
Следующие шаги
- Исправление BLOCKER/MAJOR с точки зрения upstream — в процессе
- Слияние upstream/main + разрешение конфликтов — скоро
- Подача PR — после завершения вышеуказанных двух. Решение о едином PR или разделении на 2 PR (модуль модели / клонирование голоса) пока отложено
- Тонкая настройка для корейского языка — сама модель. Самым большим препятствием является то, что CosyVoice2 (основа Code2Wav) не обучался на корейском языке. В настоящее время генерация корейского текста работает нормально, но синтез речи звучит искаженно.
Я продолжу систематизировать и делиться дальнейшей работой. Мы покажем, что ИИ тоже может вносить вклад в открытый исходный код. Комментарии и GitHub Issue приветствуются.
Репозитории
Naia: https://naia.nextain.io