惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
量子位
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Schneier on Security
Cisco Talos Blog
Cisco Talos Blog
T
ThreatConnect
J
Java Code Geeks
博客园 - 司徒正美
A
Arctic Wolf
T
True Tiger Recordings
C
Cybersecurity and Infrastructure Security Agency CISA
Cyberwarzone
Cyberwarzone
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
V
Vulnerabilities – Threatpost
Recorded Future
Recorded Future
P
Palo Alto Networks Blog
The Hacker News
The Hacker News
The Register - Security
The Register - Security
S
Securelist
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
Application and Cybersecurity Blog
Application and Cybersecurity Blog
I
Intezer
P
Privacy & Cybersecurity Law Blog
Scott Helme
Scott Helme
K
Kaspersky official blog
博客园 - 聂微东
Last Week in AI
Last Week in AI
V
V2EX
小众软件
小众软件
F
Fox-IT International blog
Martin Fowler
Martin Fowler
Apple Machine Learning Research
Apple Machine Learning Research
T
Tenable Blog
F
Future of Privacy Forum
Microsoft Security Blog
Microsoft Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
腾讯CDC
Stack Overflow Blog
Stack Overflow Blog
C
Check Point Blog
阮一峰的网络日志
阮一峰的网络日志
GbyAI
GbyAI
T
Threatpost
I
InfoQ
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
T
Tor Project blog
G
GRAHAM CLULEY
D
DataBreaches.Net

Все публикации подряд на Хабре

