# Сонификаторы oleviia.ru

Документ описывает **восемь** алгоритмов сонификации ЭМГ, доступных в разделе **«Новый алгоритм»** на [oleviia.ru/sonifier-v2/](https://oleviia.ru/sonifier-v2/).

**Дата:** 2026  
**Проект:** Олевия Кибер · исследование различимости рукописных цифр 0–9 на слух

---

## Общие входные данные

Все алгоритмы работают на **одном трайле** — фрагменте записи, когда испытуемый писал одну цифру на планшете.

| Поле | Смысл |
|------|--------|
| `emg_env_0` … `emg_env_7` | Огибающая ЭМГ 8 мышц предплечья/кисти (1 кГц, z-score) |
| `x`, `y` | Координаты стилуса (используются в Lebedev-Oracle и Wiener) |
| `onpaper` | Контакт пера с поверхностью |
| `type` | Метка цифры 0–9 (в звук **не подставляется** при прослушивании) |
| `trial` | Номер попытки в сессии |

Данные: Linderman–Lebedev–Erlichman (2009), обработка в `emg_processing.ipynb` → `processed_data/*.csv`.

**Каналы (Lebedev 2009):** ch0–3 — кисть (OP, APB, mFDI, lFDI); ch4–7 — предплечье (FCR, ED, ECU, ECR).

---

## Сводная таблица

| № | ID | Название в UI | Каналы | Время | Выход |
|---|-----|---------------|--------|-------|-------|
| 1 | `4comp-v1` | 4-comp (PCA + пентатоника) | 8 EMG | блоки 100 мс | моно |
| 2 | `pmson-a-v1` | PMsonAI | 8 EMG | непрерывно 1 кГц | стерео |
| 3 | `neuro-interspace-v1` | NeuroInterspace | 8 EMG | сегменты 25 мс | стерео |
| 4 | `ivanenko-synergy-v1` | Synergy5 (Ivanenko) | 8 EMG | 200 точек цикла | моно |
| 5 | `lebedev-wiener-v1` | Lebedev-Wiener (kinematic) | EMG → x̂,ŷ | 1 кГц | стерео |
| 6 | `lebedev-oracle-v1` | Lebedev-Oracle (x,y) | x, y | 1 кГц | стерео |
| 7 | `lebedev-template-v1` | Lebedev-Template (residual) | 8 EMG + шаблоны | блоки 100 мс | моно |
| 8 | `lebedev-voice-v1` | Lebedev-Voice (RU) | метка type | TTS ~0.9 с | моно |

---

## 1. 4-comp (PCA + пентатоника)

**ID:** `4comp-v1`  
**Научная основа:** классический baseline проекта (`4_comp_sonification.ipynb`).

### Логика

Многоканальную ЭМГ сжимают в **4 ортогональных паттерна** (PCA), каждый получает свой «голос» в пентатонике. Идея: услышать не 8 отдельных мышц, а несколько **обобщённых режимов совместной активации**.

### Блок-схема

```mermaid
flowchart LR
  EMG["8× emg_env\n1 кГц"] --> Z["Z-score"]
  Z --> PCA["PCA → 4 компоненты"]
  PCA --> Chunk["Усреднение\n100 мс"]
  Chunk --> Pent["Пентатоника\n4 базовых частоты"]
  Pent --> Mix["4 синуса\n+ fade 10 мс"]
  Mix --> WAV["Моно WAV\n44.1 kHz"]
```

### Аудио-маппинг

| Компонента | Базовая частота | Роль |
|------------|-----------------|------|
| PC1 | 783.99 Hz (G5) | высокий регистр |
| PC2 | 130.81 Hz (C3) | низкий |
| PC3 | 440 Hz (A4) | средний |
| PC4 | 329.63 Hz (E4) | средне-низкий |

На каждом 100-мс блоке: амплитуда PC → ступень пентатоники → частота; четыре синуса суммируются с коэффициентом 0.25.

### Обоснование

- **PCA** убирает избыточность между каналами и выделяет главные оси вариативности.
- **Пентатоника** даёт согласные интервалы — проще различать паттерны на слух, чем при хроматике.
- **100 мс** — компромисс между детализацией и устойчивостью (близко к 10 Гц бинам в Lebedev 2009).

### Ограничения

Моно; дискретные «ноты» каждые 100 мс; не использует траекторию пера; порядок PC может меняться между трайлами.

---

## 2. PMsonAI

**ID:** `pmson-a-v1`  
**Научная основа:** Hunt & Dyson, *PMson* — разделение параметров звука (pitch, loudness, pan, timing).

### Логика

Вместо 8 голосов — **один тон**, параметры которого кодируют обобщённую активность и анатомическое разделение кисть/предплечье.

### Блок-схема

```mermaid
flowchart LR
  EMG["8× emg_env"] --> Mean["Средняя огибающая E"]
  EMG --> Hand["mean ch0–3\nкисть"]
  EMG --> Fore["mean ch4–7\nпредплечье"]
  Mean --> Pitch["Pitch\nпентатоника C4"]
  Mean --> Loud["Loudness\n√огибающая"]
  Hand --> Pan["Pan L/R\nкисть − предплечье"]
  Fore --> Pan
  Mean --> Peaks["Пики → attack-клики"]
  Pitch --> Stereo["Стерео синус\n+ equal-power pan"]
  Loud --> Stereo
  Pan --> Stereo
  Peaks --> Stereo
  Stereo --> WAV["WAV 44.1 kHz"]
```

### Аудио-маппинг

| Параметр PMson | Источник | Реализация |
|----------------|----------|------------|
| Pitch | средняя огибающая E | пентатоника от C4, ~2 октавы |
| Loudness | E (sigmoid 5–95%) | √кривая, floor 0.08 |
| Pan | кисть − предплечье | equal-power stereo |
| Timing | пики E (>30% max) | клик 1800 Hz, 15 мс |

Сглаживание: 50 мс. Pan по **Lebedev Table 1**: кисть информативнее для Y, предплечье — для X.

### Обоснование

- Один непрерывный тон **сохраняет ритм штриха** лучше, чем блоковый 4-comp.
- Разделение pitch / loudness / pan снижает «кашу» в timbre.
- Анатомический pan даёт **пространственный смысл**: левая/правая группа мышц.

### Ограничения

Pitch и loudness оба зависят от одной огибающей E (частичный confound); метка цифры в звук не входит.

---

## 3. NeuroInterspace (интервалы C-dur)

**ID:** `neuro-interspace-v1`  
**Концепция:** «нейро-интервал» — два наиболее активных канала как **интервал** в до-мажорном трезвучии.

### Логика

8 каналов → 8 фиксированных нот (C3/E3/G3, C4/E4/G4, C5/E5). На каждом шаге 25 мс выбираются **2 самых активных** канала; сегмент озвучивается **интервалом**: низкая нота слева, высокая справа.

### Блок-схема

```mermaid
flowchart LR
  EMG["8× emg_env\nсглаж. 30 мс"] --> Hop["Окно 25 мс"]
  Hop --> Top2["Top-2 канала"]
  Top2 --> Seg["Сегменты\n≥50 мс"]
  Seg --> Map["ch → MIDI\nC-dur трезвучие"]
  Map --> Int["Интервал:\nниз → L, верх → R"]
  Int --> WAV["Стерео WAV"]
```

### Аудио-мапинг

- Канал 0–2 → C3, E3, G3; 3–5 → C4, E4, G4; 6–7 → C5, E5.
- Громкость сегмента ∝ суммарная активность пары.
- Fade 10 мс на границах; тишина, если активность < floor.

### Обоснование

- **Консонантные интервалы** (мажорное трезвучие) легче различать, чем 8 независимых timbres.
- Последовательность интервалов отражает **смену доминирующих мышечных групп** во времени.
- Дискретность помогает «услышать структуру» жеста как мелодию интервалов.

### Ограничения

Резкие переходы между сегментами; теряются тонкие gradations; не использует x,y.

---

## 4. Synergy5 (Ivanenko)

**ID:** `ivanenko-synergy-v1`  
**Научная основа:** Ivanenko, Poppele, Lacquaniti (2004) — 5 базовых паттернов активации при ходьбе (PCA + varimax на корреляциях).

### Логика (адаптация для цифр)

Трайл **нормируют по длине** на 200 точек (аналог 0–100% цикла шага). По корреляционной матрице каналов извлекают **5 синергий** с varimax-вращением. Каждая синергия — временной профиль активации «примитива».

### Блок-схема

```mermaid
flowchart LR
  EMG["8× emg_env\n~1–3 с"] --> Res["Ресемпл\n200 точек"]
  Res --> Corr["Корр. матрица\n+ PCA top-5"]
  Corr --> Var["Varimax"]
  Var --> Scores["Scores S1…S5\nнорм. 0–1"]
  Scores --> Pent["5 частот\nпентатоника"]
  Pent --> Block["Блоки\nдлина/200"]
  Block --> WAV["Моно WAV"]
```

### Аудио-маппинг (вариант A)

| Синергия | Базовая частота |
|----------|-----------------|
| S1 | 783.99 Hz |
| S2 | 130.81 Hz |
| S3 | 440 Hz |
| S4 | 329.63 Hz |
| S5 | 220 Hz |

На каждом из 200 шагов: Σ sin(2π·f_k·t) · score_k · gain.

### Обоснование

- **Синергии** — биомеханически осмысленное сжатие: общие волны + веса на мышцы.
- **200 точек** убирает различие «быстрый/медленный» штрих.
- **Varimax** делает факторы интерпретируемее, чем сырой PCA.

### Ограничения

Varimax на **одном трайле** нестабилен (в статье — усреднение по многим циклам); метод из ходьбы, не из письма; separation ratio прототипов по цифрам умеренный.

---

## 5. Lebedev-Wiener (kinematic)

**ID:** `lebedev-wiener-v1`  
**Научная основа:** Linderman–Lebedev–Erlichman (2009) — Wiener-фильтр EMG(+лаги) → координаты x,y.

### Логика

Оффлайн по каждой **сессии** обучаются линейные веса: rectified EMG с лагами ±100, ±50, 0 мс → **x̂(t), ŷ(t)**. Звук строится из **восстановленной траектории пера**, а не из сырой ЭМГ.

### Блок-схема

```mermaid
flowchart LR
  EMG["8× emg_env\n+ лаги"] --> Wiener["Wiener-фильтр\n(веса сессии)"]
  Wiener --> XY["x̂, ŷ"]
  XY --> Kin["dx,dy → speed\nheading → pitch"]
  XY --> Pan["x → pan"]
  Kin --> Loud["speed → loudness"]
  EMG --> Compound["compound EMG\n→ паузы"]
  Kin --> Stereo["PMson-подобный\nстерео синтез"]
  Loud --> Stereo
  Pan --> Stereo
  Compound --> Stereo
  Stereo --> WAV["Стерео WAV"]
```

### Аудио-маппинг

| Признак траектории | Звук |
|--------------------|------|
| atan2(dy, dx) → heading | pitch (пентатоника) |
| √(dx²+dy²) → speed | loudness |
| x | pan L/R |
| compound EMG < порога | приглушение (паузы между sub-strokes) |

### Обоснование

- В статье Lebedev **восстановление x,y** объясняет 48–64% дисперсии — траектория несёт **форму цифры**.
- Сонификация **кинематики**, а не мышц, ближе к тому, как мы видим почерк.
- Wiener с лагами учитывает **задержку** EMG → движение.

### Ограничения

Требует обученных весов (`train-wiener`); качество x̂ зависит от сессии; при отсутствии весов — fallback на сырые x,y.

---

## 6. Lebedev-Oracle (x,y)

**ID:** `lebedev-oracle-v1`  
**Роль:** **верхняя граница** различимости — идеальная кинематика с планшета.

### Логика

Тот же синтез, что Lebedev-Wiener, но вместо x̂, ŷ используются **ground-truth** `x`, `y` из CSV. Показывает, насколько хорошо можно «услышать цифру», если траектория известна точно.

### Блок-схема

```mermaid
flowchart LR
  Tablet["x, y\nпланшет"] --> Kin["speed, heading\npitch / loud / pan"]
  EMG["emg_env"] --> Compound["compound\n→ mute"]
  Kin --> Stereo["Стерео WAV"]
  Compound --> Stereo
```

### Обоснование

- Контрольный режим для эксперимента: если Oracle **сильно лучше** EMG-алгоритмов, имеет смысл вкладываться в декодирование траектории.
- Если различия малы — узкое место не в x,y, а в самой сонификационной схеме или данных EMG.

### Ограничения

**Не честный** тест для слепого распознавания по EMG — использует информацию, недоступную только из мышц.

---

## 7. Lebedev-Template (residual)

**ID:** `lebedev-template-v1`  
**Научная основа:** пайплайн **распознавания** Lebedev 2009 (шаблон 35×100 мс × 8 каналов, корреляция с прототипами цифр).

### Логика

1. Трайл → матрица **35 временных бинов × 8 каналов** (100 мс на бин).
2. Для каждой цифры 0–9 есть **средний шаблон** (по сессии или глобально).
3. Считают **residual** от шаблона текущей цифры и **корреляцию** со всеми 10 шаблонами.
4. Звук: «конкуренция» 10 голосов (по corr) + carrier от residual.

### Блок-схема

```mermaid
flowchart LR
  EMG["8× emg_env"] --> Bins["35×100 мс\nбинов"]
  Bins --> Feat["Вектор 280"]
  Feat --> Res["Residual vs\nшаблон цифры"]
  Feat --> Corr["Corr с шаблонами\n0…9"]
  Res --> Amp["Амплитуда\nresidual"]
  Corr --> Voices["10 голосов\nпентатоника"]
  Amp --> Synth["100 мс блоки"]
  Voices --> Synth
  Synth --> WAV["Моно WAV"]
```

### Обоснование

- Lebedev достиг **~90% распознавания** цифр по EMG-шаблонам — сонификация **отклонения от прототипа** подчёркивает индивидуальные черты трайла.
- 100 мс бины согласованы с 4-comp и методом статьи (10 Гц).
- Корреляция с 10 классами даёт **слуховую «голосовалку»** между цифрами.

### Ограничения

Требует предварительно построенных шаблонов (`build-templates`); при прослушивании метка цифры известна алгоритму для выбора эталона residual (исследовательский режим).

---

## 8. Lebedev-Voice (RU)

**ID:** `lebedev-voice-v1`  
**Научная основа:** Linderman–Lebedev–Erlichman (2009) — распознавание цифр 0–9 по шаблонам ЭМГ с точностью до ~90%.

### Логика

Если классификатор Lebedev **идеально** определил цифру, результат можно озвучить словом. Алгоритм берёт ground-truth поле `type` из CSV трайла и воспроизводит **русское название цифры** (ноль…девять) через предзаписанный синтез речи (espeak-ng, голос `ru`).

### Блок-схема

```mermaid
flowchart LR
  Trial["Трайл CSV"] --> Type["type → цифра 0–9"]
  Type --> Map["Словарь RU\nноль…девять"]
  Map --> TTS["WAV espeak-ng\n22050 Hz моно"]
  TTS --> Out["Воспроизведение"]
```

### Аудио-маппинг

| Цифра | Слово | Файл |
|-------|-------|------|
| 0 | ноль | `digit-voice-ru/0.wav` |
| 1 | один | `…/1.wav` |
| … | … | … |
| 9 | девять | `…/9.wav` |

Длительность ~0.8–1.0 с; не привязана к длительности жеста.

### Обоснование

- В статье Lebedev **цель** — распознать, какую цифру писали; озвучка метки — **верхняя граница** («если декодер угадал на 100%»).
- Аналог **Lebedev-Oracle** для кинематики: контрольный режим, показывающий потолок задачи «услышать цифру».
- Полезен для калибровки слуховых эксперimentов: слушатель сразу слышит правильный ответ и может сравнить с EMG-алгоритмами.

### Ограничения

**Не слепой тест** — использует метку из данных, недоступную только из ЭМГ. Не отражает мышечную активность; не заменяет сонификацию паттернов EMG.

---

## Сравнение подходов

```mermaid
flowchart TB
  subgraph emg_only [Только EMG]
    A1["4-comp"]
    A2["PMsonAI"]
    A3["NeuroInterspace"]
    A4["Synergy5"]
    A7["Template"]
  end
  subgraph kinematics [Кинематика / шаблоны / метка]
    A5["Wiener x̂,ŷ"]
    A6["Oracle x,y"]
    A8["Voice RU"]
  end
  EMG["8× emg_env"] --> emg_only
  EMG --> A5
  Tablet["x, y"] --> A6
  Proto["Прототипы 0–9"] --> A7
  Label["type 0–9"] --> A8
```

| Критерий | Лучшие кандидаты |
|----------|------------------|
| Непрерывность / ритм штриха | PMsonAI, Wiener, Oracle |
| Пространственная структура | PMsonAI (pan), NeuroInterspace (интервалы) |
| Сжатие размерности | 4-comp, Synergy5 |
| Привязка к форме цифры | Wiener, Oracle, Template |
| Идеальное «название» цифры | Lebedev-Voice |
| Простота / baseline | 4-comp |
| Научная воспроизводимость | Synergy5 (Ivanenko), Lebedev-* |

---

## Рекомендации по прослушиванию

1. Закрепите трайл (**«повторять тот же трайл»**) для сравнения алгоритмов на одних данных.
2. Сначала **4-comp vs PMsonAI** (кнопка «Сравнить») — моно блоки vs стерео тон.
3. **Oracle vs Wiener** — оценка потолка кинематики.
4. **NeuroInterspace** — слушать последовательность интервалов в метаданных.
5. **Synergy5 / Template** — смотреть мета «Синергии» / «Шаблон».

---

## Литература и код

| Алгоритм | Источник | Код |
|----------|----------|-----|
| 4-comp | `4_comp_sonification.ipynb` | `baseline-4comp.mjs` |
| PMsonAI | Hunt & Dyson, PMson | `pmson-a.mjs` |
| NeuroInterspace | проект oleviia | `neuro-interspace.mjs` |
| Synergy5 | Ivanenko et al. 2004, J Physiol | `ivanenko-synergy.mjs` |
| Lebedev-* | Linderman et al. 2009, PLoS ONE | `lebedev-wiener.mjs`, `lebedev-template.mjs`, `lebedev-voice.mjs` |

---

*Документ сгенерирован для oleviia.ru · Sonifier v2*
