EN

PhoneMic

PhoneMic превращает Android-телефон в микрофон для Windows. Телефон слушает, компьютер принимает звук по Wi-Fi или по USB-кабелю, а Discord, Zoom, OBS и любая другая программа видят его как обычный микрофон. Сопряжение делается один раз, по QR-коду, дальше это одно касание на телефоне.

Похожие приложения уже есть, и подводят они обычно в двух местах: связь через какое-то время отваливается, а чтобы её завести, надо повозиться. PhoneMic сделан вокруг того, чтобы не делать ни того, ни другого.

Телефон и компьютер во время передачи: одна и та же волна с двух сторон

Волна — это кнопка

На экране телефона почти ничего нет. Посередине волна, и она же выключатель: коснулся — микрофон включился, коснулся ещё раз — выключился. На телефоне волна дышит голосом, а в окне на компьютере рисуется по тому звуку, который до компьютера действительно дошёл, — так видно, что связь жива, а не только что телефон что-то слышит.

Точка над волной говорит, что происходит: красная — микрофон выключен, жёлтая — телефон ищет компьютер, голубая — тебя слышно. Внизу островок с сопряжённым компьютером, типом связи и задержкой; на нём же шестерёнка с шумоподавлением и кнопка QR, чтобы сопрячь другой компьютер.

Выключен, подключение, в эфире: волна из тусклой нити становится лентой

Волна — не анимация из файла, а одна закрученная лента из тридцати четырёх тонких линий. Каждая линия смешивает две формы волны, cos θ · f(x) + sin θ · g(x), и θ шагает поперёк пучка. Где обе формы проходят через ноль, линии стягиваются в узел, в остальных местах расходятся веером — отсюда объём. Всё это рисуется дважды, сложением цвета: широко и бледно для свечения, потом тонко и ярко. Выключенная, лента схлопывается в тусклую нить, пока идёт подключение — дышит.

Оба приложения чисто чёрные: на OLED-экране чёрный пиксель не светится вовсе.

Две дороги

По Wi-Fi звук идёт по UDP, пакетами по 10 мс, по одному пакету на датаграмму. По USB — по TCP через adb reverse, и телефон стучится на 127.0.0.1. Для кабеля хватает включённой отладки по USB: программа на компьютере сама пробрасывает порт для каждого подключённого телефона и чинит проброс, если какая-нибудь другая программа перезапустила adb-сервер.

Телефон всегда сначала пробует кабель. Выдернул кабель — поток сразу уходит на Wi-Fi. Вставил обратно — через несколько секунд, когда понятно, что кабель остаётся на месте, возвращается на USB. Микрофон между этим не выключается.

Компьютер в сети телефон ищет по всем адресам, которые были в QR-коде, а если ни один не ответил — широковещательным приветствием. Роутер выдал компьютеру новый IP — сопряжение от этого не ломается.

Чтобы связь не умирала вместе с экраном, запись идёт в фоновом сервисе с блокировками сна и Wi-Fi: Android не может ни заглушить приложение, ни усыпить радио. Если связь всё-таки оборвалась, обе стороны поднимают её сами. Три секунды тишины от другой стороны считаются обрывом, и телефон снова начинает здороваться, пока не достучится.

По кабелю задержка около 30 мс, по Wi-Fi — 50–100.

Буфер

Wi-Fi доставляет пакеты неровно, и вся сложность PhoneMic живёт в буфере на компьютере, который это неровное прячет.

У каждого пакета есть порядковый номер, а значит, известно, когда он пришёл бы в идеальной сети. Самый ранний недавний приход — точка отсчёта, опоздание — на сколько пакет от неё отстал. Точка отсчёта медленно ползёт вверх, на полмиллисекунды в секунду: так телефон, чьи часы идут чуть медленнее компьютерных, не принимается за растущий джиттер.

Худшее опоздание буфер помнит долго, потому что сбои Wi-Fi ходят волнами, но с потолком. Полсекундную паузу вроде сканирования сетей буфером не спрячешь, не сделав запаздывающим каждый звонок, поэтому ей разрешено один раз щёлкнуть.

Разницу между тем, сколько звука в буфере есть и сколько нужно, он добирает так, чтобы не было слышно. Основную работу делают паузы в речи: звука лишнего — тихие куски по 5 мс выбрасываются, не хватает — пауза растягивается на 5 мс. Сигналу без пауз остаётся скорость воспроизведения, которую буфер подгоняет не больше чем на 1%. Если звук всё-таки кончился, он затухает, а не обрывается щелчком.

Режимов три: «Мин. задержка» на 20–40 мс для кабеля или отличного Wi-Fi, «Баланс» по умолчанию, обычно 50–100, и «Надёжный» на 100–150 для забитой или слабой сети.

Проверка без голоса

Протокол записан в документе вместе с точными байтами эталонных пакетов, и обе стороны, Kotlin и C#, проверяют в тестах именно эти байты. Поменяешь формат на одной — тесты упадут на другой.

Буфер гоняется на виртуальных часах против симуляции сети: десять минут плохого Wi-Fi с расходящимися часами проходят за несколько секунд. Для проверки всей цепочки никому не надо говорить в микрофон: в отладочном режиме телефон играет тон 1 кГц, а probe записывает то, что выходит из виртуального кабеля, и сообщает частоту, уровень и пропуски.

Взять себе

Windows не умеет превращать звук программы в микрофон без драйвера, поэтому PhoneMic выводит звук в VB-Audio Virtual Cable — бесплатное виртуальное аудиоустройство. Его второй конец, CABLE Output, и есть микрофон, который выбирается в Discord, Zoom или OBS.

Приложение лежит на GitHub под MIT, сборки — в последнем релизе: .apk для телефона и .exe для компьютера. Нужны Windows 10 или 11 с VB-Audio Virtual Cable и Android 8.0 с сервисами Google Play — для встроенного сканера QR. Для Wi-Fi телефон и компьютер должны быть в одной сети, для кабеля — отладка по USB на телефоне и adb на компьютере.

Первый запуск: телефон предлагает отсканировать QR-код, программа на компьютере его показывает

Ни аккаунта, ни облака, ни аналитики: звук идёт с телефона прямо на компьютер. Шифрования нет — код в QR не даёт чужим устройствам случайно влезть в микрофон, но от того, кто слушает сеть нарочно, не защищает. В чужой сети — кабель.

01.10.2026