Оверинжиниринг, потопивший немецкую подлодку или некоторые «баги» не чинятся десятилетиями Как ставить цели и не забывать о них: пошаговая система с примерами в таск-менеджере Как настроить observability в Spring Boot 3 HackTheBox. Прохождение Mini Pro Lab Puppet Обзор серверного ускорителя NVIDIA Tesla V100 16 Gb в корпусе от RTX 4090: Часть 3 — Запуск локальных моделей ИИ Редактирование текста нейросетью: как сделать диплом и курсовую более человечными Самодельный ARM ноутбук, реально ли? Как 100+ авторов пишут 100+ процессов в 3 версиях и не путаются. Или как мы переехали с Wiki на Git Прошла AnalystDays – хорошие выступления и нетворкинг VSCode как IDE для embedded разработки Моделирование широкополосной антенны с двойной круговой поляризацией и высокой изоляцией Ваше прошлое физически существует прямо сейчас. И вы заморожены там навсегда От списка инструментов к technical output: как security engineer’у описывать hands-on опыт в CV и на интервью I just want an agent. Часть 1. Как я научил ИИ собирать ИИ-агентов за пользователей и выиграл конкурс I just want an agent. Часть 1. Как я научил ИИ собирать ИИ-агентов за пользователей и выиграл конкурс Вайбкодинг спас меня от подрядчиков. А потом я поняла, что сама стала подрядчиком для своих агентов Святой Августин и GAN: почему борьба добра и зла — это генеративная состязательная сеть В каждом QR-коде зашита половина лишней информации. Намеренно Я открываю автомат ключом, меняю рулон бумаги и зарабатываю 180 тысяч в месяц с точки Мастер восстановления. Культура достиженства и выгорание Недельный геймдев: #279 — 24 мая, 2026 Защита от дублирования кода агентами: семантические концепции Frontend Status: свежий дайджест фронтенда и AI — 25.05.2026 Где искать IT-работу кроме HH: подборка платформ 2026 Почему простые числа собираются в спирали? OCR для Data Lakehouse: от Apache Tika к собственному решению на базе Docling Jira — Тьюринг-полная Kubernetes-аудит после Wiz и Prisma: как живут без CNAPP в 2026 «Тестируем MVP в 4 раза быстрее»: как нейросети изменили жизнь предпринимателей На каком стеке и железе работает умное наблюдение в вашем городе: обзор технологий от разработчиков видеоаналитики Как мы ускорили согласования на двух заводах в 24 раза Heartbeat-мониторинг cron-job'ов: dead-man-switch на FastAPI [Перевод] Сегодня нет джуниоров, а в 2031 году не станет и синьоров Профайлер для PostgreSQL: от идеи до работающего MVP за сутки [Перевод] Ограничения размера cookie в ASP.NET Core в продакшене: причины и способы решения Проблема «божественного» Obsidian: почему я отказался от централизованного подхода в работе Лицензии GNU GPL: как пройти проверку Минцифры и заказчика для госзакупок и КИИ Хакатон Samsung IT Academy Hack 2026: как студенты оптимизировали поиск в корпоративном мессенджере Хакатон Samsung IT Academy Hack 2026: как студенты оптимизировали поиск в корпоративном мессенджере MTProxy jumper — делаем автоматическое переключение прокси-серверов Telegram Ты уже используешь агента. Просто не заметил Книжный салон. Послевкусие и благодарности Как отлаживать мини‑приложения в MAX и почему без DevTools это боль Cбор биометрических данных. Как защищается наша биометрия на практике Как запустить учет активов без цифровой свалки: первые 90 дней CGE: визуализация кравлера и скрытых связей между поддоменами Зачем банки тратят миллиарды на науку (спойлер: не благотворительности ради) Книга: «Современный Java Concurrency. Глубокое погружение в Virtual Threads, Structured Concurrency и Scoped Values» Как использовать подписку ChatGPT и Claude в Cursor без оплаты за API токены Специализированная ИСУП или модуль в универсальной платформе: вот в чем вопрос Обход белых списков через WebRTC на стероидах (с поддержкой iOS и десктопа) Регата INFOSTART CIO CAMP: когда команда проверяется не в переговорной, а на воде Пет-проект, который не умер: система бронирования устройств как полигон для AI-разработки Не надо встраивать ИИ в каждую корпоративную систему, это архитектурная ошибка Нейросети для дизайна интерьера: Выбираем лучший ИИ для генерации концептов и планировок квартиры Что там с Ил-114-300 Что такое DAS: как и зачем продукт-менеджеры саботируют запуск новых продуктов 8% компаний измеряют критическое мышление руководителей. Что делают остальные 92% CVE, Shell и побег из контейнера: испытываем возможности PT Cloud Application Firewall Как я научил Алису петь: генерация музыки по голосовой команде Восстановление данных с помощью бесплатной утилиты Easy Disk Checker Как мы построили сквозную аналитику в Power BI Год разработки iOS-игры, 266 тысяч показов и $33: как я делал Vault и почти ничего не заработал Ты прокрастинируешь потому, что избегаешь напрасных усилий, а не чрезмерных нагрузок Я построила диагностику «стоит ли это автоматизировать» — и она трижды говорила глупости. Разбор ошибок Как устроены world models, что показал Google на прошлой неделе и где это меняет gamedev и робототехнику Двухдневная рабочая неделя — будущий стандарт CPU не умер, он просто ждал. Китай строит двухэксафлопсный суперкомпьютер без единого GPU — прорыв, необходимость, фейк? 3Sound: поиск бесплатных звуков для игр больше не боль? 3 Тбит/с по-русски: почему DDoS в 2026 году стал угрозой для любого бизнеса 10 Гбит/с — зачем вам такая скорость передачи данных в облаке Ремонтируем аналоговый XY-самописец Endim 622 [Перевод] IPO компании SpaceX: хорошая попытка, но нет «Ща будет шрифт»: история одного русского embedded‑шрифта Как аквариум на подоконнике превратился в full-stack платформу с AI GiftsHub — из чат-бота в полноценный backend-продукт Пиратство, копирайт и DMCA: как Napster, The Pirate Bay и YouTube изменили закон. Часть II Как найти внутренние резервы для развития предприятия Как один французский чиновник от безысходности начал платил зарплаты картами и практически изобрёл банкноты RAG в энтерпрайзе: почему демо работает, а прод нет AI-агент для финансовых процессов: как мы научили ИИ считать числа из базе данных без галлюцинаций Автопостинг на 8 платформах: архитектура waterfall, custom publisher'ы и API-ловушки Кинетика против бронзы: Почему Голиаф был обречен в дуэли с Давидом [Перевод] Масштабирование LLM: от одного чипа до ЦОДа. Глава 2. Шардинг LLM не работает за вас. Она работает с вами Чем лучше защищает минеральный SPF, тем страшнее он выглядит Стимпанк как часть жизни. История паровых двигателей и место, которое они занимали в мире в XIX-XX веках. Часть 1 Гастарбайтеры ворвались в IT и зарабатывают на рекламе: тут вам не снег лопатой кидать Новые методы и инструменты: как мы обновили курсы по тестированию в Яндекс Практикуме Java 21 в стиле «клятый энтерпрайз» на одноплатном компьютере возрастом 13 лет Ваши секреты внутри LLM. Куда уходят промпты и чего стоит опасаться? 10× труда. 10% к бонусу. Главный риск AI-эпохи — это сениор AI-инженер, который умеет считать Сапожник с сапогами Минимум, который удержит тебя на плаву в период дедлайнов Как без проблем переносить курсы между платформами? Обзор формата SCORM Когда Claude Code ошибается не по своей вине: документационный долг в соло-проектах 70% кода с AI — и ни на день быстрее qrrot — база данных со встроенным ИИ Шахматные программы V. Оценочная функция Восстание масс в обществе спектакля и отчуждение труда в царстве количества: что делать во времена всеобщего упадка?
Как я решил проблему русской диктовки для ИИ
DimasOdessa · 2026-05-26 · via Все публикации подряд на Хабре

