Пой на незнакомом языке — с подсказкой произношения
Тезис из ТЗ KARAOKE_TREND: при 158 языках нужен инструмент освоения произношения — транскрипция (романизация) и локальный синтез речи. Модуль работает без сети: таблицы any-ascii вшиты рядом, голоса берутся из твоей системы (Web Speech API). Никаких аккаунтов, серверов, загрузок моделей.
1 · Текст → фонетика CORE
инициализация…
2 · Мост «СУФЛЁР ·16» — фонетика поверх поющей песни
жду трансляции ·16…
Открой ·16 СУФЛЁР, включи там «⌇ трансляция в зал», открой песню — здесь появится текущее слово с романизацией и ближайшие слова. ·20 ничего не отправляет: только слушает канал singulyar-hall (BroadcastChannel + localStorage-фолбэк). Ядро ·16 не затронуто.
3 · Как это работает
| слой | что делает | откуда |
|---|---|---|
| романизация | Unicode → латиница для любой письменности, 1:1 по символам | БИБЛИОТЕКИ/any-ascii.bundle.mjs (any-ascii 0.3.3, ISC, офлайн-таблицы) |
| слоги | хань/хангыль → слог-чипы (капитальный сплит), кана → кластеры (малые + ー слиты), прочие слова → по пробелам | ядро ·20, pure-функции |
| язык TTS | скрипт-детект → BCP-47 (uk/be/sr/kk отличимы от ru по буквам); ручной override | ядро ·20 |
| голос | Web Speech API: точное совпадение языка → префикс → любой локальный голос | система (без сети для локальных голосов) |
| мост | читает STATE ·16 (слово/далее/песня), только слушатель | BroadcastChannel('singulyar-hall') ver:1 |
- Чипы — кнопки: тап = произнести это слово выбранным темпом.
- «⌇ медленно» — rate 0.55 вместо 0.95, для разучивания строк.
- Ничего не отправляется никуда: 0 fetch, 0 сети, 0 аккаунтов.
4 · Честные границы
- Тоны пиньиня не подаются — any-ascii даёт слоги без диакритики (dang wo men); тональная разметка — дорожная карта.
- Арабский/иврит — романизация без огласовок (char-таблицы), произношение приблизительное.
- Хангыль — по слогам без сандхи-слияний (anu → «an nyeong», не «annyaeng»).
- Кана — Hepburn-подобная таблица any-ascii; малая цу аппроксимирована (きっぷ → «kitpu»).
- TTS зависит от ОС: локальные голоса есть не для всех 158 языков; если голоса нет — звучит голос по умолчанию или честный статус «голоса нет». В headless-браузерах speechSynthesis может отсутствовать — романизация при этом работает полностью.
- file://: динамический import бандла может быть заблокирован браузером — открой модуль по HTTP (Pages или любой локальный сервер). Это то же ограничение, что у ·18.
- IPA — не подаётся; романизация по ТЗ («IPA / романизация» — выбран второй путь).