yukovsky.
Открыт к предложениям

Tsukiko

Офлайн-диктовка и расшифровка аудио для macOS и Windows. Нажали клавишу, сказали, и текст появился там, где стоит курсор. Модели распознавания работают прямо на компьютере.

Зачем

Tsukiko для тех, кто хочет диктовать и расшифровывать аудио, не отправляя голос в облако. Модели распознавания работают прямо на компьютере, а текст попадает в любое приложение, от IDE до чата.

Как это работает

Зажали клавишу, сказали, и текст напечатался под курсором; диктовку можно запускать и личной кодовой фразой. Аудио или видео перетаскиваются в окно, а расшифровка с таймкодами экспортируется в TXT, Markdown, SRT, VTT или JSON.

Что сделал я

Идея, архитектура, разработка и релизы: десктопное приложение на Flutter, нативные системные хуки на Swift и C++, движки распознавания в отдельных процессах и конвейер подписанных релизов. Двое внешних контрибьюторов прислали исправления, образ маскота придумала Feyza.

Статус

Открытый код под MIT, подписанные релизы для macOS и Windows, проект активно развивается. Доработка очереди диктовки сократила медианное время короткой фразы с 2,28 до 1,35 с на Apple M5.

Роль
Автор и ведущий разработчик
Период
2026 – сейчас
Статус
Выпущен
Стек
Flutter Desktop, Dart, flutter_bloc, bloc_concurrency, whisper.cpp, NeMo-Speech.cpp, sherpa-onnx, Swift, C++, Metal, Vulkan, FFmpeg, GitHub Actions, Inno Setup

Главное

  • Диктовка в любое приложение: зажали клавишу, сказали, и текст напечатался под курсором или остался в буфере обмена, при желании с Enter в конце
  • Расшифровка аудио и видео пачкой с экспортом в TXT, Markdown, SRT, VTT и JSON
  • Запуск и остановка голосом по личной кодовой фразе, откалиброванной под ваш голос
  • Свой словарь для имён и жаргона: подсказки модели и автозамены
  • CLI, локальный API и навык для AI-агентов
  • Подписанные установщики для macOS и Windows, ничего не уходит с компьютера
Маскот Tsukiko, лавандовая кошка, слушаетМаскот Tsukiko свернулась клубком и радуется
Текст вставлен в Заметки
Заметки

Собери сборку под Windows сегодня вечером и обнови заметки к релизу.

Иллюстрация процесса, не запись. Маскот: Feyza.
  • Главное окно Tsukiko: пустая очередь слева, зона для перетаскивания с лунной кошкой в центре и панель настроек для новых записей справа (модель, язык речи, пунктуация, разбивка на фрагменты)Главное окно Tsukiko: пустая очередь слева, зона для перетаскивания с лунной кошкой в центре и панель настроек для новых записей справа (модель, язык речи, пунктуация, разбивка на фрагменты)

    Главное окно: аудио или видео перетаскивается в центр, справа выбираются модель, язык, пунктуация и разбивка на фрагменты.

  • Настройки диктовки: сочетания клавиш (удерживать и говорить, нажать и нажать ещё раз, бросить начатое, отправить Enter), модель диктовки и число потоков; слева боковая панель разделов настроекНастройки диктовки: сочетания клавиш (удерживать и говорить, нажать и нажать ещё раз, бросить начатое, отправить Enter), модель диктовки и число потоков; слева боковая панель разделов настроек

    Настройки диктовки: четыре сочетания клавиш (удерживать, включить и выключить, отменить, отправить Enter) и отдельная модель для диктовки.

  • Редактор словаря с примерами записей: подсказки вроде Tsukiko и whisper.cpp и замены вроде «get hub» на GitHub и «jason» на JSON; всего 11 записей: 7 подсказок и 4 заменыРедактор словаря с примерами записей: подсказки вроде Tsukiko и whisper.cpp и замены вроде «get hub» на GitHub и «jason» на JSON; всего 11 записей: 7 подсказок и 4 замены

    Свой словарь: подсказки помогают модели расслышать термин, замены исправляют написание.

  • Выбор активных моделей для расшифровки и диктовки и каталог whisper.cpp с размерами, описанием, метками и отметкой «Установлена»Выбор активных моделей для расшифровки и диктовки и каталог whisper.cpp с размерами, описанием, метками и отметкой «Установлена»

    Каталог моделей: whisper.cpp и NeMo с размером, назначением и языками, скачиваются по запросу.

1 / 4 Главное окно: аудио или видео перетаскивается в центр, справа выбираются модель, язык, пунктуация и разбивка на фрагменты.

Авторы: Арт маскота: Feyza (feyzart.com). Контрибьюторы: MarieSamota, GreyPikachu

Что это

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

Это же приложение расшифровывает файлы. Перетаскиваете в окно аудио или видео, выбираете движок, модель и язык и получаете текст, разбитый на сегменты с таймкодами. Каждый сегмент можно прослушать, а результат выгрузить в TXT, Markdown, SRT, VTT или JSON. Диктовку можно запускать голосом, по кодовой фразе, а в словарь добавить названия проектов и профессиональный жаргон.

Что я сделал

Десктопное приложение для macOS и Windows вокруг открытых движков распознавания:

  • очередь файлов с просмотром расшифровки и настройками для каждой записи;
  • диктовку на уровне системы с плавающим индикатором в четырёх видах, от панели с волной до скрытого режима;
  • детектор кодовой фразы с пошаговой калибровкой голоса;
  • историю диктовок, которая переживает перезапуск, и выбор, как попадает текст: вставить, вставить и оставить в буфере или только в буфер;
  • разделение дикторов в записях с несколькими голосами;
  • анимированную лунную кошку, которая показывает состояние приложения (покой, слушает, работает) и нарисована кодом;
  • CLI tsukiko-transcribe, локальный API и навык для AI-агентов;
  • подписанные установщики и автоматический выпуск релизов для обеих систем.
  • Главное окно Tsukiko: пустая очередь слева, зона для перетаскивания с лунной кошкой в центре и панель настроек для новых записей справа (модель, язык речи, пунктуация, разбивка на фрагменты)Главное окно Tsukiko: пустая очередь слева, зона для перетаскивания с лунной кошкой в центре и панель настроек для новых записей справа (модель, язык речи, пунктуация, разбивка на фрагменты)

    Главное окно: аудио или видео перетаскивается в центр, справа выбираются модель, язык, пунктуация и разбивка на фрагменты.

  • Настройки диктовки: сочетания клавиш (удерживать и говорить, нажать и нажать ещё раз, бросить начатое, отправить Enter), модель диктовки и число потоков; слева боковая панель разделов настроекНастройки диктовки: сочетания клавиш (удерживать и говорить, нажать и нажать ещё раз, бросить начатое, отправить Enter), модель диктовки и число потоков; слева боковая панель разделов настроек

    Настройки диктовки: четыре сочетания клавиш (удерживать, включить и выключить, отменить, отправить Enter) и отдельная модель для диктовки.

  • Редактор словаря с примерами записей: подсказки вроде Tsukiko и whisper.cpp и замены вроде «get hub» на GitHub и «jason» на JSON; всего 11 записей: 7 подсказок и 4 заменыРедактор словаря с примерами записей: подсказки вроде Tsukiko и whisper.cpp и замены вроде «get hub» на GitHub и «jason» на JSON; всего 11 записей: 7 подсказок и 4 замены

    Свой словарь: подсказки помогают модели расслышать термин, замены исправляют написание.

  • Выбор активных моделей для расшифровки и диктовки и каталог whisper.cpp с размерами, описанием, метками и отметкой «Установлена»Выбор активных моделей для расшифровки и диктовки и каталог whisper.cpp с размерами, описанием, метками и отметкой «Установлена»

    Каталог моделей: whisper.cpp и NeMo с размером, назначением и языками, скачиваются по запросу.

1 / 4 Главное окно: аудио или видео перетаскивается в центр, справа выбираются модель, язык, пунктуация и разбивка на фрагменты.

Технические решения

  • Движки в отдельных процессах. whisper.cpp и NeMo-Speech.cpp (Conformer-модели в GGUF) поставляются как отдельные нативные бинарники. Flutter-интерфейс общается с ними через IPC и локальный HTTP-сервер, и тяжёлый инференс не попадает в процесс интерфейса.
  • Несколько Flutter-движков в одном процессе. Главное окно, поповер в строке меню или трее и плавающий индикатор записи работают как отдельные движки.
  • Ввод на уровне системы. На macOS CGEventTap и Accessibility API (Swift), на Windows WH_KEYBOARD_LL и SendInput (C++), всё через platform channels.
  • Кодовая фраза. Свой детектор ключевых слов: 13-полосные MFCC и DTW, калибровка в четыре шага и запись похожего слова-«самозванца», чтобы отсекать ложные срабатывания.
  • Пользовательский словарь. Термины попадают в initial_prompt Whisper с учётом лимита токенов, а нечёткая замена потом исправляет частые созвучные ошибки.
  • Очередь диктовки. Повторное использование результата энкодера после определения языка сократило медианное время короткой фразы с 2,28 до 1,35 с на Apple M5.
  • Аппаратное ускорение. Metal на Apple Silicon и Vulkan на Windows, с автоматическим переходом на CPU.
  • Для разработчиков. CLI передаёт задачу уже запущенному приложению через IPC, и модель не грузится второй раз. Локальный REST и WebSocket API на 127.0.0.1 требует токен.

Результат

Открытый код под лицензией MIT и подписанные релизы для macOS и Windows: универсальный DMG с подписью Apple Developer ID и установщик для Windows, который проверяет Vulkan и при необходимости переключается на CPU. Каждый релиз собирается в GitHub Actions с регрессионным тестом на настоящих движках. Проект активно развивается.

Моя роль

Идея, архитектура, разработка и выпуск релизов. Два сторонних контрибьютора прислали исправления для пограничных случаев на Windows и macOS. Образ маскота, лунной кошки, придумала художница Feyza; анимированная кошка в приложении теперь рисуется кодом по её листам.

Замеры

  • 1,35 сМедианное время распознавания короткой фразы в очереди диктовки, large-v3-turbo на Apple M5 (было 2,28 с) (источник)
CV.pdf