# Единый учебник голосовых систем

Откройте [index.html](</experiments/voice-ai/archive/c/DOCS/voice-systems-textbook-2026-10-02/voice-systems-textbook/index.html>). В одном оглавлении объединены аудиопути
Codex CLI / ChatGPT / Community, сравнение с webrtc-komaroff, Sonora,
Opus, WebRTC, WebSocket, NATS и исследование STUN 701.

HTML открывается без интернета и приложения. Все схемы, оформление и
навигация встроены. Файловые ссылки относительные; source snapshots и демо
лежат внутри этой папки. Внешние ссылки на стандарты и оригинальные Git
страницы нужны только для дополнительного чтения.

## Один поиск по всему комплекту

Вверху страницы находится строка "Поиск по всему учебнику и коду". Она
ищет по всем главам, пояснениям, таблицам, подписям схем и текстовым файлам:
демо, исходникам, тестам, README, конфигурациям и очищенным evidence.
Поиск работает сразу после распаковки, без сервера и интернета.

Введите `STUN 701`, `Sonora`, `appendAudio` или `http-tts.py`. Все введённые
слова обязательны; их порядок и регистр не важны, ё и е считаются одинаковыми.
Для целой фразы используйте кавычки: `"STUN host lookup"`. Можно искать по
имени файла, endpoint или фрагменту кода, сохраняя знаки `/`, `_`, `.`.

Результат ведёт к разделу главы или к HTML-представлению файла с подсвеченной
строкой. Совпадения выделены в заголовке и фрагменте. Длинный список выдаётся
порциями по 30 результатов, кнопка "Показать ещё" открывает остальные.
Ctrl+K или Cmd+K переводит фокус в поиск, Enter и стрелка вниз - в результаты,
стрелки перемещают фокус, Escape закрывает список. Поиск скрывается при печати.

Индекс встроен в `index.html`; динамических запросов к файлам нет. Бинарные
изображения и аудио, повторные HTML-копии, служебные seeds прежних редакций,
личные файлы и runtime не индексируются. Текст и подписи схем индексируются,
но OCR картинок и распознавание записей не выполняются. После изменения
включённого текста пересоберите комплект: валидатор обнаруживает устаревший
индекс и нарушение SHA256.

## Перенос

```bash
# Архив содержит одну папку. Команды выполняются в выбранном каталоге.
tar -xzf voice-systems-textbook-2026-10-02-search.tar.gz
cd voice-systems-textbook
# Проверка файлов, локальных ссылок и SHA256 без подключения к сервисам.
python3 tooling/verify.py
```

Можно переименовать папку или поместить её в каталог с пробелами.
Никакой checkout, путь автора или установленный Desktop для чтения не нужен.
Если файловый просмотр запрещён настройкой вашего браузера, из корня
комплекта можно запустить локальный сервер:

```bash
# Не запускайте из домашней папки: сервер публикует свой текущий каталог.
python3 -m http.server 8765 --bind 127.0.0.1
# Откройте http://127.0.0.1:8765/ в браузере; Ctrl+C остановит сервер.
```

## Что внутри

- `index.html` - единственная актуальная страница учебника.
- `docs/` - дополнительные справочники, картинки, synthetic audio и Codex source.
- `scripts/` - изолированные STT/TTS/WebRTC/proxy-демо и их тесты.
- `scripts/network-lab/` - STUN Binding probe с тестами без сети.
- `sources/` - закреплённые исходники webrtc-komaroff, ASR и aiortc,
  рядом HTML code views с номерами строк.
- `evidence/` - датированные очищенные результаты; не credentials и не raw NetLog.
- `tooling/` - сборщик, упаковщик и валидатор. `inputs/` - исходные тексты
  двух прежних книг для воспроизводимой сборки, не второе активное оглавление.
- `tooling/search.js` и `tooling/search_index.py` - алгоритм поиска и сборка словаря;
  их тесты входят в комплект. Рядом с текстовыми файлами есть HTML code views.
- `BUNDLE-MANIFEST.json` - файлы, размеры и SHA256. `.runtime` не включается.

