Lipflow — ввод текста по движению губ, без микрофона и без звука

· 2 мин чтения
speech-to-text local-first productivity multimodal privacy
📂 Исходный код на GitHub

Настольная программа с открытым исходным кодом для ввода текста голосом без звука: она смотрит в веб-камеру и читает слова по движению губ. Модель Auto-AVSR работает локально на GPU, есть Whisper-режим со звуком, режим шёпота и необязательная правка текста через LLM. Поддерживаются macOS на Apple Silicon и Windows.

Lipflow — ввод текста по движению губ, без микрофона и без звука

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

Смысл проекта простой. Обычный голосовой ввод заточен под то, чтобы вы говорили вслух. В офисе, в метро, в комнате, где спит ребёнок, это невозможно. Лицо при этом двигается одинаково — просто без звука. Lipflow берёт именно этот сигнал и пытается его прочитать.

Работает на macOS 13 и новее на компьютерах с чипом Apple Silicon, а также на Windows 10 и 11 (64-разрядная). Код под лицензией MIT, около 350 звёзд на GitHub.

Как выглядит ввод текста

Держите правую клавишу Option, шевелите губами, отпускаете. Текст появляется в том окне, где стоял курсор. Приложение продолжает писать видео ещё 0,4 секунды после отпускания — модели нужны кадры, в которых видно последнее слово.

Двойное нажатие включает режим без удержания клавиши: приложение слушает до 60 секунд. Esc отменяет текущий ввод. Последний результат можно забрать из меню — копировать или открыть историю.

Работает и наоборот: можно указать видеофайл вместо камеры и распознать речь по записи.

uv run lipflow file talk.mp4 --start 10 --end 20

Что внутри

Распознавание речи по картинке — не новая идея. В проекте используется готовая модель Auto-AVSR, обученная на датасете LRS3. На стандартной проверке у неё 19,1% ошибок в словах.

Архитектура модели: свёрточная сеть в начале, кодировщик Conformer, а дальше декодер на основе Transformer плюс ветка CTC. В переборе вариантов участвует языковая модель на трансформере.

Дальше конвейер выглядит так:

  1. Кадры. MediaPipe FaceLandmarker отмечает ключевые точки лица на каждом кадре прямо во время записи. Второй проход по видео не нужен.
  2. Выравнивание. Точки вокруг глаз, основания носа и рта приводятся к усреднённому лицу из обучающей выборки. Так модель не зависит от того, как вы сидите и куда смотрите.
  3. Кропы рта. Вырезается область рта 96×96 в оттенках серого и приводится к 25 кадрам в секунду — именно столько нужно модели.

Скорость на M4 Pro при фразе в 9 секунд: кодировщик — 0,16 секунды на GPU Apple (на процессоре — 1,7 секунды), перебор вариантов — 0,8–1,6 секунды на процессоре. Итого от отпускания клавиши до текста проходит 1–2 секунды.

Авторы внесли две правки в вшитую в проект библиотеку ESPnet. Ключи и значения внимания считаются один раз на фразу, а не заново на каждом шаге и каждом варианте. Это ускоряет перебор на четверть. И вторую правку: подсчёт CTC теперь работает на любом устройстве.

Почему нужна правка через LLM

Губы не различают похожие по артикуляции звуки: p/b/m, f/v, t/d/n. Поэтому сырой вывод модели выглядит примерно так — вместо «while in office» вы можете получить «WALLET OFFICER».

Lipflow отправляет модели LLM три лучших догадки распознавателя и последние ваши фразы. Дальше LLM выбирает нужную фразу и приводит её в порядок: регистр, знаки препинания, числа. Используется первый доступный вариант:

Вариант Что это
Claude Модель claude-opus-5-5 с низким уровнем усилий. Лучше всего чинит сильно искажённые фразы. Модель можно заменить через LIPFLOW_MODEL, например на claude-haiku-4-5 ради меньшей задержки
Локальная модель Qwen3-0.6B в 4 бита, работает прямо внутри приложения через MLX на Apple Silicon. Около 350 МБ, примерно 0,2 секунды на фразу, полностью офлайн. Это вариант по умолчанию, если нет ключа API
Ollama Внешний сервер: ollama pull qwen3:4b, запуск через --cleanup ollama
Простые правила Без сети вообще: первую букву предложения в верхний регистр, отдельное «I», точка в конце, «nineteen forty three» → 1943

Шёпот даёт лучший результат

