From e5903d807628a8a02ec61305d7a6599035be8d67 Mon Sep 17 00:00:00 2001 From: Bossiara13 <236771060+DmitryBykov-ISPO@users.noreply.github.com> Date: Wed, 22 Apr 2026 20:00:04 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20README=20=E2=80=94=20TTS=20effects=20se?= =?UTF-8?q?ction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index 7e41728..fa19a5d 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,27 @@ python main.py - `COMMAND_MIN_LISTEN_MS` — минимальное время записи, чтобы не закрыться мгновенно (1000 мс). - `COMMAND_MAX_LISTEN_MS` — жёсткий потолок (15000 мс). +## Эффекты под AI-ассистента + +Silero звучит естественно, но иногда хочется лёгкой «AI-окраски» в духе J.A.R.V.I.S. — узкую полосу, еле заметную реверберацию, при желании небольшой сдвиг высоты. Это тонкий постпроцессинг, голос и sample rate не меняются. + +По умолчанию эффекты **выключены**. Включаются в `config.py`: + +- `TTS_EFFECTS_ENABLED` — главный тумблер (`False` по умолчанию). +- `TTS_BANDPASS_LOW_HZ` / `TTS_BANDPASS_HIGH_HZ` — полоса пропускания (по умолчанию 200–7000 Гц). Сужение полосы даёт ощущение «голоса по радио». +- `TTS_REVERB_WET` (0..1) и `TTS_REVERB_DECAY_MS` — доля мокрого сигнала и длительность хвоста короткой реверберации (по умолчанию 0.20 и 100 мс). +- `TTS_PITCH_SEMITONES` — сдвиг высоты в полутонах (по умолчанию 0, разумный диапазон ±2). + +Фильтры реализованы на `scipy.signal` (IIR, sosfiltfilt — нулевая фазовая задержка), реверберация — несколько затухающих задержанных копий, pitch — ресэмплинг по линейной интерполяции. Всё in-process, без временных файлов и лишних зависимостей. + +Быстрое A/B сравнение перед тем как переключать тумблер: + +```bash +.venv\Scripts\python.exe utils\preview_effects.py +``` + +Скрипт сгенерирует `sound/_preview_silero_raw.wav` и `sound/_preview_silero_fx.wav` — откройте оба в плеере и решите, нравится ли эффект. Параметры fx-версии берутся из текущего `config.py` (независимо от `TTS_EFFECTS_ENABLED`). + ## Схема commands.yaml Каждая команда — это пара `phrases` + `action`: