feat(web): голосовой ввод — запись, проверка текста, отправка #124

Merged
Eleboba merged 1 commits from feat/117-voice-web into dev 2026-10-31 11:54:45 +03:00
Owner

Что меняется

Голосовой ввод в вебе по слайду 11: «Записать → Проверить → отправить». Кнопка микрофона есть в чате и в шагах со свободным текстом. Во время записи видны волна, таймер, «Отменить» и «Остановить запись», лимит 60 с. Распознанный текст попадает в поле ввода для проверки и правки и сам не отправляется, поэтому safety и scrub() срабатывают при отправке, как обычно.

  • web/src/voice/recorder.ts: микрофон → WAV 16 кГц mono прямо в браузере, ffmpeg на сервере не нужен.
  • web/src/components/VoiceInput.tsx: кнопка и панель записи; кнопка скрыта, если voice_input=false или в браузере нет API микрофона.
  • web/nginx.conf: client_max_body_size 4m (по умолчанию 1 МБ, а минута WAV весит ~1,9 МБ).

Closes #117

Зона

web

Как проверить

Проверено сквозным прогоном в headless Chromium с фейковым микрофоном, который «говорит» синтетической речью espeak: чат → микрофон → 7 с → «Остановить запись» → в поле «Мне сегодня тревожно, я плохо спал ночью…» (живой OpenRouter, ~3–5 с). npm run build проходит.
Вручную: make up → чат → микрофон. Нужен https или localhost: без защищённого контекста браузер не даёт доступ к микрофону.

Чек-лист

  • rebase на origin/dev
  • tsc -b, vite build
  • аудио не хранится на клиенте и не логируется
  • проверка на живом iPhone (Safari)

🤖 Generated with Claude Code

## Что меняется Голосовой ввод в вебе по слайду 11: «Записать → Проверить → отправить». Кнопка микрофона есть в чате и в шагах со свободным текстом. Во время записи видны волна, таймер, «Отменить» и «Остановить запись», лимит 60 с. Распознанный текст **попадает в поле ввода** для проверки и правки и сам не отправляется, поэтому safety и `scrub()` срабатывают при отправке, как обычно. - `web/src/voice/recorder.ts`: микрофон → WAV 16 кГц mono прямо в браузере, ffmpeg на сервере не нужен. - `web/src/components/VoiceInput.tsx`: кнопка и панель записи; кнопка скрыта, если `voice_input=false` или в браузере нет API микрофона. - `web/nginx.conf`: `client_max_body_size 4m` (по умолчанию 1 МБ, а минута WAV весит ~1,9 МБ). Closes #117 ## Зона web ## Как проверить Проверено сквозным прогоном в headless Chromium с фейковым микрофоном, который «говорит» синтетической речью espeak: чат → микрофон → 7 с → «Остановить запись» → в поле «Мне сегодня тревожно, я плохо спал ночью…» (живой OpenRouter, ~3–5 с). `npm run build` проходит. Вручную: `make up` → чат → микрофон. **Нужен https или localhost**: без защищённого контекста браузер не даёт доступ к микрофону. ## Чек-лист - [x] rebase на origin/dev - [x] `tsc -b`, `vite build` - [x] аудио не хранится на клиенте и не логируется - [ ] проверка на живом iPhone (Safari) 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Eleboba added 1 commit 2026-10-31 11:45:40 +03:00
feat(web): voice input — record, check the recognised text, send
CI / ruff · pytest (pull_request) Successful in 2m24s
e20da1f21c
Microphone button in the chat composer and in free-text steps. The browser
records 16 kHz mono WAV (no server-side ffmpeg), /me/{token}/stt transcribes,
the text lands in the field for the patient to check and edit — never sent
automatically, so safety and scrub() apply on send. Hidden when the server has
voice input off or the browser lacks a microphone API. nginx: 4 MB body limit.

Refs #117

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eleboba force-pushed feat/117-voice-web from 65e3a27145 to e20da1f21c 2026-10-31 11:45:40 +03:00 Compare
Eleboba merged commit fd9df40c28 into dev 2026-10-31 11:54:45 +03:00
Eleboba deleted branch feat/117-voice-web 2026-10-31 11:54:45 +03:00
Sign in to join this conversation.