О себе и о проекте
Всем привет, меня зовут Максим. Я обожаю мобильную разработку и люблю делать инструменты для себя. Время от времени мои приложения оказываются востребованы не только мной. Например, мой Простой Текстовый Редактор, согласно статистике Google Play, сейчас используют около 200 тысяч человек — и это без учёта тех, кто установил приложение через F-Droid. Но чаще мои проекты остаются инструментами для личного пользования, что меня, впрочем, вполне устраивает.
Сегодня я хочу рассказать о новом приложении Voice Inbox — транскрайбере голосовых заметок, аудиофайлов и голосовых сообщений, который автоматически конвертирует их в Markdown-файл.
Почему ещё один транскрайбер?
Потому что мне был нужен не просто speech-to-text. Мне хотелось, чтобы всё работало полностью локально, без аккаунта и облака, умело автоматически подхватывать записи из папки и складывать результат прямо в Markdown. А ещё хотелось иметь тот же движок в виде Android-клавиатуры. Готового решения, которое закрывало бы весь этот сценарий целиком, я не нашёл.
Как появилась идея?
Так уж получилось, что мне нравится наговаривать заметки на ходу. Идёшь по улице, в голову приходит какая-нибудь мысль — и хочется срочно её записать, пока она не исчезла. Всё по заветам Дэвида Аллена и Никласа Лумана.
У меня есть офигенный кастомный бумажный блокнот, с которым я практически не расстаюсь. У меня есть текстовый редактор в телефоне. Но в последнее время мне захотелось дополнить эти два инструмента ещё и голосовыми заметками.
Собственно, голосовыми заметками я и так пользуюсь давно. До недавнего времени они распознавались асинхронно на моём сервере: аудиофайлы автоматически синхронизировались через Syncthing, специальный cron job находил новые записи, распознавал их и присылал результат мне на почту.
Работало неплохо. Но в какой-то момент мне стало лень проверять этот почтовый ящик.
Кроме того, я обнаружил отличную офлайн-клавиатуру с голосовым вводом и не менее отличную модель распознавания, на которой она была построена. И подумал: а почему бы не распознавать заметки прямо на устройстве?
Тем более что часы под управлением Wear OS умеют автоматически передавать аудиозаписи на телефон. Получается, заметки можно наговаривать не только на телефоне, но и прямо на часах — иногда это даже удобнее.
Я взял ту же модель, которая использовалась в клавиатуре. К счастью, проект был open source, поэтому можно было посмотреть, как всё устроено. Создал чистый проект под Android и попросил Codex сделать простой пользовательский интерфейс для чтения аудиофайлов из папки с диктофонными записями, инициализировать модель и пропустить через неё записанные файлы.
Так получился простой транскрайбер, который умеет превращать голосовые заметки в текст.
Но тут мой внутренний перфекционист напомнил, что Android — это, конечно, хорошо, однако я давно хотел попробовать Kotlin Multiplatform, а этот проект — прекрасная возможность наконец его пощупать и заодно сделать iOS-версию.

Android клавиатура
Стандартная голосовая Android-клавиатура мне не очень нравится: качество распознавания зависит от качества интернета, а если связи нет, получается полная белиберда. Поэтому я использовал простую офлайн-клавиатуру, которая, собственно, и вдохновила меня на этот проект.
Авторы голосовой клавиатуры, которой я пользовался и которой был доволен как слон, обновили движок распознавания. После обновления мой старенький телефон перестал поддерживать последнюю версию приложения.
Печаль.
Но любая проблема одновременно является и возможностью. К этому моменту у меня уже были готовы инициализация модели, загрузка аудио и весь пайплайн распознавания. И я подумал: почему бы мне не сделать собственную клавиатуру как часть приложения?
Оказалось, что по трудоёмкости сделать Android-клавиатуру не намного сложнее, чем всё остальное.

