mirror of
https://github.com/SerTimBerrners-Lee/talkis.git
synced 2026-07-09 17:29:15 +00:00
- Words statistics on the home page (month / all-time / words-per-minute), minimalist layout - Live processing row in history with stop/cancel; retry for interrupted & failed entries (voice/file/call); startup reconciliation of orphaned jobs - Uniform hotkey editing across OSes: physical-key (event.code) capture + apply-on-keydown on macOS - Contact-support button and a GitHub link next to the version - Stop ducking other apps audio: check mic permission via the Permissions API instead of opening getUserMedia at startup - CI workflow running cargo check on macOS/Windows/Linux on push and PR
16 KiB
16 KiB
Тестирование стилей обработки 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