subochev
0cfd92a68f
Добавляем экран «Активность»: что сейчас конвертируется и скачивается
2026-09-02 22:37:31 +03:00
subochev
f656f43e10
Сохраняем прогресс просмотра и возобновляем с позиции
2026-09-02 20:55:00 +03:00
subochev
1b28760c6e
Добавляем в бейдж каталога статусы загрузки и готовности видео на очки
2026-09-02 19:53:21 +03:00
subochev
b2e2d2697d
Добавляем индикатор рассинхронизации звука и видео в статус-панели очков
2026-09-02 19:27:11 +03:00
subochev
92b483a5e3
Добавляем свёрнутый блок результата тула в чат с раскрытием по тапу
2026-09-02 02:49:48 +03:00
subochev
edf7cf63f6
Внедряем единый тул-канал для локального LiteRT и удалённого LLM-клиента
2026-09-02 02:42:00 +03:00
subochev
d5e60a2565
Заменяем litertlm-android 0.14.0 на KMP-обёртку litert-google 3
2026-09-01 18:46:18 +03:00
subochev
4587e22b50
Приложение добавляет OpenAI-совместимый HTTP-сервер и KMP-обёртку LiteRT
2026-09-01 18:45:25 +03:00
subochev
e18b82642f
audio-sync: учитывать латентность линка очки→телефон
...
Очки штампуют sentTs в PlaybackPosition; телефон мерит one-way
латентность (receivedTs - sentTs, EWMA) и добавляет её к мастер-позиции
в sync(), снимая системный перекос, из-за которого аудио недокручивало
на величину транспортной задержки. Плюс правки тестов под
HARD_SEEK_THRESHOLD_MS=5000 (остались незакомиченными с прошлого фикса).
2026-08-30 05:08:37 +03:00
subochev
b11879520e
fix(phone): поднимаем порог жёсткого seek аудио 2000→5000 мс
...
Жёсткий seekTo при |audio-video|>2000мс перебуферизировал ExoPlayer и давал
слышимую тишину (0.5-1с) + прыжок позиции. На локальном файле обычная буферная
пауза вывода пробивала порог и зацикливала seek→пауза. Порог 5000мс: умеренный
рассинхрон закрывается плавной коррекцией скоростью (бесшумно). Плюс диагностика:
лог типа источника (локальный файл/стриминг S3) и STATE_BUFFERING ExoPlayer,
и пик diff в логе seek.
2026-08-30 04:50:37 +03:00
subochev
3af74851db
feat(mercury): синхронизировать часы очков с телефоном на подключении
...
RayNeoMercury.syncTime() шлёт текущее время телефона на очки. Вызываем
на событии Connected, чтобы очки получали корректную метку сразу после
подключения — это устраняет первопричину клина лог-спула (очки стартуют
с ~1970 до NTP, Loki отвергает batch с устаревшим таймстемпом, 400).
2026-08-30 03:42:47 +03:00
subochev
1aa389a3a0
fix(log): разблокировать спул лог-коллектора при устаревших таймстемпах
...
Раньше одна пачка в спуле с таймстемпом вне окна приёма Loki (≈7 суток)
топила весь пуш: Loki отвечал 400 на весь batch, спул никогда не чистился,
и новые логи (в т.ч. телефона) не доходили. Теперь flush() выгребает ВСЕ
готовые пачки за тик (FIFO) и отбрасывает записи вне окна Loki, а при
неудаче отправки спула буфер не трогается (ждёт следующий тик). Добавлены
тесты на очистку устаревших записей и FIFO-ретрай спула.
2026-08-30 03:30:39 +03:00
subochev
6cd4a8de43
feat: управление яркостью/WiFi очков через Mercury + накопленные доработки
...
- Mercury (app-phone): управление яркостью (с авто-выкл. перед
применением) и WiFi (скан/подключение/список сетей с паролем);
добавлено право BLUETOOTH_ADVERTISE в манифест и runtime-запрос
(без него GATT-сервер не рекламируется → очки не подключаются)
- логирование (lib-core core.log): BatchingLogCollector + LogSink +
LogSpool + LokiLogSink; цепочка очки→телефон→Loki; lib-core log()
переадресован в коллектор
- STT: Qwen3-ASR через pw.binom.asr:asr-qwen3-android, убран in-house
whisper-фоллбек
- audio-sync: P-регулятор с насыщением вместо фиксированной скорости
- media-split: очки только video, телефон только audio (UI-чипы)
- Components: форматирование размера через Locale.ROOT
2026-08-29 23:06:52 +03:00
subochev
62d2f06797
soft sync audio via PlaybackParameters speed (rate-based, no seekTo jump)
...
Master = glasses (5s PlaybackPosition), slave = phone audio.
Replace aggressive seekTo-drift-corrector with smooth tempo correction:
- |diff|<=150ms (TRIGGER_BAND) -> speed 1f (hysteresis, no flutter)
- audio lags -> speed 1.02 (catch up)
- audio ahead -> speed 0.98 (slow down)
- |diff|>2000ms -> rare hard seekTo + reset speed 1f
- removed catch-up seekTo after +1s (was adding ~2s error)
- log now prints speed
AudioSyncPlayerTest: 18 cases (boundaries 150/2000, speed up/down/1f, play/pause).
2026-08-27 23:23:50 +03:00
subochev
cf8c5ef604
ui(phone): переключение сессий ступенчатым свайпом (порог 120dp, ±1 сессия за жест) + крупнее текст сообщений (14→20sp)
2026-08-27 18:46:31 +03:00
subochev
236ff18543
ui(glasses): оверлей ассистента накрывает весь вьюпорт (fillMaxSize, непрозрачный чёрный) — независимо от масштаба и регулятора «Высота» видео
2026-08-27 18:46:31 +03:00
subochev
412e093174
ui(glasses): отмена первой записи не закрывает оверлей — возврат в «слушаю», диалог жив даже при пустой истории; выход из режима — только явный жест ExitMode
2026-08-27 18:46:29 +03:00
subochev
da8182443c
stt(phone): SttDebug переведён на Qwen3-ASR-0.6B (отладочный прогон wav)
2026-08-25 21:30:09 +03:00
subochev
17385d1784
stt(phone): Qwen3-ASR-0.6B int8 вместо whisper-small (константа STT_BACKEND, hotwords тулсет/тулы/умеешь) — откат в одну строку (opencode по ТЗ)
2026-08-25 19:57:33 +03:00
subochev
98ac84ffe8
stt(phone): сегментация буфера на фразы перед whisper (лимит ≤30с) — длинные сессии распознаются целиком, фразы склеиваются пробелом (opencode по ТЗ)
2026-08-25 18:09:56 +03:00
subochev
ac56e70283
stt(phone): VAD удалён (резал рваный микрофон очков) — полный буфер + trimEdges + хвост 120с + авто-финиш по тишине 30с (opencode по ТЗ)
2026-08-25 03:45:42 +03:00
subochev
4e60e11d24
stt: дамп закрывает цикл в finally (нет Stream Closed при стопе)
2026-08-25 03:13:27 +03:00
subochev
b0baa19e7d
stt: полный поток без VAD (резал речь на рваном ARGT78) — whisper распознаёт сырой поток (проверено: 1-10 идеально), усиление ×3, сырой дамп
2026-08-25 03:12:04 +03:00
subochev
d34d15ecef
stt(dump): сырой WAV всего потока микрофона (до усиления/VAD) — что реально слышат очки
2026-08-25 03:00:47 +03:00
subochev
19fe1b34bc
stt(mic): возврат на 16 кГц (48 кГц молчит на ARGT78); VAD на сыром + gain ×5 остаются
2026-08-25 02:59:00 +03:00
subochev
1009713a28
stt(mic): 48 кГц как pair-view + VAD на сыром сигнале + усиление ×5 без клиппа + FIR-даунсэмпл 48→16
2026-08-25 02:55:42 +03:00
subochev
0f235da0ed
Высота — только для видео: ассистент/коннект-экран следуют масштабу, но всегда у верха
2026-08-25 02:43:45 +03:00
subochev
74701a2108
Панель статуса сдвигается к носу вместе с контейнером (panelOffsetX): центр панели = центр контейнера
2026-08-25 02:39:43 +03:00
subochev
4f4a551c91
Панель времени/заряда: масштабируется как контент, но прибита к низу экрана
2026-08-25 02:35:24 +03:00
subochev
80236902ba
Панель времени/заряда: шрифт фиксированный (scale=1f) — не сжимается вместе с масштабом контента
2026-08-25 02:31:28 +03:00
subochev
d113ffd744
Панель времени/заряда: оверлей-слой поверх контента, у низа экрана — стабильно при любом масштабе
2026-08-25 02:28:00 +03:00
subochev
8958370507
Панель времени/заряда — вне контейнера, всегда у верха экрана (не повисает между верхом и видео при vertical=0)
2026-08-25 02:24:57 +03:00
subochev
883fd8e5e4
Высота: видео в контейнере прижимается к верху/низу по vertical (Row-центрирование съедало вертикаль)
2026-08-25 02:15:48 +03:00
subochev
6d22f56bd8
Регулятор «Высота» экрана очков (0..1, с учётом масштаба): SetVertical по протоколу, offset Y в кино/коннект/оверлее, слайдер на пульте
2026-08-25 02:11:01 +03:00
subochev
b17b5bf424
stt(glasses): VAD на очках (WebRTC, схема pair-view) — речевые сегменты с пре-роллом, межфразовая тишина не шлётся
2026-08-25 01:51:57 +03:00
subochev
d78ed4429e
stt(mic): микрофон на 48 кГц (нативная частота) + даунсемплинг 48→16 — рваность ARGT78 давала ровные провалы 100 мс
2026-08-25 01:39:12 +03:00
subochev
032424f513
Mercury: enable heartbeat on connect (keeps link alive), autolock endpoint
2026-08-25 01:15:00 +03:00
subochev
4556d3b6e4
Mercury: verify handshake echo, autolock endpoint, ringInfo-safe status
2026-08-25 00:54:31 +03:00
subochev
b40e44c653
DebugHttpServer: Mercury BLE-эндпоинты (/mercury/status|connect|disconnect|screen/off|screen/on)
2026-08-24 23:24:07 +03:00
subochev
d674b31a81
Внедрение rayneo-mercury: зависимость + MercuryPanel (BLE-тест: погасить/включить экран)
2026-08-24 23:19:37 +03:00
subochev
c222a4ac76
stt(phone): полный текст по клику — whisper на всём буфере, VAD только для промежуточных фраз
2026-08-24 22:11:08 +03:00
subochev
e21c27b0ee
stt(dump): WAV-заголовок — размеры little-endian (плееры открывают дампы)
2026-08-24 21:36:53 +03:00
subochev
0d79b5aa33
stt(mic): усиление микрофона очков ×10 — VAD/Whisper видят речь (пустая фраза)
2026-08-24 20:57:06 +03:00
subochev
40edd88c1d
stt(mic): вынести кадровую арифметику в micChunkBytes + регрессионные тесты MicChunkTest
...
- CHUNK_BYTES=3200, micChunkBytes(buf, frames): кадры read() -> байты (*2)
- 4 теста: полный чанк 3200 Б без копирования, короткий read,
документация старого бага (copyOf(кадры) = полка), inFrameCount=1600
2026-08-24 12:23:33 +03:00
subochev
fc84ba16b6
stt(mic): request frames in frames (inFrameCount), not bytes — each chunk now carries full 100 ms
2026-08-24 11:10:05 +03:00
subochev
c940a7e0eb
stt(mic): AudioRecord.read возвращает КАДРЫ, а не байты — не терять вторую половину каждого 100-мс чанка (впечатление 'пропускает через один')
2026-08-24 11:08:27 +03:00
subochev
22eb83fd17
stt: debug-дампы аудио-пути (очки: сырой микрофон в WAV; телефон: принятые PCM) по старту от stt_dump.marker
2026-08-24 05:58:59 +03:00
subochev
c1c169036a
stt: VAD-интерфейс (Sherpa боевая / Silero тестовая), PhraseRecognizer (Whisper), чистый full-text-тест на реальном Silero VAD
2026-08-24 05:43:29 +03:00
subochev
7557d7229f
Очки: отмена слушания двойным тапом — SttCancel reason=cancel
2026-08-24 03:01:55 +03:00
subochev
504e66f0c6
Очки: красный индикатор записи микрофона в режиме «слушаю»
2026-08-23 21:58:36 +03:00