Клавиатура появилась. И сказать, что она работает охуенно, — ничего не сказать.
Теперь я могу наговаривать статьи, заметки и случайные мысли в виде аудиофайлов. Приложение автоматически распознаёт их по расписанию или после нажатия на кнопку, а затем сохраняет результат в мой Obsidian в виде Markdown-файла.
А если текст нужен сразу — например, чтобы написать сообщение, письмо или комментарий, — можно воспользоваться клавиатурой с голосовым вводом.
Что вошло в прототип и сколько времени на него было потрачено?
Сам прототип получился довольно быстро. Первый рабочий Android-прототип получился за выходные, ещё несколько вечеров было потрачено на KMP и на создание клавиатуры. Сейчас я продолжаю допиливать и добавлять фичи, полирую внешний вид.
На сегодняшний день у меня есть офлайн-распознавание файлов, автосканирование папки, сохранение в Markdown, Android-клавиатура, поддержка двух моделей — Parakeet и Whisper, поддержка Wear OS и версия приложения для iOS.
Какой технологический стек вы использовали? Почему?
Проект сделан на Kotlin Multiplatform. Я давно хотел пощупать эту технологию, а этот проект прекрасно для этого подошёл: мне хочется, чтобы приложение работало и под Android, и под iOS. Использование KMP позволяет шарить между платформами около половины бизнес-логики, включая базу данных, модели и структуры данных.
Само распознавание голоса реализовано на Rust с использованием transcribe-rs.
Основная модель — Parakeet от NVIDIA, квантизованная парнем из Новосибирска до приемлемого для мобильного устройства размера — примерно 700 мегабайт . Модель поддерживает 25 европейских языков, включая русский, английский и немецкий.
Также я добавил Whisper, который поддерживает около сотни языков, включая японский и корейский. Самая лёгкая версия получается совсем небольшой и при этом вполне достойно работает.
Кто пользуется?
Сейчас приложением пользуюсь только я, члены моей семьи и друзья.
Расходы на разработку и монетизация
Как я уже писал выше, основных денежных расходов на разработку пока не было — если не считать подписку ChatGPT Plus и потраченный недельный лимит Codex.
Планов по монетизации тоже пока нет. Впрочем, если появятся установки и станет понятно, что приложение действительно кому-то нужно, тогда можно будет об этом подумать.
Планы на будущее
В планах — добавить ещё несколько моделей Whisper и, возможно, другие движки распознавания. Пока более тяжёлые варианты работают не с той скоростью и не с тем потреблением ресурсов, которые хотелось бы видеть на телефоне. Хотя я уже нашёл несколько вещей, которые можно улучшить.
А ещё у меня есть мечта — сделать так, чтобы текст можно было набирать вообще не глядя в телефон и при этом полностью офлайн. Этот проект — только один из шагов в этом направлении.
Сейчас мне хочется понять, действительно ли это приложение нужно кому-то, кроме меня.
Моя подписка Apple Developer сейчас неактивна, поэтому публиковать приложение для iOS я буду только в том случае, если Android-версия окажется востребованной. Тем более что на iOS голосовой ввод и так работает довольно неплохо.
Нужны тестировщики для закрытого тестирования
Мне хочется довести приложение до публикации в Google Play. Но для этого нужно пройти закрытое тестирование. Необходимое количество людей должно установить приложение и пользоваться им в течение двух недель..
Поэтому, если вы тоже любите наговаривать заметки или вам нужна клавиатура, которая работает без интернета и при этом достаточно хорошо распознаёт речь, — приглашаю присоединиться к тестированию.
Для этого нужно:
- Вступить в группу тестировщиков.
- Согласиться стать тестером на этой странице
- Скачать приложение из Google Play.
- Немного попользоваться приложением и, желательно, рассказать мне, что работает плохо, странно или неудобно.
Если всё пройдёт хорошо и приложение окажется не очень глючным, через пару недель я смогу выпустить его в продакшен.
Если вы не хотите становиться тестером, но приложение кажется вам полезным, можно скачать APK с GitHub. Исходный код там же — на GitHub.
Вместо эпилога
Раньше я смеялся над вайбкодерами, которые создают собственные транскрайберы. Теперь я один из них. Впрочем, нисколько об этом не жалею и всем рекомендую.
