После 1.2.0 к нам постоянно возвращались две жалобы: «фамилию коллеги он пишет неправильно каждый раз» и «Enhance либо включён, либо выключен — мне не всегда нужна одна и та же обработка».
1.3.0 вышла сегодня. Она закрывает оба вопроса и решает ещё одну регулярную проблему: расшифровки встреч, где каждая реплика собеседника дублируется, потому что вы были без наушников.
Вот что изменилось.
Пользовательский словарь
У любого движка распознавания есть набор слов, которые именно у вас он стабильно портит: фамилия, название продукта, внутренняя аббревиатура, имя инструмента, который вы упоминаете сорок раз в день. Parakeet никогда не слышал о вашем стартапе. «Claude Code» превращается в «clod code», и в какой-то момент вы просто перестаёте это замечать и правите вручную каждый раз.
В настройках появился раздел Vocabulary. Каждое правило — это пара: что выдаёт распознавание и что должно было получиться. clod code → Claude Code. kubernets → Kubernetes. Правильное написание имени вместо того, что услышала модель.
Детали, которые важны на практике:
- По умолчанию совпадение по целым словам, так что правило для
catникогда не перепишет середину слова «category». Отключается для подстрочных замен. - По умолчанию без учёта регистра, с переключателем для случаев, когда
APIдолжно совпадать только сAPI. - Отдельный выключатель для каждого правила — можно отложить правило, не удаляя его.
- Работают фразы из нескольких слов — левая часть не обязана быть одним токеном.
Правила применяются в трёх местах, а не в одном. Ваши термины передаются распознавателю как подсказка-смещение до транскрибации, применяются как замены в сырой расшифровке после неё и попадают в промпт LLM как инструкция «сохранить как есть» — чтобы этап обработки не переписал незаметно то написание, которое вы только что исправили. Именно из-за последнего пункта ранняя наивная версия этой функции не вышла: исправить имя и тут же получить его перефразированным обратно хуже, чем не исправлять вовсе.
Если вы диктуете в кодинг-агентов, настраивайте эту функцию первой. Десяток правил на имена собственные вашего стека убирает большую часть ручной правки.
Режимы диктовки вместо переключателя Enhance
Раньше Enhance был галочкой: обработать текст или нет. Это правильное поведение по умолчанию и неправильный потолок — один и тот же продиктованный абзац должен выглядеть по-разному в зависимости от того, куда он идёт.
1.3.0 заменяет галочку выбором режима:
- Raw — вставляет ровно то, что вы сказали, без обращения к LLM. Самый быстрый путь; живой перевод здесь по-прежнему работает.
- Cleanup — грамматика, пунктуация, удаление слов-паразитов, формулировки сохраняются. Прежнее поведение Enhance и режим по умолчанию.
- Email — превращает диктовку в структурированное деловое письмо, не выдумывая тему и подпись, которых вы не произносили. Как это выглядит на практике — в статье про диктовку писем на Mac.
- Message — короткое сообщение в мессенджер, разговорный тон.
- Bullets — перестраивает сказанное в сгруппированные пункты списка.
- Formal — выверенный формальный тон.
- Custom — ваша собственная инструкция, сохранённая в настройках и применяемая к каждой диктовке.
Custom — самый интересный режим. Это свободный текст, поэтому «всегда пиши в британском английском и никогда не используй тире» или «переводи на испанский и укладывайся в три предложения» — валидный режим. Всё по-прежнему выполняется локально на устройстве.
Во всех режимах числа, идентификаторы кода, URL, пути к файлам, текст в кавычках и термины из вашего словаря защищены от переписывания. Обработка должна менять прозу, а не несущие токены внутри неё.
Встречи на динамиках: проблема дублирующихся реплик
Если вы созваниваетесь без наушников, удалённые участники звучат из динамика Mac и попадают обратно в микрофон. Vext пишет микрофон и системный звук отдельными потоками, поэтому одна и та же фраза расшифровывается дважды — чисто из системного потока и плохо из микрофонного, — и в расшифровке выходит, будто вы повторили всё, что только что сказал собеседник.
Мы дважды пытались решить это в аудиодомене. Сначала акустическим эхоподавителем DTLN на CoreML, потом штатным Voice Processing I/O от Apple. Оба варианта работают, и оба были удалены: VPIO меняет общее состояние микрофона, поэтому его включение протаскивает автоматическую регулировку усиления и шумоподавление во все остальные приложения, читающие тот же микрофон, — ваш голос становится хуже в Zoom, пока Vext ведёт запись. Неприемлемый размен.
Версия, которая вышла, работает с расшифровкой. Эхо искажено достаточно, чтобы сломать сравнение голосовых отпечатков, но оно произносит те же слова в то же время, а оба потока разделяют одни часы встречи. Поэтому дедупликатор сопоставляет текст со временем: микрофонный фрагмент, чьи токены в основном содержатся в системном фрагменте в пределах двухсекундного окна, — это эхо, и он выбрасывается. Второй проход склеивает мелкие обрывки одного спикера, которые остаются после разбиения по границам слов.
Дополнительно офлайн-проход уточнения теперь использует голосовые эмбеддинги удалённых участников, чтобы находить и убирать протёкший звук, с детекцией пересечений для случаев, где одного сходства мало.
Итог: запись созвона в Zoom или Meet на динамиках ноутбука теперь даёт расшифровку, близкую к той, что получается с наушниками. С наушниками всё ещё лучше. Просто теперь они не обязательны.
Разделение спикеров на уровне слов
Смежное изменение и структурная причина целого класса странностей в расшифровках.
Детектор речевой активности режет аудио на фрагменты. Когда двое быстро перебивают друг друга, в один фрагмент попадает три-четыре реплики, и всё это транскрибировалось одним блоком под одной меткой. Офлайн-проход потом исправлял атрибуцию, но склеенный текст оставался склеенным.
1.3.0 режет на уровне токенов. У каждого распознанного слова есть таймкод, таймлайн диаризации знает, кто говорил в этот момент, и фрагмент разбивается на отрезки по спикерам до попадания в расшифровку — с переносом предыдущей метки на слова, которые таймлайн не покрывает. Чередующиеся спикеры выходят отдельными строками прямо во время встречи.
Распознавание спикеров, которое не схлопывается
Три исправления в идентификации спикеров, все — из реальных записей, которые пошли не так:
Взаимно однозначное сопоставление. Сопоставление кластеров с профилями было жадным, поэтому два разных человека могли совпасть с одним известным спикером и слиться в одну личность. Теперь это уникальное отображение: один кластер — один профиль.
Стабильные голосовые профили. Эмбеддинги L2-нормализуются и смешиваются экспоненциальным скользящим средним по мере поступления новых сэмплов, а не перезаписываются. Профили улучшаются с каждой встречей, а не дрейфуют к последней записи.
Защита от схлопывания. Встреча на пятерых вернулась из офлайн-прохода как «Я» плюс один человек: офлайн-диаризатор недокластеризовал поток из 590 сегментов в один кластер, и, поскольку этот проход считается авторитетным, он стёр четырёх спикеров, которых живой проход корректно разделил. Теперь, если офлайн-проход даёт один кластер или меньше там, где живой установил двух и более спикеров, сохраняются живые метки. Излишне разделённых спикеров можно объединить во вкладке Speakers; спикеров, удалённых авторитетным проходом, вернуть невозможно.
Горячие клавиши переписаны
Система горячих клавиш переписана начиная со слоя хранения. Пять действий получили независимые привязки: диктовка с удержанием, диктовка без рук, заметки, встречи и скриншоты.
Назначение уже занятой комбинации распознаётся и разрешается, а не приводит молча к двум действиям на одной клавише. Любую привязку можно очистить клавишей Delete или кнопкой, а рекордер даёт понятную обратную связь во время захвата. Старый менеджер с разбросанными свойствами AppStorage и ручным декодированием удалён.
Немецкий и нидерландский
Интерфейс теперь доступен на семи языках: английский, испанский, немецкий, нидерландский, русский, хинди и тайский — плюс режим Auto, следующий за языком системы macOS. Переключается в Настройки → Основные, применяется мгновенно, без перезапуска.
Дизайн: Liquid Glass на macOS 26
На macOS 26 Tahoe онбординг, приветственное руководство, экран лицензии, экран загрузки модели и пилюля записи используют нативные поверхности Liquid Glass с адаптивным тонированием. На более ранних версиях macOS всё возвращается к прежним материалам — для вас ничего не меняется.
Кривые анимации стали общими примитивами вместо констант в каждом отдельном представлении, поэтому переходы ощущаются одинаково по всему приложению, а индикаторы записи учитывают системную настройку Reduce Motion.
Стабильность и сохранность данных
Неприглядная половина релиза:
- Отменённые задачи транскрибации могли крутить ядро на 100% CPU. Исправлено.
- Редактирование названия встречи или расшифровки во время фоновой финализации могло молча откатить вашу правку. Записи стали частичными обновлениями, которые не затирают редактируемые пользователем поля.
- Обработчик текста мог портить корректный текст расшифровки при удалении слов-паразитов — токены с дефисами и пунктуация теперь защищены.
- База данных больше не стирает себя при смене схемы. Этот путь мог уничтожить историю встреч при обновлении; он отключён.
- Исправлены падения из-за некорректных диапазонов VAD и гонка при обновлении уровня звука.
- Понижение частоты дискретизации системного звука выполняется через
AVAudioConverterс корректной антиалиасинговой фильтрацией вместо наивной линейной интерполяции — заметно более чистый вход для распознавания. - Содержимое буфера обмена сохраняется при вставке текста и изображений.
- Аудиодвижок создаётся только в момент старта записи, поэтому простаивающий Vext больше не удерживает микрофон.
- Названия встреч и живые расшифровки сохраняются перед завершением приложения.
- Удаление спикера теперь требует подтверждения.
Обновление
brew upgrade muvon/tap/vext
Или скачайте Vext 1.3.0 напрямую. Встречи, профили спикеров и настройки переносятся: переключатель Enhance превращается в режим Cleanup, а существующие горячие клавиши мигрируют в новые привязки.
Всё по-прежнему работает целиком на вашем Mac: без облака, без аккаунта, без подписки.