Как я уделал Microsoft, но это никому не нужно (кайфую сам)
Однажды мне надоело много печатать, я включил voice typing от Microsoft, и он меня не устроил: медленный, тупой и ещё грузит процессор.
— ChatGPT, родной, сможем написать своё приложение для диктовки? — спросил я ИИ.
— Без проблем, — ответил он.
Так и началось.
Сразу предупрежу. Я не программист.
Я актёр и модель, писатель, финансист, предприниматель — и это не для упоминания Брюса Уэйна. Я просто человек, который последние годы постоянно что-то придумывает и пытается это реализовывать.
Алгоритмы я не изучал. Design patterns не знаю. Clean Architecture могу примерно представить, но если попросить меня объяснить её на собеседовании — лучше сразу вызвать другого человека.
Зато у меня есть ChatGPT.
И, как оказалось, этого иногда достаточно, чтобы очень надолго втянуть себя в разработку на месяцы.
Мне просто надоело печатать.
Я много пишу. Очень много: сообщения, заметки, тексты, документы, какие-то мысли. На это уходит куча времени, нервов, да ещё руки устают. Проще наговорить.
Поэтому я попробовал обычную голосовую диктовку Windows. Вызов — клавиша Win+H.
Ну что сказать? На мой вкус: медленная, тупит, слова с опозданием вводит, да ещё надо кнопку нажимать каждый раз. Потом я попробовал другие доступные в интернете программы, и итог для них один — всё то же самое, что и с Voice typing. Неудобные. Мягко сказать.
Да ещё большинство отправляют надиктованное в облако. А я параноик на тему конфиденциальности. И я решил сделать своё.
Критерии:
сказал слово → слово появилось на экране. И желательно в любом месте, куда сейчас можно печатать: Word. Telegram. Браузер. Блокнот. Форма на сайте. Неважно.
Я не хотел отдельное приложение, в которое надо сначала перейти. Не хотел каждый раз нажимать горячую клавишу. Не хотел отправлять свой голос куда-то в облако. И уж точно не хотел запускать огромную нейросеть ради того, чтобы написать:
«Сегодня вечером нужно купить молоко».
Как человек, который не умеет программировать, пишет программу
Первое время всё выглядело примерно так.
Я: Сделай, чтобы программа слушала микрофон и печатала текст.
ChatGPT: Конечно.
Потом:
А теперь пусть не печатает, когда я молчу.
Ок.
А теперь пусть понимает, что я продолжаю говорить после короткой паузы.
Хорошо.
И т.дальше вы поняли.
Я запускал программу. Она падала. Я отправлял ошибку ChatGPT. Он исправлял. Я вставлял исправленный код. Она падала уже по-другому. Мы снова разбирались. И так по кругу.
Я не писал эту систему как программист. Я скорее ставил эксперименты и разговаривал с нейросетью о результатах. Я говорил, что должно происходить. Она предлагала, как это сделать. Я запускал. Смотрел. Говорил, что получилось. Она переделывала. И постепенно из этого начали собираться отдельные детали.
А потом они почему-то начали работать вместе.
Так появился Jupiter
Почему я назвал его так — уже не помню. Просто первое, что в голову пришло.
По сути, это очень простая идея. Микрофон постоянно слушает, но не всё подряд: отдельный слой определяет, что человек действительно начал говорить. Программа распознаёт этот поток и отправляет слова в то место, где стоит курсор. Текст появляется сразу.
Потом система может уточнять уже распознанное. Пунктуация и исправления накладываются поверх результата.
И всё это происходит локально на компьютере. Без отправки голоса на сервер.
Мне было важно, чтобы Jupiter нормально работал даже на слабом Windows-компьютере.
Я специально не хотел превращать обычную диктовку в соревнование по размерам моделей.
Мне нужен был инструмент. Не AI-агент. Не цифровой секретарь. Не «поговори со своим компьютером о смысле жизни».
Просто: я говорю → компьютер печатает. Причём желательно быстро.
А вот здесь начинается самое интересное
Если бы я делал это как нормальный разработчик, возможно, я бы пошёл совсем другим путём.
Но я не разработчик. Поэтому некоторые решения у меня получились довольно… спорными. Например, Jupiter не пытается интегрироваться отдельно с каждым приложением.
Зачем? Если Windows уже умеет принимать нажатия клавиш, почему бы не использовать это?
Jupiter получает распознанный текст и фактически печатает его туда, где сейчас находится курсор.
Поэтому ему всё равно, что перед ним. Word или Telegram. Браузер или Блокнот. Он просто печатает. Наверняка сейчас кто-то уже пишет:
«Это костыль».
Возможно. Но он работает. Есть и другая интересная вещь.
Поскольку распознавание потоковое, новая версия текста может немного отличаться от того, что было распознано секунду назад.
Например, сначала модель услышала одно. Через мгновение получила больше контекста и поняла, что там было другое слово.
Поэтому пришлось делать слой согласования текста. Он сравнивает то, что уже напечатано, с тем, что система считает правильным сейчас, и при необходимости исправляет предыдущий результат. То есть вместо красивой схемы:
подождали → распознали → получили идеальное предложение → напечатали
получилась схема:
услышали → напечатали → услышали ещё → поняли лучше → поправили
Мне она нравится. Но я подозреваю, что у профессионального разработчика от неё может немного дёрнуться глаз.
Почему я не взял одну большую нейросеть?
Потому что мне не нужна была одна большая нейросеть. Я начал собирать систему из небольших специализированных компонентов. Один отвечает за определение речи. Другой — за распознавание. Отдельная часть занимается согласованием результата. Ещё одна — пунктуацией и исправлением текста.
Потом всё это нужно было заставить работать в реальном времени. И вот тут я впервые понял одну неприятную вещь.
Работающая программа — это вообще не то же самое, что набор работающих компонентов. Каждая отдельная часть может прекрасно работать.
А вместе они могут устроить полный пиз*ец.
Поток начинает запаздывать. Текст прыгает. Курсор оказывается не там. Короткая пауза внезапно заканчивает фразу. Следующая фраза начинается с мусора от предыдущей.
Исправление текста приходит тогда, когда пользователь уже успел напечатать ещё двадцать слов. И всё это приходится ловить руками. Ну, почти руками. В основном — руками через ChatGPT.
Самая странная часть
В какой-то момент Jupiter начал работать настолько нормально, что я перестал воспринимать его как эксперимент. Я просто начал им пользоваться. Пишу сообщение — говорю. Нужно записать мысль — говорю и т.д
Появилась команда:
«Юпитер, удали последнее слово».
И он удаляет.
Добавилась коррекция орфографии и пунктуации (пока в разработке). Речь становится больше похожа на нормальный письменный текст. При этом сама идея остаётся примитивной. Я не пытаюсь разговаривать с компьютером. Я просто заменил клавиатуру голосом. И вот здесь у меня возник вопрос.
Почему такой простой сценарий вообще нельзя было сделать нормально из коробки?
Microsoft, Google, Apple и куча других компаний годами делают голосовые технологии.
Они умеют гораздо больше меня. У них команды разработчиков, инфраструктура, огромные модели, деньги и всё остальное. А я — актёр, писатель, финансист… (ну вы помните) с ChatGPT.
И всё равно мне удалось собрать штуку, которая лично для меня удобнее того, чем я пользовался раньше. Не лучше вообще. Не технологически круче. Не «революция». Просто мне удобнее. И это, пожалуй, самое смешное во всей истории.
Я собрал Windows-сборку
Потом начался следующий уровень боли.
Мне захотелось Jupiter’ом поделиться с другими.
Попробуй объяснить обычному человеку:
«Сейчас установи Python 3.12, зависимости, ONNX Runtime, вот эту библиотеку, вот эту модель, а теперь открой PowerShell…»
Поэтому пришлось разбираться со сборкой. Jupiter превратился из папки с Python-файлами в нормальное Windows-приложение. Появился установщик. Запуск без Python-консоли. Модели лежат внутри нужной структуры. Программа запускается как обычный Windows-софт.
Можно дать человеку установщик и сказать:
«Установи»
И вот тут возникает проблема
Я сделал Jupiter для себя. Не стартап. Не бизнес. Не инвестиционный проект. Не «давайте сейчас найдём рынок на 10 миллиардов долларов». Мне просто надоело печатать. Это была вся бизнес-модель.
Задолбался → сделал
И пока я делал его для себя, мне было вообще всё равно, нужен он кому-нибудь или нет.
А потом я посмотрел на результат и подумал, что возможно, кому-то ещё, кроме меня, тоже надоело печатать: врачам, юристам, писателям, журналистам, тем, кто общается с нейросетью.
В общем, людям, которые работают с текстом целыми днями.
Но здесь начинается уже совсем другая история. Потому что сделать инструмент для себя — довольно легко. Можно простить ему практически всё. Он сделал то, что тебе нужно — отлично. А если ты хочешь, чтобы за него платил другой человек, начинается неприятный вопрос:
а ему-то зачем?
И вот на него я пока не знаю ответа. Поэтому, возможно, я действительно уделал Microsoft. Только есть нюанс. Microsoft от этого ничего не потерял. Я не сделал технологию, которая изменила рынок. Не построил новый OpenAI. Не придумал новый способ распознавания речи.
Я просто взял существующие технологии, склеил их в довольно странную конструкцию и получил инструмент, которым сам теперь пользуюсь каждый день.
Причём часть часть архитектурных решений я вообще не смог бы защитить на собеседовании.
Где-то наверняка есть костыли. Где-то решения, которые профессиональный разработчик сразу назовёт неправильными. Где-то я, возможно, вообще изобрёл велосипед.
Но велосипед ездит. И мне на нём удобно.
Самое смешное — я начинал Jupiter не для того, чтобы доказать, что человек без технического образования может заменить программиста.
Я просто хотел меньше печатать.
А в итоге обнаружил, что сегодня человек, который вообще не умеет программировать, может взять нейросеть за руку и дотащить довольно сложную идею до работающего Windows-приложения.
Не знаю, хорошо это или плохо. И не знаю, насколько долго такая схема вообще может работать.
Но Jupiter у меня работает. Я от него кайфую. А нужен ли он кому-нибудь ещё — это уже, пожалуй, самая интересная часть эксперимента.
Для тех, кто, прочитав статью, захочет его попробовать: Jupiter лежит на GitHub. Там можно скачать Windows-установщик.
https://github.com/iaroshenko-dev/jupiter-voice-dictation/releases/tag/v0.1
А я пойду пока устраиваться разработчиком ;)
Автор: Trop_12


