К содержимому
Ricklayer
RUEN
← Все кейсы

05 · AI-ассистент реального времени для созвонов

Copilot

AI-ассистент реального времени для созвонов

macOSWindows

Десктопное приложение для собеседований и созвонов: слушает разговор, распознает речь прямо на устройстве и за доли секунды подсказывает ответ. Собеседник его не увидит: Copilot не попадает в демонстрацию экрана и на скриншоты, у него нет значка ни в Dock, ни в трее. Распознавание в 40 раз быстрее: 86 мс на реплику вместо 3,5 с. За 2,5 месяца сделаны приложения под macOS и Windows, сайт с оплатой, бэкенд лицензий и туннель до LLM.

Островок у выреза

Пока Copilot слушает, под вырезом горит только зеленая полоска. Наведите курсор, и островок раскроется: живая речь собеседника, вопрос и ответ потоком. Собеседник островка не видит: справа в окне созвона его демонстрация, и островка на ней нет.

Интерфейс повторяет приложение по его исходному коду, MacBook собран и отрендерен нами в Blender

Длина ответа

Как Copilot понимает разговор

Распознать слова мало. Copilot режет речь на фразы, узнает голоса, отсеивает шум и помнит ход разговора, поэтому подсказка приходит на вопрос, а не на «угу», и звучит от вашего лица.

Пороги и правила из кода приложения, фразы для примера

Один вопрос сквозь систему

пример: фразы и время условные, пороги из кода · 0:00.00

Звук
Детектор речи
0,5 спорог 0,5
Распознавание
1234✓
Голос
Фильтр
Память
Ответ
01234567

Интервьюер

Подсказка

01Речь по фразам

Детектор режет звук на фразы и берет полсекунды до начала, чтобы не потерять первое слово.

02Чей это голос

Фраза относится к голосу по отпечатку. Короткий кусок лучше оставить без метки, чем приписать чужому.

03Вопрос или шум

Поддакивания, обрывки и галлюцинации распознавания отсеиваются до модели.

04Память разговора

В запрос идет ход беседы по объему, а не по числу реплик.

05Ответ от вашего лица

По профилю и вакансии, без выдуманных фактов. Первую мысль можно говорить сразу.

Под macOS и Windows

Логика одна, а стек на каждой системе свой: каждая версия опирается на сильную сторону своего железа. Сайт и сервер общие.

macOS

Swift · SwiftUI · AppKit · WhisperKit · FluidAudio · Core Audio

  • Распознавание WhisperKit на Neural Engine: быстро и без видеокарты
  • Звук собеседника через Core Audio process tap из любого клиента созвонов
  • Островок у выреза и отдельное окно, оба скрыты от захвата экрана
  • Нет значка в Dock и в строке меню

Windows

C# · .NET 10 · WPF · NAudio · Python · faster-whisper

  • faster-whisper на видеокарте отдельным процессом, без нее встроенный whisper.cpp на процессоре
  • Звук собеседника через WASAPI loopback, микрофон по желанию
  • Окно исключено из захвата экрана системным флагом Windows
  • Нет кнопки на панели задач и значка в трее, установщик на Inno Setup

Сайт и сервер

Node.js · SQLite · nginx · systemd · SOCKS-туннель

  • Сайт продукта: тарифы, оплата, ключ сразу после покупки, загрузка под обе системы
  • Бэкенд лицензий: ключ LLM только на сервере, расход по реальным токенам
  • Туннель до зарубежного узла: провайдеры LLM не отвечают серверу в РФ
  • Админка для выдачи и отключения ключей

Лицензия и данные

Лицензия нужна, чтобы улучшать продукт у всех сразу и управлять доступом. При этом разговор остается вашим: звук не покидает устройство, а текст не хранится на сервере, и владельцы его не видят.

Маршрут запроса и поля базы из кода бэкенда, ключ и числа для примера

01 / 05АктивацияПриложение проверяет ключ на нашем сервере и показывает тариф и остаток ответов.

Ваше устройство

ICP-7F3A-9C1D-····

Активировать

Наш сервер лицензий

ключ найден

Стандарт · осталось 250 ответов

Модель

ждет запроса

Куда растет Copilot

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

Вектор развития: этого еще нет в текущей версии

01 / 04Видит экранСобеседник включил демонстрацию с задачей. Copilot читает ее с экрана так же, как сейчас слышит голос.

Демонстрация экрана · Интервьюер

Задача 2

Дан массив чисел nums и число target.

Верните индексы двух чисел, сумма которых равна target.

[2, 7, 11, 15], 9 → [0, 1] [3, 2, 4], 6 → [1, 2] [3, 3], 6 → [0, 1]

def two_sum(nums, target):
    # ваш код

Copilot

Читаю экран

Задача: два числа с суммой target · Python

Задача

Подсказка в разговоре полезна, только если приходит сразу. Облачное распознавание добавляет задержку и отправляет чужой голос наружу.

Задача: распознавать речь локально, отвечать быстрее, чем собеседник закончит мысль, и не держать ключ LLM в приложении.

Подсказку видит только владелец: окна нет ни в демонстрации экрана, ни на скриншоте, ни в Dock, ни в трее. И все это на двух системах, под каждую свой стек, с гибкой настройкой под человека и конкретный созвон.

Срез по слоям

Интерфейспиксель
Панель у выреза экрана, которая разворачивается стеклянным островком, или отдельное окно. Оба не видны при демонстрации экрана
Логикаденьги и правила
Сегментация речи, живой текст фразы, различение голосов, подсказка потоком
Данныесхема и миграции
Профиль и контекст на устройстве, лицензии и расход в изолированной базе бэкенда
Сервервыкладка и эксплуатация
Сайт с оплатой и выдачей ключей, бэкенд лицензий за nginx, SOCKS-туннель до зарубежного узла, инсталляторы под обе платформы
Безопасностьядро
Ключ LLM только на сервере, служба не от root в песочнице, аудио не покидает устройство