Как я решил проблему русской диктовки для ИИ

Уровень сложностиПростой

Время на прочтение5 мин

Охват и читатели114

Кейс

image.png

Проблема

По мере погружения в ИИ и вайб‑кодинг, я столкнулся с одним неудобным моментом — отсутствием возможности диктовать на русском языке в некоторых программах. И если OpenAI в своем приложении позаботились об этом, то в Anthropic такой возможности на тот момент просто не оказалось. А мне уже так понравилось, откинувшись на спинку кресла с чашкой чая, надиктовывать промпты без клавиатуры.

Но я быстро нашел выход, хоть и костыльный — просто диктовать свой текст в окошке GPT, потом копировать его и вставлять в Claude. Вроде несложно, но и удобным этот метод я бы не назвал. И я задумался, как этот процесс оптимизировать.

И какая же идея могла прийти в голову в 3 часа ночи человеку, который полжизни занимается программированием? Ну конечно же — разработать свое приложение.

Посоветовавшись с Claude и GPT, я набросал небольшой план и приступил к разработке.

Поскольку я работаю на macOS, то для начала не стал заморачиваться с мультиплатформенностью и решил делать все на Swift.

Первая версия приложения

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

Расшифровка происходила через сервер OpenAI. Этот функционал я реализовал достаточно быстро. Но, как оказалось, это тоже не совсем удобно. Постоянно искать окно на экране, кликать по нему…

Тогда я решил пойти дальше и добавить хоткеи, по которым будет запускаться запись голоса, а после остановки расшифрованный текст будет вставляться в то место, где сейчас находится курсор.

По умолчанию я сделал активацию микрофона на правый Option. Правда, не был уверен, что это лучший вариант, поэтому на всякий случай добавил в настройки возможность смены горячей клавиши.

image.png

Блок настроек горячих клавиш

И знаете, это оказалось действительно удобно. Получился аналог диктовки в GPT, только теперь это можно было использовать вообще в любом месте, где можно вводить текст, и в любой программе.

Автоматический перевод

Но диктовка на русском — это хорошо. А что делать, если нужно ввести промпт на английском?

Тогда я решил добавить автоматический перевод диктовки, который можно включить прямо из окна приложения. Перевод также осуществляется через OpenAI.

Казалось, теперь все работает отлично, если бы не два «но»…

Во‑первых, периодически текст распознавался вообще без знаков препинания. Во‑вторых, некоторые термины из программирования распознавались неправильно, и в итоге получалась какая‑то ерунда.

Первую проблему удалось решить путем добавления вводного промпта с примером того, как именно нужно расшифровывать текст.

А вот со второй пришлось немного помучаться.

Словари терминов

