Дневник 3.0
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, оставив её на случай, если скрипт не нашёл подходящей категории по ключевым словам. Кажется в таком случае время обработки заголовков немного сократится.