# Тестирование стилей обработки Talkis ## Конфигурация тестов | Параметр | Значение | |---|---| | **Язык** | `ru` (основной), `en` (дополнительно) | | **Стили** | Classic, Business, Tech | | **Модель STT** | gpt-4o-transcribe | | **Модель LLM** | gpt-4o-mini | --- ## 1. 🎯 Классический стиль (`classic`) > **Цель:** Минимальная обработка. Текст максимально близок к тому, что сказал человек. Удаляются только явные филлеры и опечатки STT. | # | Что говорим | Ожидаемый результат | На что смотрим | |---|---|---|---| | 1.1 | «Ну вот, короче, я думаю что нам нужно, ээ, переделать это всё» | «Я думаю, что нам нужно переделать это всё.» | Филлеры `ну вот`, `короче`, `ээ` убраны. Смысл сохранён | | 1.2 | «Да» | «Да.» | Короткий ввод не расширяется и не дополняется | | 1.3 | «Привет, это тестовое сообщение» | «Привет, это тестовое сообщение.» | Пунктуация расставлена, текст не изменён | | 1.4 | «Я хотел сказать что это вот такая вот штука» | «Я хотел сказать, что это вот такая вот штука.» | `вот такая вот` сохранено — может быть манерой речи | | 1.5 | «П-практичность очень важна» | «П-практичность очень важна.» | Заикание **сохранено** (ru:classic override) | | 1.6 | «Мне нужно... ну типа... закончить проект» | «Мне нужно закончить проект.» | `ну типа` убрано, многоточие очищено | | 1.7 | «Один два три четыре пять» | «Один, два, три, четыре, пять.» | Пунктуация при перечислении | | 1.8 | (тишина / шум 1 сек) | Пустая строка или `""` | Не должно быть иероглифов, рандомных символов | --- ## 2. 💼 Деловой стиль (`business`) > **Цель:** Чуть более формальный текст. Убираются речевые запинки, сглаживаются неловкие конструкции. Для писем, задач, рабочих чатов. | # | Что говорим | Ожидаемый результат | На что смотрим | |---|---|---|---| | 2.1 | «Ну вот, слушай, я тут подумал что нам бы надо, это самое, созвон назначить» | «Я подумал, что нам нужно назначить созвон.» | Филлеры и запинки убраны, формулировка сглажена | | 2.2 | «П-практичность очень важна» | «Практичность очень важна.» | Заикание **убрано** (ru:business override) | | 2.3 | «Скинь мне пожалуйста отчет за вчера, ну и ещё бы хорошо если бы ты добавил графики» | «Скинь мне, пожалуйста, отчёт за вчера. Ещё было бы хорошо, если бы ты добавил графики.» | Разбивка на предложения, `ну` убрано | | 2.4 | «Задача: проверить все API endpoints до конца недели» | «Задача: проверить все API endpoints до конца недели.» | Структурированный ввод не переписан | | 2.5 | «Можно пожалуйста полностью убрать левое меню с проекта в клиенте» | «Можно, пожалуйста, полностью убрать левое меню с проекта в клиенте?» | Вопросительный знак, запятые | | 2.6 | «Ну это, как бы, ну, ладно, давай созвонимся завтра» | «Давай созвонимся завтра.» | Вся «обвязка» убрана, ядро сохранено | | 2.7 | «Надо также обсудить бюджет» | «Надо также обсудить бюджет.» | Слово `также` **сохранено** — не филлер | --- ## 3. 💻 Разработка (`tech`) > **Цель:** Code-aware обработка. Технические термины нормализуются, код-диктовка конвертируется в каноничный код. Русская речь о технологиях обрабатывается с пониманием контекста. | # | Что говорим | Ожидаемый результат | На что смотрим | |---|---|---|---| | 3.1 | «Нам нужно использовать юз стейт для хранения данных» | «Нам нужно использовать useState для хранения данных.» | `юз стейт` → `useState` | | 3.2 | «Добавь консоль лог для юзер айди» | «Добавь console.log(userId).» | Код-диктовка конвертирована | | 3.3 | «Напиши импорт реакт фром реакт» | «Напиши import React from "react".» | Полная code-строка восстановлена | | 3.4 | «Запусти гит статус потом гит пуш origin main» | «Запусти git status, потом git push origin main.» | Команды терминала нормализованы | | 3.5 | «Открой src слеш components слеш app точка tsx» | «Открой src/components/App.tsx.» | `слеш` → `/`, `точка` → `.` | | 3.6 | «Бэкенд уже обрабатывает любое имя модели с транскрайб корректно» | «Бэкенд уже обрабатывает любое имя модели с transcribe корректно.» | Рассказ _о_ коде — остаётся прозой | | 3.7 | «Это реакт компонент, он использует тайпскрипт» | «Это React-компонент, он использует TypeScript.» | Технические имена нормализованы | | 3.8 | «Напиши конст юзер айди равно джейсон точка парс открывающая скобка response точка data закрывающая скобка» | «Напиши const userId = JSON.parse(response.data).» | Полная диктовка кода восстановлена | | 3.9 | «Сделай карго чек и потом бан ран дев» | «Сделай cargo check и потом bun run dev.» | `карго чек` → `cargo check` | | 3.10 | «Проблема в файле эй ай точка ар эс» | «Проблема в файле ai.rs.» | Расшифровка побуквенного произношения | --- ## 4. 🔇 Краевые случаи (все стили) | # | Сценарий | Что говорим / делаем | Ожидаемый результат | На что смотрим | |---|---|---|---|---| | 4.1 | Очень короткая запись | «Да» (0.5 сек) | «Да.» | Не должно быть иероглифов | | 4.2 | Шум без речи | (фоновый шум 2 сек) | `""` или ничего | Нет галлюцинаций STT | | 4.3 | Смешанный язык | «Мне нужен API endpoint для user management» | «Мне нужен API endpoint для user management.» | Англицизмы не переводятся | | 4.4 | Числа | «Двадцать пять тысяч рублей» | «25 000 рублей.» или «Двадцать пять тысяч рублей.» | Оба варианта допустимы | | 4.5 | URL диктовка | «Перейди на proxy точка talkis точка ru» | «Перейди на proxy.talkis.ru.» | URL собран | | 4.6 | Повтор слов | «Я я хочу хочу сказать» | «Я хочу сказать.» | Случайные повторы убраны | | 4.7 | Длинный текст (20+ сек) | Диктовка абзаца текста | Полный абзац, корректная пунктуация | Текст не обрезан | | 4.8 | Emoji/спецсимволы в речи | «Поставь звёздочку и плюсик» | Зависит от стиля | Нет крашей | --- ## 5. ⚡ Системные тесты (механика вставки) | # | Сценарий | Ожидаемый результат | На что смотрим | |---|---|---|---| | 5.1 | Вставка в VS Code | Текст корректно вставлен | Не буква "v", а полный текст | | 5.2 | Вставка в Telegram | Текст в поле сообщения | Фокус сохранён | | 5.3 | Вставка в браузер (input) | Текст в поле ввода | Работает в Chrome, Safari | | 5.4 | Вставка в терминал | Текст в терминал | Cmd+V работает | | 5.5 | Быстрая двойная запись (2 подряд) | Оба текста вставлены последовательно | Нет потери второго | | 5.6 | Буфер обмена восстановлен | Скопировать текст → записать → вставить (Cmd+V ещё раз) | Исходный буфер восстановился | | 5.7 | Быстрое копирование последней записи | Навести курсор на неактивный виджет после успешной транскрибации | Внутри виджета появляется иконка копирования; клик копирует последний обработанный текст и кратко показывает состояние успеха | --- ## 6. 📊 Статистика транскрибированных слов | # | Сценарий | Ожидаемый результат | На что смотрим | |---|---|---|---| | 6.1 | Базовый подсчёт | Надиктовать фразу из N слов → на главной «Слов за месяц» и «Слов всего» выросли на N | Счёт по финальному (обработанному) тексту | | 6.2 | Несколько записей | Сделать 2–3 записи подряд | Показатели суммируются, обновляются без перезапуска окна | | 6.3 | Дедуп | Повторная вставка / копирование / retry той же записи | Счётчик НЕ увеличивается повторно | | 6.4 | Скорость речи | После голосовых записей показывается «сл/мин»; до данных — «—» | Среднее = слова / минуты диктовки; файлы/созвоны не влияют на скорость | | 6.5 | Персистентность | Перезапустить приложение | Показатели сохранились | | 6.6 | Очистка истории | Очистить журнал записей | «Слов всего» НЕ обнуляется (статистика хранится отдельно) | | 6.7 | Юнит-тесты | `bun test src/lib/statsCore.test.ts` | Все кейсы зелёные (подсчёт RU/EN/CJK, дедуп, помесячно, WPM) | --- ## 7. ⌨️ Смена горячих клавиш (все ОС) Поведение должно быть одинаковым: клик по полю → нажать сочетание → применилось сразу; Esc — отмена. | # | Сценарий | Ожидаемый результат | На что смотрим | |---|---|---|---| | 7.1 | Windows: сменить на `Ctrl+Alt+K` | Сочетание применилось и сразу работает | Регресс AltGr: раньше `Ctrl+Alt+<буква>` не распознавались | | 7.2 | Windows: не-US раскладка (рус.) | Физическая клавиша распознаётся независимо от раскладки | Основная клавиша берётся из `event.code` | | 7.3 | macOS: сменить на `Command+Shift+A` | Применяется по нажатию, без «зажми и отпусти» | Раньше требовалось отпустить модификаторы | | 7.4 | Linux: сменить на `Ctrl+Shift+J` | Применилось и работает | Тот же веб-путь, что и Windows | | 7.5 | Esc во время записи | Запись отменена, прежняя комбинация сохранена | Все ОС | | 7.6 | Занятое сочетание | Показана ошибка, прежняя клавиша сохранена | Регистрация откатывается, статус «не удалось» | | 7.7 | Юнит-тесты | `bun test src/lib/frontendHotkeyCapture.test.ts` | Все кейсы зелёные (`event.code`, AltGr-регресс) | --- ## 8. ⏳ Обработка в таблице: статус, остановка, повтор Идущая обработка показывается строкой в журнале на главной со статусом «Идёт обработка…» и кнопкой ■ (стоп). После остановки/сбоя — «Обработка прервана»/«не завершилась» с кнопкой повтора. | # | Сценарий | Ожидаемый результат | На что смотрим | |---|---|---|---| | 8.1 | Длинная обработка (созвон/файл) | В журнале появляется строка «Идёт обработка…» со спиннером и кнопкой ■ | Строка видна сразу, до завершения | | 8.2 | Стоп (облако) | Нажать ■ → запрос реально отменяется, строка → «Обработка прервана» | fetch прерывается AbortController; виджет уходит в idle без спиннера | | 8.3 | Стоп (локальный движок) | Нажать ■ → строка «прервана», поздний результат игнорируется | Локальная задача добегает в фоне, но UI не обновляет | | 8.4 | Повтор прерванной (голос/созвон/файл) | Кнопка ⟲ запускает обработку заново → «завершено» | Голос — из аудио, созвон — из дорожек, файл — из пути | | 8.5 | Техсбой обработки | Строка «Обработка не завершилась» + ⟲ | Аудио/дорожки/путь сохранены для повтора | | 8.6 | Краш/закрытие во время обработки | После перезапуска «processing» → «Обработка прервана» | Реконсиляция при старте виджета | | 8.7 | Многократные клики ■ | Безопасно, без ошибок | cancelProcessing идемпотентен | | 8.8 | Юнит-тесты | `bun test src/lib/statsCore.test.ts` | processing/interrupted не попадают в статистику | --- ## Чеклист прохождения ``` [ ] Classic 1.1–1.8 [ ] Business 2.1–2.7 [ ] Tech 3.1–3.10 [ ] Краевые 4.1–4.8 [ ] Вставка 5.1–5.6 [ ] Статистика 6.1–6.7 [ ] Горячие клавиши 7.1–7.7 [ ] Обработка/стоп/повтор 8.1–8.8 ```