Распознавание в 40 раз быстрее

На Windows реплика в 3 секунды распознавалась 3,5 секунды: движок на процессоре всегда обрабатывает 30-секундное окно.

  1. 01faster-whisper вынесен на видеокарту отдельным процессом, приложение общается с ним по IPC и поднимает его само
  2. 02Нет Python или видеокарты: тихий откат на встроенный движок без потери функций, внизу окна индикатор GPU или CPU
  3. 03Проверены и отброшены тупики: CUDA-рантайм требует установленный CUDA Toolkit, Vulkan-рантайм втрое медленнее процессора
  4. 04На macOS WhisperKit работает на Neural Engine

Итог

Та же реплика распознается за 86 мс.

Живой текст без обрывков

Фраза появляется на экране, пока человек говорит, и не склеивается из кусков.

  1. 01Фраза пересчитывается окном с начала каждые 0,8 с новой речи, полсекунды до начала речи сохраняются, чтобы не потерять первое слово
  2. 02Начало длинной фразы закрепляется и дальше не пересчитывается
  3. 03Нейросетевой детектор речи и голосовые отпечатки различают собеседников, порог мягче из-за сжатия звука в созвоне

Интерфейс у выреза экрана

В покое панель не видна, при наведении разворачивается стеклянным островком.

  1. 01Системный звук на macOS снимается через Core Audio process tap: другие пути отдают тишину
  2. 02Окно видно только владельцу: на macOS его исключает из захвата sharingType, на Windows флаг WDA_EXCLUDEFROMCAPTURE, поэтому его нет ни в демонстрации, ни в записи, ни на скриншотах
  3. 03Нет значка в Dock и строке меню на macOS, нет кнопки на панели задач и значка в трее на Windows
  4. 04Ответ занимает все свободное место, история свернута в тонкую полосу, пустые поля объясняют себя текстом

Сайт, лицензии и туннель

Приложение не знает ключ LLM: каждый запрос идет через свой бэкенд с проверкой лицензии и учетом расхода. Вокруг него сайт, где продукт покупают и скачивают.

  1. 01Сайт продукта: три тарифа, оплата, ключ приходит сразу после покупки по вебхуку, загрузка под macOS и Windows
  2. 02Админка: выдача ключей вручную и отключение лицензий
  3. 03Тарифы по числу ответов, метринг по реальным токенам провайдера
  4. 04Служба слушает только петлю за nginx и работает от отдельного пользователя в песочнице systemd
  5. 05Сервер в РФ заблокирован LLM-провайдерами: запросы идут SOCKS-туннелем на Амстердам со строгой проверкой ключа хоста
  6. 06Текст запроса идет к модели транзитом: в базе только ключ, тариф и расход токенов, разговор не пишется ни в базу, ни в журнал

Гибкая настройка

Copilot подстраивается под человека и под конкретный созвон: где стоять на экране, какой длины отвечать, от чьего лица говорить.

  1. 01Где показывать: отдельное окно, островок у выреза или оба сразу, островок можно закрепить раскрытым
  2. 02Длина ответа по умолчанию: кратко, обычно или подробно, а у каждого ответа кнопки «короче», «подробнее», «пример»
  3. 03Поле «О себе» и описание вакансии: ответы звучат от лица кандидата и под стек компании
  4. 04Голосам даются имена: вместо «Голос 1» в подсказке стоит «Интервьюер»
  5. 05Горячие клавиши работают, пока в фокусе окно созвона: слушать, короче, листать ответы, размер шрифта
  6. 06На Windows выбор модели распознавания и языка, микрофон включается отдельно

Понимание контекста

Подсказка полезна, только если попадает в вопрос. Между распознаванием и моделью стоит свой слой понимания: чья реплика, вопрос ли это, что уже сказано.

  1. 01Голоса различаются по отпечаткам: уверенное совпадение, мягкое для коротких кусков, новый человек только после 2,5 секунды чистой речи и не больше четырех на созвоне
  2. 02Поддакивания, обрывки и галлюцинации распознавания вроде «спасибо за просмотр» не доходят до модели
  3. 03Память разговора считается по объему, около 8000 знаков, и видит фразу, которую еще договаривают
  4. 04Инструкция требует отвечать от первого лица и только по реальному опыту из профиля, без выдуманных фактов и цифр
  5. 05Первая мысль ответа выделена отдельно: ее начинают говорить, пока дочитывается остальное
  6. 06Профиль кэшируется у провайдера модели, повторные запросы в сессии дешевле

Куда развиваем

Следующая версия видит экран и умеет действовать, а решение остается за человеком: каждое действие ждет его разрешения.

  1. 01Зрение: читает то, что собеседник показывает в демонстрации, так же, как сейчас слышит голос
  2. 02Задача на экране: понимает условие, предлагает решение под стек кандидата и объясняет ход мысли
  3. 03Действия: запуск кода в нужной среде, открытие файла, ввод в редактор, каждое только после «разрешить»
  4. 04Правило приватности то же, что сейчас: экран разбирается для ответа и не хранится на сервере

Истории с прода

Инцидент 01 · открыт

Системный звук, которого нет

Через ScreenCaptureKit системный звук в нужном режиме не приходил вообще.

Инцидент 02 · открыт

Сервис лицензий рядом с чужой базой

Бэкенд жил на том же сервере, что и другой продукт, и работал от root: находка в нем давала доступ к чужим секретам.

Стек

Swift · AppKit · SwiftUI · WhisperKit · Core Audio · C# · .NET 10 · WPF · NAudio · Python · faster-whisper · Node.js · SQLite · OpenRouter