Старые пути `docs/codex-cli-voice-textbook.html`, proxy и UI-страницы
оставлены переходниками к разделам единой книги. Исходные документы
в рабочих репозиториях при объединении не изменялись.

## Демо

Для чтения не нужны зависимости. Для выполнения примеров нужны Bash,
Python 3.12, FFmpeg/ffprobe; для части тестов - Node.js; для WebRTC -
зависимости из `scripts/webrtc-voice-isolated/requirements.txt` или
`scripts/webrtc-voice-proxy/requirements.txt`. Системные библиотеки
PortAudio нужны интерактивному микрофону. Rust helper собирается отдельно.

```bash
# Пути вычисляются от самого env.sh, а не от рабочей папки машины автора.
source ./scripts/audio-textbook/env.sh
# Отдельный venv. Установка зависимостей требует доступа к пакетовому зеркалу.
python3 -m venv "$voice_venv"
"$voice_python" -m pip install -r "$proxy_demo/requirements.txt" websocket-client==1.9.2
# Безопасная проверка HTTP TTS: нет токена, запроса или выходного MP3.
python3 "$tts_demo/http-tts.py" chatgpt-text "$audio_out/check.mp3" \
  --text-file "$tts_demo/sample-ru.txt" --auth-file /does-not-exist --dry-run
# WebRTC V3 dry-run после установки venv; микрофон не открывается.
"$voice_python" "$voice_demo/voice-console.py" --auth-file /does-not-exist --dry-run
```

После перемещения пересоздайте venv. Модели Piper/Kokoro, Silero и ASR/LLM
не входят в архив; заранее подготовьте их, пакеты и лицензии для изолированной
сети. Наличие локального учебника не делает удалённые ChatGPT-демо offline.

Для живых удалённых запросов задайте собственный `AUDIO_AUTH_FILE`
перед `source env.sh`. Файл остаётся вне архива. Вход пользователя,
refresh, cookies и proxy-секреты не копируются. Параметры proxy и CA
задаются отдельно по главе proxy. Не ставьте чужой auth в комплект.

Реальные результаты предыдущих проб датированы в книге. Доступ API может
измениться; успешный исторический пример не гарантирует доступ другому
аккаунту. Демо не обходят отказы сервиса и не маскируются под Desktop.

## Проверки и повторная упаковка

```bash
# Сеть, Desktop и микрофон не используются.
python3 tooling/verify.py
python3 -m unittest discover -s scripts/network-lab -p 'test_*.py' -v
# Проверка распаковки в каталог с пробелами и Unicode, без сети.
python3 -m unittest discover -s tooling -p 'test_bundle.py' -v
# JS-модель меню и hash/history; это не реальный просмотр в браузере.
env -u NODE_OPTIONS node tooling/test_navigation.cjs
# Словарь, ссылки на строки, поиск, клавиатура и безопасная подсветка в DOM-модели.
python3 -m unittest discover -s tooling -p 'test_search_index.py' -v
env -u NODE_OPTIONS node tooling/test_search.cjs
# Проверяем конкретные демо отдельными командами, а не запускаем live автоматически.
# Для четырёх MCP process tests сначала нужен собранный Rust helper:
cargo build --locked -p codex-read-aloud-linux
python3 -m unittest discover -s scripts/tts-demos -p 'test_*.py' -v
python3 -m unittest discover -s scripts/voice-probes -p 'test_*.py' -v
```

```bash
# Повторная сборка полностью локальна: используется зафиксированный manifest.
python3 tooling/assemble.py --output ../voice-systems-textbook-next
python3 tooling/verify.py --root ../voice-systems-textbook-next
# Упаковщик проверяет manifest, не берёт произвольные новые файлы и не затирает архив.
python3 tooling/pack.py --root ../voice-systems-textbook-next \
  --output ../voice-systems-textbook-next.tar.gz
```

Live findings относятся к проверкам 02.10.2026 в предыдущей диагностике.
При сборке этого объединённого документа production повторно не вызывался,
приложение не перезапускалось, service config и Git не публиковались.
Сравнительные акустические испытания Sonora на нашем контуре не проведены.
Браузерная приёмка именно объединённого HTML описана в `verification.md`.
