TL;DR: Всё нижеперечисленное - дурка. Чистейшей воды ОКР, смешанное с небольшой технологической подкованностью и случайно оказавшимися под руками ресурсами.

Предыстория

В какой-то момент я понял, что записываю в дневник-планировщик-календарь слишком много и у меня на это уходит слишком много времени. Ведение заметок на телефоне и синхронизация с компом не спасали. Интерфейс мобильного телефона чрезвычайно плох, 2-way-sync каким бы он не был интеллектуальным, без онлайн режима ведёт к конфликтам, а открывать свои заметки в интернет, пусть и закрывать аутентификацией - я не хочу, это дело принципа (всё ПО изначально дыряво и будет взломано, ага). Поэтому я пошёл немного другим путём.

Входящик

В git-репозитории моего дневника появилась папка “Входящие”. Она лежит в .gitignore и там есть несколько источников входящих заметок, которые нужно разобрать:

  • Телефон (заметки, сделанные в Obsidian на телефоне). Копирую тупо по USB-кабелю как файлы.
  • Telegram - копирую туда избранное в telegram и всё, что я пересылаю своему боту
  • Mastodon - чем посты в микроблог - не заметки, просто с чуть более широким уровнем публичности? У меня настроено еженедельное автоматическое удаление всех постов, кроме добавленных мной в закладки. Чего добру пропадать, зря я это всё писал? Поэтому забираю к себе. API простое как три рубля, сервер, которым я пользуюсь поддерживает длину постов в 100500 символов, поэтому иногда в микроблоге попадаются лонгриды.

Диктофон

Но все эти источники заметок очень неюзабельны, когда я не за компьютером. Особенно когда я при этом веду диалог с другими людьми. Особенно когда они пользуются не очень понятной мне терминологией (спецы по пластиковым окнам, дверям, электрики, сантехники итд). Ну серьёзно, с ними “падажжите я записываю” превращается в трату времени двух людей, а заметка все равно получается обрывочной и не детализированной. В моменте не получится сформулировать всё так, чтобы в заметке и всё необходимое осталось, но при этом только достаточное. Формулировать надо постфактум.

Я пришёл к тому, что нужен способ очень быстро записывать сырые данные, а обрабатывать их уже потом, освободив голову для того чтобы думать в моменте. В свою память я не верю лет эдак с 25. Я ещё в 22 понял, что всё, что не записано на бумаге (бумага - образное выражение физического носителя) - не существует. Ни идеи, ни договорённости не имеют никакой ценности, если они будут забыты или одна из сторон начнёт отнекиваться “ой, я ничего такого не помню, чот ты гонишь, выдумал”. Но хрен с ней с неотказуемостью, мне бы просто ничего не забыть. В итоге я пришёл к мини-диктофону.

Борьба за время

Вести заметки на диктофон тоже надо умеючи. Основная задача - научиться его вовремя включать (всё что не записано - будет забыто) и выключать (чтобы не охренеть потом разбирать это всё).

С первым всё просто, это зависит только от человека. Со вторым тоже, но я упомянул “разбирание” заметок. Записи мало делать, с ними нужно работать. С чистым голосом работать неудобно - это долго. А сейчас 2025 год, нейронки в каждый дом, видеокарта на 16гб стоит 60к (пользуюсь RTX4060Ti 16gb), будущее же!

Сейчас мой процесс работы с голосовыми заметками выглядит так.

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

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

Сперва я распознаю их с помощью vosk. Я использую модель vosk-model-ru-0.42, она весит 3.7гб в распакованном виде, долго загружается в память, но качество её работы по сравнению с стандартной ru-моделью на 50мб окупается с лихвой на дальнейших этапах. Я что-нибудь придумаю с оптимизациями, с батч-процессингом, возможно с задействованием GPU или переносом модели на файлопомойку (в которой 32гб оперативки, проц оно не сильно напрягает), но пока сойдёт.

Потом прогоняю через mistral-small:22b в ollama со следующим промптом:

## Задание

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

Вот список категорий,  к которым может принадлежать эта заметка:

- Дневник
- Айти
- Ремонт
- Дневник давления
- Дневник тренировок
- Работа
- Размышления
- Другое

## Заметка

В конец промпта приклеивается распознанная с помощью vosk заметка. Выхлоп ollama проходит дополнительную санитарную обработку, не очень я доверяю нейронке, которой в каком-то роде даётся доступ к моей файловой системе, пусть и не напрямую. Выхлоп приклеиваю к оригинальному названию файла, которое приводится к формату YYYY-MM-DD HH_MM - описание_от_ollama - категория_от_ollama. Такие заметки прям сильно ускоряют их ручной разбор.

К слову использование stdin для передачи промпта нейронке в скриптинге было для меня прям прорывом от господа. Да и модельки, размерностью больше 8b, работающие целиком локально - это просто праздник какой-то.

Дальше заметка прогоняется ещё через один промпт:

## Задача

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

1. Исправь ошибки согласования времени в предложениях.
2. Убери лишние переносы строк.
3. Расставь знаки пунктуации.
4. Числа записывай цифрами.
5. Если общая длина текста больше 100 слов, в конце выведи список необходимых от меня действий в markdown формате с чекбоксами, например "- [ ] Позвонить Васе".
6. Не добавляй новую markdown-разметку.
7. Не копируй текст задачи (то есть этот список), только обработай текст ниже.

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

Дальше уже идёт ручная работа, заставить нейронку за меня обдумывать то, что со мной произошло за день… бесполезно как-то. После причёсывания и пристраивания текста в нужное место аудиофайл удаляется. Если что-то непонятно и кто-то из парочки vosk и mistral загаллюционировал - можно по старинке переслушать свой голос самостоятельно.

Проблемы

Частенько добавляется - [ ] Позвони Васе

Иногда нейронка галлюцинирует и на пустом файле придумывает какой-то невнятный рассказ.

После выхода из suspend видеокарта не выходит из режима энергосбережения и работает в PCI-E 1.0 режиме. В таком случае Ollama молча начинает работать на CPU и это всё очень медленно. Найти способ без прав рута автоматически это определить я не нашёл. В качестве костыля помогает такое:

sudo systemctl stop ollama
sudo rmmod nvidia_uvm
sudo modprobe nvidia_uvm
sudo systemctl start ollama

Но вводить пароль посреди процесса синхронизации (в худшем случае) бесит. Вводить при каждой синхронизации заметок - тоже. Что-нибудь придумаю, но потом.

Идеи

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

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

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