В настройках есть режим шёпота. Пока вы держите клавишу, программа ещё и слушает тихое бормотание, а модель Auto-AVSR читает губы и звук вместе. На тестовых фразах одними губами ошибались 31,9% слов, с добавлением звука — 6,9%. Реальное бормотание звучит не так чисто, как в тестах, так что ждите результат где-то посередине. Микрофон включается только пока нажата клавиша.

Объём — 1,8 ГБ на первое скачивание модели.

Обучение на ваших словах и вашем лице

При первом запуске программа спрашивает разрешения у macOS: камера, контроль клавиатуры, доступность. Затем идёт подготовка — примерно 8 минут.

  1. Ваши слова. Если вы пользуетесь Wispr Flow, программа импортирует историю диктовки. База читается локально и никуда не отправляется.
  2. Практика. Вы беззвучно проговариваете 24 фразы — по возможности взятые из вашей же истории.
  3. Обучение. На GPU этого компьютера дообучаются языковая модель под вашу манеру речи и распознаватель под ваше лицо. Шесть фраз отложены в сторону как проверка. Модель лица сохраняется, только если на них показывает лучший результат, чем обычная. Разница видна сразу.

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

Имена — самое сложное для чтения по губам, потому что имя это просто набор движений губ без подсказки. Свои имена можно добавить руками: меню Lipflow → Edit custom words, по одному в строке. Если в догадке есть ваше слово, она выигрывает у остальных.

Есть и обратная связь. Если вы правите слово, которое Lipflow только что вставил (в пределах 30 секунд), программа сохраняет этот кусочек видео вместе с исправленной фразой. Следующий раунд Practice & train more использует эти данные. Читается только то поле, куда шёл текст. Настройку можно выключить.

Установка

macOS:

git clone https://github.com/amywork777/lipflow.git ~/code/lipflow
cd ~/code/lipflow && ./setup.sh     # uv dependencies, ~1.2 GB of models, builds /Applications/Lipflow.app
open /Applications/Lipflow.app

Windows, в PowerShell:

git clone https://github.com/amywork777/lipflow.git $HOME\code\lipflow
cd $HOME\code\lipflow
powershell -ExecutionPolicy Bypass -File setup.ps1   # uv dependencies, ~1.2 GB of models, Start menu shortcut

Личные данные — клипы, фразы, обученные модели — лежат в ~/Library/Application Support/Lipflow/. Удалите папку — начнёте с нуля. Логи пишутся в ~/Library/Logs/Lipflow.log. Проверить модели и камеру можно командой uv run lipflow doctor.

Различия версий для Windows

На Windows приложение живёт в трее (розовый рот рядом с часами) и сразу стартует с зажатым Right Ctrl. Клавишу можно переназначить в меню трея. Двойное нажатие и Esc работают так же, как на Mac.

Без видеокарты NVIDIA распознаватель считается на процессоре. Это добавляет одну-две секунды на фразу, а обучение под лицо занимает в несколько раз больше. С картой NVIDIA нужно поставить сборку PyTorch с CUDA: uv pip install torch --index-url https://download.pytorch.org/whl/cu126. Правда, uv sync возвращает сборку для процессора, так что команду придётся повторять.

Локальная модель для правки текста есть только на Mac — она сделана на MLX. На Windows для этого предлагают Claude или Ollama. Имена берутся только из заголовка окна, на Mac добавляется ещё и текст вокруг курсора. Обучение на ваших правках пока работает только на Mac.

Код

Карта модулей: lipflow/face.py переводит точки лица в кропы рта, vsr.py — сама модель. Дальше camera.py, hotkey.py (перехват клавиш через Quartz — слушатель pynput на свежих версиях macOS падает), paste.py, hud.py, cleanup.py, app.py. Код для Windows лежит в lipflow/win/. Общий для обеих платформ код: ptt.py, dictation.py, practice.py.

Тесты запускаются обычным uv run pytest. Тест вставки текста включается отдельно через LIPFLOW_TEST_PASTE=1. На Windows setup прогоняется целиком и на каждом запуске читает настоящий фрагмент записи — это делает CI-конфигурация.

Лицензия и ограничения

Код распространяется по MIT — LICENSE. Сторонний код, вшитый в проект, сохраняет свои лицензии, перечень в NOTICE.

Отдельное ограничение касается весов модели. Они скачиваются из датасета LRS3, а тот предназначен только для некоммерческих исследований.

Источник: https://github.com/amywork777/lipflow