AI-системы
Debrief
Приватный репозиторий — показана публично согласованная частьПротокол созвона из двух дорожек вместо диаризации
- 15 мс
- дрейф дорожек за 12 с
- 9.9×
- быстрее реального времени
- 35
- тестов
Проблема
Стандартный путь — записать созвон одним смешанным потоком и потом разделить голоса диаризацией. Это вероятностный шаг, и ошибается он ровно там, где дороже всего: на перебиваниях и коротких репликах, из которых и состоят договорённости.
Система
Микрофон и системный вывод пишутся двумя независимыми потоками WASAPI в два файла с общим нулём времени, поэтому спикер известен по источнику дорожки, а не по похожести голоса. Взамен появляется акустическое эхо: при звуке в колонках фраза собеседника попадает в обе дорожки. Эхо-фильтр требует одновременно перекрытия по времени и текстуальной похожести — перекрытие без похожести это обычное перебивание, и терять его нельзя. Распознавание локальное, поэтому запись не покидает машину и час разговора стоит ноль. Протокол собирается через structured outputs с валидацией схемы на стороне API, а не парсингом markdown из ответа.
Роль
Соло-разработка: архитектура захвата, ядро слияния дорожек, схема разбора.
Результат
Прогон на живом железе вскрыл то, чего не показали тесты. WASAPI loopback молчит буквально: пока через устройство вывода ничего не играет, поток не отдаёт буферов вообще, и дорожка собеседника получалась длиной в один WAV-заголовок — реплика с третьей минуты легла бы в позицию 0, и общая ось времени существовала только на бумаге. Пропуски теперь добиваются тишиной по монотонным часам: на живой записи дорожки расходятся на 15 мс за 12 секунд. Там же выяснилось, что дефолтный выбор устройства падал из коробки — видеокарта видна через драйвер, а считает через cuBLAS, который ставится отдельно, причём конструктор модели проходит молча и падает первое вычисление. Устройства перебираются по плану с прогревом на секунде тишины. 35 тестов, 9.9× реального времени на 12 ядрах; сбой разбора больше не уносит с собой запись.