OBS квакал на созвоне, а потом я три часа расшифровывал. Собрал своё за вечер на Mac
У меня по три–пять созвонов в день. Meet, Телемост, ktalk, иногда Zoom, почти всё в браузере. После встречи мне нужен текст: кто что пообещал, какие цифры прозвучали. Иначе через неделю все «да-да, мы договаривались», а ты уже не помнишь, о чём речь.
Писал звонки через OBS с захватом экрана. На самом разговоре начиналось веселье: звук квакал, всё чуть подвисало. Экран для записи мне, как потом дошло, вообще не нужен был. Нужен только звук.
Потом вторая боль. Расшифровку гонял своими скриптами на Python: конвертация, распознавание речи, разметка «кто когда говорил». На созвоне с пятью людьми половину фраз всё равно восстанавливал по памяти. Облачные сервисы вроде Otter снимают ожидание, но запись уезжает на чужой сервер, плюс подписка капает каждый месяц. Мне это не зашло: рабочие созвоны с цифрами и договорённостями не хочется отдавать чужому облаку.
За вечер собрал схему под Mac M4: один mp3 со всеми голосами, нейросеть работает прямо на ноуте, на выходе текст с таймкодами. Час звонка превращается примерно в пять минут работы машины. Платный тут только Audio Hijack: разовая лицензия, без подписки. Скрипты выложил в открытый доступ на GitHub. Ниже расскажу, как всё устроено и где я наступил на грабли.
Запись без OBS
OBS я бросил не из принципа, а потому что на живом звонке квакающий звук дороже любой бесплатности.
Взял Audio Hijack: он ловит звук из Chrome и микрофон в один файл. Для разметки голосов это важно: если писать «микрофон» и «систему» раздельно, автоматика потом не сможет разложить, кто говорил. Сессия простая: Chrome → запись, микрофон → туда же, Chrome → наушники, чтобы слышать собеседника. Галку Automatic Connectors (автосоединение блоков) выключить. Микрофон на выход не вешать, иначе слушаешь сам себя.
Перед звонком жму Run, после звонка Stop и переношу файл в рабочую папку. Бесплатный путь тоже есть: BlackHole плюс любая записывалка, но сводить два потока в один придётся руками. Hijack эту возню снимает.
Пять минут вместо трёх часов
Речь в текст превращает mlx-whisper: та же нейросеть Whisper, только собранная под чипы Apple M-серии, считает на встроенной графике ноута, а не на процессоре. Кто когда говорил, определяет вторая модель, pyannote: она расставляет метки «голос 1», «голос 2» (в файле это SPEAKER_00, SPEAKER_01). Имена она не угадывает; «Саша сказал» подставляю руками по первым репликам.
На той же неделе прогнал два реальных звонка. Рабочий созвон по проекту на 14 минут превратился в текст за пару минут: разобрал его сразу после Stop, задачи на неделю и цифры на месте. Урок по Cursor почти на час машина жевала около пяти минут: запись плотнее, больше пауз. Раньше на такой объём уходили часы, и половину фраз восстанавливал «на глаз».
Сейчас всё свёл в один скрипт transcribe-meeting.py. Он выкидывает типовой мусор на тишине (нейросеть любит «придумать» фразу там, где все молчат), склеивает куски, если запись разбилась, и пишет протокол встречи одним файлом. Из него потом собираются субтитры с таймкодами и обычный текст. На групповом созвоне не указываю число участников заранее: если семь голосов насильно зажать в два, они путаются ещё сильнее.
Где я облажался в первый вечер
Половину времени съел не ИИ, а тупая инфраструктура.
Python не тот. Homebrew у меня остался с Intel-времён, и Python из него собран под старые процессоры. Нейросеть на таком не заводится. Проверка одной командой: python3 -c "import platform; print(platform.machine())" должна вернуть arm64. Если видите x86_64, переставляйте Python из /opt/homebrew. Мне это закрыло половину «почему ничего не работает».
Зависла загрузка модели с Hugging Face (склад нейросетей, откуда качаются веса): полоса загрузки просто молчала. Подождал, плюнул, скачал файлы напрямую в папку на диске и указал путь в скрипте. Заработало с первого раза.
Pyannote — отдельный квест. Модель закрытая: на сайте Hugging Face нужно нажать «Accept» на двух страницах и войти в аккаунт из терминала. Пропустил одну страницу — получите отказ в доступе при первом же запуске. Я в тот вечер накликал три «Accept», потому что заодно пробовал ещё один вариант модели. Для базового сценария хватает двух.
Ещё честно: на стыках коротких реплик pyannote путает голоса. На групповых созвонах иногда один «голос» склеивает двух людей — тогда правлю по таймкодам в протоколе, а не вслепую. Whisper на тишине тоже фантазирует; скрипт часть режет и складывает всё вырезанное отдельным списком в тот же протокол, чтобы можно было проверить глазами.
При чём тут вы
Если у вас Mac на M-чипе и созвоны в браузере, проверьте три вещи, прежде чем платить подписку облачному транскрибатору:
Запись не должна грузить созвон. OBS с полным захватом экрана часто квакает. Звук из браузера плюс микрофон в один файл — нормальная цель.
Один файл, все голоса вместе. Раздельные дорожки «система» и «микрофон» потом не разложить по говорящим автоматически.
Локально значит на вашем диске. Час аудио с договорённостями и цифрами не обязан улетать на чужой сервер ради экономии пятнадцати минут вашего времени.
Если полезно — скрипты с инструкцией лежат тут: github.com/naimax/mac-call-transcribe. Развёрнутый гайд с чеклистом и картинками: aivibecraft.ru/blog/local-call-transcription-mac-m4. Там же про чистку выдуманных фраз и групповые созвоны.
Вы как пишете созвоны: OBS, встроенная запись Zoom, облачный сервис, или вообще «на память и блокнот»? Сколько платите в месяц, если пользуетесь Otter/Fireflies и похожим? Интересно сравнить, не один ли я бесился с квакающим звуком.
Дневник про нейросети и разработку веду в MAX: там же разборы инцидентов вроде «ИИ-помощник убил рабочую базу за 9 секунд».






