Skip to content

uk Translation

wiki-sync edited this page Apr 15, 2026 · 1 revision

Локальна система перекладу

SelenaCore використовує Argos Translate для повністю офлайн перекладу між мовою користувача та англомовним внутрішнім ядром.

Навіщо переклад

Внутрішня мова голосового пайплайну — англійська. Це свідоме рішення яке дозволяє:

  • Використовувати компактні LLM-промпти для класифікації інтентів (~200 токенів замість 1700+) — локальні моделі 1-3B справляються
  • Не перекладати промпти при зміні мови (нуль LLM-викликів)
  • Один каталог інтентів/пристроїв/кімнат для всіх мов користувача
  • Уникнути плутанини мов та транслітерації від LLM

Маленький офлайн перекладач на краях (після Vosk STT, перед Piper TTS) з'єднує мову користувача з англійським ядром.

Пайплайн

Vosk STT → "увімкни світло на кухні"
   ↓
[InputTranslator] uk→en  ~200мс прогрітий
   ↓
"turn on the light in the kitchen"
   ↓
IntentRouter (англійський промпт, англ. LLM, англ. інтенти)
   ↓
result.response = "Turning on the kitchen light."
   ↓
[OutputTranslator] en→uk  ~200мс прогрітий
   ↓
"Вмикаю світло на кухні."
   ↓
preprocess_for_tts (числа → українські слова, нижній регістр)
   ↓
Piper TTS → аудіо

Якщо translation.enabled=false або модель не встановлена — обидва перекладачі повертають текст без змін, і система працює як одномовний помічник.

Backend: Argos Translate

Параметр Значення
Бібліотека argostranslate>=1.9.0
Моделі Pre-compiled, ~50–100 МБ на пару
Ліцензія MIT (бібліотека) + CC0 (моделі)
Офлайн Так — повністю локально після встановлення
Мови 49 підтримуваних (EN ↔ UK, RU, DE, FR, ES, PL, …)
Швидкість (warm) 200–900 мс на речення на Pi 5
RAM ~300 МБ на завантажену пару

Моделі зберігаються в ~/.local/share/argos-translate/packages/ та завантажуються лінько при першому використанні.

API

Всі endpoint'и під /api/ui/setup/translate/.

GET /translate/status

{
  "enabled": true,
  "fallback_to_llm": true,
  "active_lang": "uk",
  "input_available": true,
  "output_available": true
}

GET /translate/catalog

Повертає повний список мовних пар (49 елементів) з статусом встановлено / активна:

{
  "models": [
    {
      "id": "argos-uk-en",
      "lang_code": "uk",
      "lang_name": "Ukrainian",
      "input_installed": true,
      "input_version": "1.9",
      "output_installed": true,
      "output_version": "1.4",
      "installed": true,
      "active": true
    }
  ]
}

POST /translate/download

{ "lang": "uk" }

Завантажує обидва напрямки (uk→en + en→uk) і автоматично активує мову якщо це перша встановлена пара.

GET /translate/download/status

Опитується UI під час завантаження:

{
  "active": true,
  "package": "uk→en",
  "progress": 70.0,
  "error": "",
  "done": false
}

POST /translate/activate

{ "lang": "uk" }

DELETE /translate/lang/{lang_code}

Видаляє обидва напрямки пари. Активну пару видалити не можна.

POST /translate/settings

{ "enabled": true, "fallback_to_llm": true }

Конфігурація

config/core.yaml:

translation:
  enabled: false                # Встановити в true після інсталяції пари
  active_lang: ""               # напр. "uk" — встановлюється автоматично
  fallback_to_llm: true         # Використовувати core.llm.translate коли
                                # локальна модель недоступна

UI

Налаштування → Голос та AI → таб Переклад. Кожна мовна пара показує:

  • Бейджі якості / розміру
  • Direction badges: uk→en та en→uk (зелений якщо встановлено)
  • Дії Встановити / Активувати / Видалити
  • Прогрес-бар завантаження з відсотками в реальному часі

Live STT Monitor події

Дві нові події з'являються в живому лозі дебагу:

  • translate_in — викликається відразу після Vosk STT, перед IntentRouter
  • translate_out — викликається відразу після IntentRouter, перед Piper TTS

Кожна несе:

{
  "event": "translate_in",
  "from": "увімкни світло",
  "to": "turn on the light",
  "lang": "uk",
  "ms": 318,
  "msg": "🔄 uk→en (318ms): увімкни світло → turn on the light"
}

Використовуйте їх щоб бачити затримку перекладу, помилки чи мовні неспівпадіння наскрізно.

Коли переклад пропускається

Обидва перекладачі замикаються накоротко (повертають текст без змін, ~0 мс) коли:

  • Текст вже ASCII (ймовірно англійський)
  • source_lang == "en" для входу / target_lang == "en" для виходу
  • Модель не встановлена
  • translation.enabled = false

Це означає що Pi з англомовним Vosk + англомовним голосом Piper не платить нічого за переклад навіть з встановленою парою.

Якість перекладу

Якість Argos Translate UK↔EN добра для коротких команд розумного дому (увімкни/вимкни, встановити температуру, запит погоди). Це не загального призначення перекладач для довгого або художнього тексту. Для двозначного або спеціалізованого словника LLM fallback (fallback_to_llm: true) бере на себе через core.llm.translate.

Додавання нової мовної пари

  1. Відкрити Налаштування → Голос та AI → Переклад
  2. Знайти мову в каталозі (відсортований за алфавітом)
  3. Натиснути Встановити — обидва напрямки завантажаться (~100–200 МБ)
  4. Натиснути Активувати — переклад тепер увімкнено для цієї мови
  5. Встановити Vosk STT на цю мову та голос Piper на цю мову
  6. Перевірити через Test Console — події translate_in та translate_out мають з'явитись в Live Monitor

Архітектурні обґрунтування

Чому англійське внутрішнє ядро?

  • Локальні LLM (qwen2.5:3b, phi3:mini, gemma2:2b) натреновані переважно на англійській. Не-англійський JSON вивід ненадійний.
  • Компактний intent промпт (~200 токенів) поміщається в контекстне вікно 2K малих моделей без обрізання.
  • Єдине джерело правди: назви пристроїв, інтенти, локації живуть англійською в registry (meta.name_en, meta.location_en).
  • Вартість перекладу (200–900 мс warm) амортизується по всьому пайплайну — невелика ціна за стабільну поведінку LLM.

Чому не завжди перекладати через LLM?

  • LLM переклад повільний (1–3 с на виклик) і залежить від моделі.
  • Argos Translate спеціально створений — швидший, послідовніший, повністю офлайн, не впливає на token budget класифікації інтентів.

Clone this wiki locally