Сначала Claude предложил создать глоссарии терминов и добавлять их в начало промпта. В принципе, это работало, но, во‑первых, там было ограничение на 800 символов, и не все термины помещались, а во‑вторых, иногда из‑за этого расшифровка происходила не на том языке, на котором я говорил.

И тут я вспомнил, что всё‑таки «я же программист», и до эпохи ИИ подобные задачи как‑то решались обычным поиском и заменой в тексте.

Тогда было принято решение создать словари алиасов в таком формате:

image.png

Пример из словаря

Т. е. ищем по тексту aliases, и если находим, то заменяем их на значение из canonical.

Составить такие варианты мне помог Claude, и в прицнипе справился с этим неплохо. Только некоторые моменты пришлось руками поправить.

Ну и я не удержался, чтобы не попросить Claude накидать еще словарей под разные профили — на случай, если я решу поделиться приложением с коллегами.

И о чудо — «пул реквест» начал превращаться в «pull request». Тут уже стало вырисовываться вполне годное приложение.

Неожиданные проблемы

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

Я добавил:

  • звуковые уведомления при активации микрофона;

  • настройку громкости;

  • более аккуратный интерфейс;

  • мультиязычность;

  • всякие удобные кнопки, настройки и так далее

И тут внезапно заметил, что при молчании в микрофон иногда получаю расшифровки вроде «редактор субтитров».

Погуглив, я узнал, что это довольно распространенная проблема. Видимо, модель обучалась в том числе на субтитрах с YouTube. Причем подобных фраз оказалось довольно много.

Поэтому пришлось создать еще один словарь — уже со словами‑исключениями, которые автоматически вычищаются из результата распознавания. Это полностью решило проблему.

Локальные модели

Следующим шагом захотелось прикрутить локальные модели на случай, если не будет доступа к интернету, а расшифровка все‑таки понадобится.

Тогда я организовал интеграцию с локальными моделями openai_whisper.

image.png

Локальные модели ИИ для транскрибации

Конечно, работают они не так хорошо, как распознавание на серверах OpenAI, но как запасной вариант — вполне достойно. А главное, в таком режиме мне вообще не нужно платить за токены. Хотя даже при использовании OpenAI API у меня выходит максимум в день около 11 центов в день, и это при активном использовании.

image.png

Сколько я плачу OpenAI в день за транскрибация голоса

Журнал записей

Во время тестирования я столкнулся еще с одной проблемой. Если из‑за какого‑то сбоя расшифровка не проходила успешно, то все, что я надиктовал, просто исчезало бесследно.

И это было очень неприятно.

Решением стало хранение журнала голосовых записей. По умолчанию я сохраняю три последние записи.

image.png

История расшифровки

То есть даже если расшифровка не удалась или локальная модель отработала плохо, я всегда могу повторить обработку с помощью другой модели. На практике это оказалось гораздо удобнее.

Дополнительная обработка текста

Более того, я добавил дополнительный слой ИИ‑обработки на случай, если захочется еще сильнее улучшить качество распознавания.

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

Эту функцию я сделал опциональной, так как в большинстве случаев она вообще не требуется.

Требования к железу и производительность

Мой основной компьютер — MacBook Pro на M4 Pro с 24 ГБ ОЗУ. На нем все буквально летает. Локальные модели работают стабильно, хотя по ощущениям они все же на 20–30% медленнее, чем распознавание через облако OpenAI.

Также я протестировал приложение на старом MacBook 2018 года с Intel‑процессором и 8 ГБ ОЗУ. Существенной разницы при обычной работе приложения я не заметил. Однако при попытке использовать локальные модели приложение начинало падать.

В итоге я решил оставить поддержку локальных моделей только для Mac с M‑процессорами.

Итог

В итоге у меня получилось вполне достойное приложение, которым я теперь постоянно пользуюсь.

Более того, мне на столько понравился результат, что я думаю попробовать превратить приложение в полноценный продукт. Но об этом я, пожалуй, расскажу уже в следующей публикации, а то эта и так получилась больше, чем я планировал.

Всем спасибо за внимание! Буду рад фидбеку, идеям и просто мнению со стороны.