Голосовой ввод в вебе по слайду 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 МБ).
Проверено сквозным прогоном в headless Chromium с фейковым микрофоном, который «говорит» синтетической речью espeak: чат → микрофон → 7 с → «Остановить запись» → в поле «Мне сегодня тревожно, я плохо спал ночью…» (живой OpenRouter, ~3–5 с). npm run build проходит.
Вручную: make up → чат → микрофон. Нужен https или localhost: без защищённого контекста браузер не даёт доступ к микрофону.
## Что меняется
Голосовой ввод в вебе по слайду 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)
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>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Что меняется
Голосовой ввод в вебе по слайду 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: без защищённого контекста браузер не даёт доступ к микрофону.Чек-лист
tsc -b,vite build🤖 Generated with Claude Code
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>65e3a27145toe20da1f21c