Доделать GUI
- +Чтобы Катру можно было перемещать по левому клику
- +Чтобы правый клик открывал бы меню (как делать коллбеки на эти пункты?)
- Собирать меню (системное/дебаговое) по правому клику на основе плагинов и коллбеков
- +Сделать базовое окно диалога для текста
- +В диалоге текст показывается с анимацией посимвольно
- +Анимация (мигание)
Сделать систему плагинов
- +Какой-нибудь стандартный формат для API
- +Плагины на питоне, каждый цикл пробегать по всем методам on_tick в плагинах
- +Сделать on_boot/on_close, который исполняется один раз. on_boot это не init, в init техника, в on_boot поведение - не забывать ожидание после on_close -- start/stop plugin
- +Может использовать какой-то сторонний планировщик?
Сделать поведение
- +Движок для наложения слоёв
- +Слои накладываются с анимацией (периодичность)
- +Наложенные слои -- теггировать по именам (файл с конфигурацией эмоций)
- +Сделать файл с рандомными фразами
- +делать перенос строки
- +"Сейчас %(hour24), %(username)." - говорить сколько сейчас время
- "Очень важно поддерживать режим." -- разные фразы в зависимости от времени (реализовать в hour_dialogue_plugin)
- normalboottalk -- приветствовать в зависимости от времени дня, прощаться - желать хороших снов
- +Убрать (пока нет системы настроения) mouth с тэгом bad из рандомной ротации
- Ты её гладишь (средняя кнопка мыши, без разницы пока где) -- она улыбается и смотрит на тебя
- Несколько вариантов часового диалога
- Попросить сфокусировать взгляд на тебе
Общий шаблонизатор строк
- +Все строки в одном файле с айдишниками
- +Сделать возможность внедрять теги с эмоциями и %username, %hour24 переносом строки
- +У каждой строки несколько вариантов
- +Шаблонизатор генерирует как эмоцию изменить, что писать текстом и что отправлять в tts -- то есть сейчас отправляет из render_text события в очередь выражений - фильтр face
- +У каждого варианта есть опциональные рандомно включаемые варианты -- Сделать рандомными части диалогов. То есть строчка одна, но она может комбинироваться - фильтр optional
Управляемые выражения лица
- +Проще не мутить forced выражения лица, а иметь очередь выражений (LIFO). Элементы очереди -- набор нужных слоёв с временем удержания эмоции
- +Рендерить слои динамично
- +Blink plugin не трогать
- +По тику генератор рандомных выражений смотрит чтобы у очереди была всегда величина >=1, если меньше -- добавляет рандомное выражение
- +Консумер выражений берёт из очереди выражение (если пуста -- то ничего не делает), применяет open/closed_eyes состояния (если глаза закрыты они совпадают), и делает следующий свой тик исходя из времени
- +Если нам нужно зафорсить выражение лица -- мы вызываем прокси-метод, который вызывает tick в плагине
Динамический discovery картинок и сборка выражений из слоёв
- +dicovery слоёв (его ключ и значение типа mouth=shut) будет по regex с именованными группами, который будет задан в конффайле
- +тот, кто хочет изменить эмоцию, передаёт словарь с этими элементами ключ=значение, и мы их собираем в переданном порядке
- +короче, файл с эмоциями. для каждого слоя сделать один или несколько возможных вариантов. будет эмоция random со всеми сочетаниями
- +если ты хочешь зафорсить какое-то конкретное выражение лица (например, "смотрит вперёд"), ты указываешь в этом файле ещё одну эмоцию
- В теге expr сделать возможность указывать вторым параметром время (строку или число)
Доработать последовательность выхода
- +Избавиться от
self.w.config['exit_initiated']
, пусть каждый плагин сам себе ставит этот флаг, если ему нужно - +dialogue: on_exit ставит флаг внутри плагина, если диалог есть -- он сразу закрывается, открывается диалог с прощанием, после рендера он готов закрываться
- +voice: on_exit ставит флаг внутри плагина, если сейчас есть активный tts, он останавливается, говорится диалог с прощанием, после окончания он готов закрываться
Технические штуки
- +Сделать папку с плагинами
- +Сделать наследование плагинов (конфиг, self.w, tick с зацикленностью)
- +Сделать динамическую инициализацию, но писать
__all__
= [], чтобы можно было задавать порядок без заморочек с зависимостями -- к чёрту порядок, пусть через очереди общаются - +Чтобы можно было обращаться к экземпляру класса плагина напрямую (ссылка на экземляр где-то хранилась)
- +наверное плагины говорения будут через очередь передавать диалоги на плагин отображения, очередь тоже в global state
- +нужно сделать on_start, который бы запускал плагины (в частности expr_prod) после инициализации всех плагинов
- +Делать strip() от диалога, и если он пустой, то ничего не выводить (мб мы хотим только поменять эмоцию)
- +Сделать общий диспетчер сигналов
- Чтобы voice plugin мог по сигналу обрывать tts (попробовать вернуть его в общий цикл со своего потока)
Технические костыли:
- Как поддерживать выражение лица? Можно ставить очень долгий таймер, а потом его сбрасывать
- Свой фильтр optional не нужен, потому что есть random от списка с фразой и пустой строкой
Рефакторинг конфигурации
- Сделать одну папку для конфигов в yaml, из которой бы они все автоматически загружались и объединялись в один
- Отдельный yaml с значениями, которые бесполезно перезагружать динамически. Остальное проверить что реально будет обновляться
- Динамический (по команде) релоад конфига и файла со строками
- Объединять конфигурацию на основе плагинов, которые её используют
Помодоро
- Из yaml подгружаем настройки: время работы/отдыха/количество перед большим/длительность большого
- Включаем помодоро -- идёт отсчёт рабочего. Мы можем сделать/отменить перерыв (таймер в 0), добавить/вычесть 5
- *Рабочий таймер, прежде чем начаться, отслеживает активность мыши/клавиатуры
- *Во время рабочего промежутка вайтлистим окна, по остальным Катра начинает делать замечание
- Где-то в углу (изображения Катры, не диалога) отображается таймер. Можно выбирать проценты или время
- Срабатывание таймера -- сначала звуковой эффект (разные, задаются в настройках, взять из eyes relax), потом Катра говорит об этом
Более сложный gui
- Клик по диалогу закрывает его
- Двойной клик по Катре -- диалог с пунктами меню (которые собирается на основе плагинов)
- Сделать окно диалога (которые собирается на основе плагинов), он будет единый для диалога по дабл-клик
- То есть Катра может начинать диалоги с вариантами ответов и ветвлением
- Не делать бесполезные окна с конфигурацией, пусть лучше Катра показывает какие конфиги есть и открывает их в блокноте, и перезагружает их после
Барьер
- Сделать "барьер" -- словарь с семафорами, в который плагины будут писать по готовности начать рендер -- чтобы голос/текст/выражение лица стартовали синхронно
- При старте все будут false. Это будет не динамический словарь, мы его элементы будем задавать в main
- Если плагин готов начать отрисовку, то он ставит свой флаг в true и с малой задержкой начинает ждать в цикле проверять готовность остальных
- Когда мы полностью отрисуем всё, и будем готовы сбрасываться при новом диалоге, компоненты будут устанавливать свой флаг в false
Неясно насколько нужные технические штуки
- Сейчас у нас dialogue_plugin диспатчит по другим очередям, можно делать on_dialogue во всех плагинах, и чтобы они добавляли в свои очереди, и сразу воспроизводили типа
- Реализовать (когда будет потребность) чтобы можно было символами и голосом разное содержимое воспроизводить
- Возможность менять эмоции посреди диалога: передавать в dialogue_plugin в очереди dialogue_queue строку с управляющими символами и массив с эмоциями, чтобы при iter если эмоция, то dialogue_plugin пушил бы её
- Можно передавать в шаблонизаторе какой-то свой набор слоёв вместо заранее заданного (фильтр raw_expr?)
Возможности
- +Синтез голоса
- Чтобы она говорила идти тренироваться, спрашивала результаты и вела дневник
- Чтобы можно было рассказать ей про свой режим, и она бы помогала поддерживать его
- Чтобы она что-то делала (читала, следила за тобой)
- чтобы она периодически спрашивала настроение и выбирала соотв фразы -- поддерживающие, мотивирующие
- Чтобы у неё было своё настроение (выбор эмоции был бы не случайным), и ты бы его типа менял своими действиями
- Когда наводишь на неё мышку, она в любом случае начинает смотреть на тебя и улыбаться, типа ты можешь захватить внимание
- Система настроения -- можно повышать например "гладя по голове" (средняя кнопка мыши), то есть это уже регионы тела как в shimeji
- Портит настроение если что-то делать неправильно (сидеть ночью, например) или
- Попробовать ещё раз сделать захват заголовков активных окон и реакцию на них
- Локальное хранилище sqlite с синхронизацией через яндекс-диск
- Чтобы Катра могла чем-то заниматься. Хоть книгу читать (сделать background просто как первый слой наложения)
- Слушай, а пусть она мне рандомную картинку показывает иногда из папки с мемами
- Вообще если честно, то я хочу иметь возможность испортить ей настроение, сделать больно, неприятно, разозлить, обидеть
- Спрашивать её да/нет/может быть etc - на простых вероятностях
- Игры с Катрой (https://www.tutorialspoint.com/artificial_intelligence_with_python/artificial_intelligence_with_python_gaming.htm) от текстовых до крестиков-ноликов
- Можно попробовать взаимодействовать с Replika API через затравку диалога?
- Одежда?
- Чтобы она могла блокировать веб-сайты как-то, отключать компьютер, типа focus mode во время pomodoro
- говорить сколько осталось до сна вместе с тем сколько часов
- horny/emegrency mode
- При старте она бы показывала чеклист с какими-то вещами (принципами), чтобы я не забывал про них
Вообще подумай, что ты можешь сделать логичным, при этом рандомным?
- Смена эмоций на лице, моргание
- Влияние событий (добавлять какой-то шум, чтобы поведение не было 100% детерминировано)
- Рандомные фразы (и диалоги). Комбинирование частей фразы.
- Чтобы она что-то делала сама
- Чтобы она рандомно просила тебе отдохнуть пару минут во время таймера помодоро, останавливала бы таймер
Интересные идеи
- Катра -- кошка. Кошки боятся собак, гоняются за мышами, любят сидеть в коробках, ещё просят часто чтобы их покормили и куда-то выпустили
- Ещё кошки мурчат, шипят, если очень злые -- воят. Ещё они иногда хотят играть и ласки.
- Кошки балдеют от кошачьей мяты и валерьянки
- Кошки следят за птицами
- Кошки умываются, вылизывая себя