KaniTTS-research-team/emolia_select
收藏Hugging Face2026-03-28 更新2026-03-29 收录
下载链接:
https://hf-mirror.com/datasets/KaniTTS-research-team/emolia_select
下载链接
链接失效反馈官方服务:
资源简介:
---
dataset_info:
features:
- name: dev_id
dtype: string
- name: verdict
dtype: string
- name: ch1_prob
dtype: float64
- name: ch2_comb
dtype: float64
- name: ch3_transient
dtype: float64
- name: audio
dtype: audio
splits:
- name: train
num_examples: 1000
license: mit
language:
- en
tags:
- audio
- tts
- quality-filter
- speech
size_categories:
- 1K<n<10K
---
# emolia_select — Фильтр качества аудио для TTS
## Обзор
1000 аудиозаписей из датасета `emolia_selected_dev`, прогнанных через 3-канальный фильтр качества.
Каждый сэмпл ресемплирован в **24 кГц** и оценён тремя независимыми каналами, детектирующими разные типы дефектов.
**Отсортировано от худшего к лучшему** (по ch1_prob убыванию).
| Verdict | Кол-во | % | Описание |
|---|---|---|---|
| bad | 617 | 61.7% | Плохое качество — отбраковка |
| borderline | 204 | 20.4% | Сомнительное — требует ручной проверки |
| good | 179 | 17.9% | Хорошее качество — можно использовать для TTS |
---
## Колонки
| Колонка | Тип | Описание |
|---|---|---|
| `dev_id` | string | Уникальный ID записи (UUID) |
| `verdict` | string | Итоговый вердикт: `good`, `borderline` или `bad` |
| `ch1_prob` | float | Скор канала 1 — вероятность "плохого" от LogReg (0.0–1.0) |
| `ch2_comb` | float | Скор канала 2 — spectral_autocorr_peak (детекция comb filter) |
| `ch3_transient` | float | Скор канала 3 — crest_factor_std (целостность транзиентов) |
| `audio` | Audio | Аудиофайл, ресемплированный в 24 кГц |
---
## Как работает 3-канальный фильтр
### Пайплайн
```
Аудио (любой SR) → Ресемплинг в 24 кГц → Извлечение 12 метрик → 3 канала → Вердикт
```
### Шаг 1: Ресемплинг
Все аудио приводятся к **24 кГц** через `librosa.resample()`. Это убирает конфаунд по sample rate — без этого шага модель учит SR вместо качества (в датасете записи с разными SR: 24 и 32 кГц).
### Шаг 2: Извлечение 12 метрик
Из каждого аудио вычисляются 12 акустических признаков:
| # | Метрика | Что измеряет |
|---|---|---|
| 1 | `spectral_bandwidth_mean` | Ширина спектра вокруг центроида (Гц). Главный индикатор |
| 2 | `band_8k_plus_ratio` | Доля энергии выше 8 кГц. У плохих записей = 0 |
| 3 | `mfcc_5_mean` | 5-й кепстральный коэффициент. Спектральная структура 1.5–4 кГц |
| 4 | `mfcc_7_mean` | 7-й кепстральный коэффициент. Детализация средних частот |
| 5 | `spec_contrast_b6_mean` | Спектральный контраст в верхней полосе (>6.4 кГц) |
| 6 | `band_300_3400_ratio` | Доля энергии в телефонной полосе 300–3400 Гц |
| 7 | `spectral_rolloff_mean` | Частота, ниже которой 85% энергии |
| 8 | `hf_temporal_std` | Временная нестабильность ВЧ-энергии (4–8 кГц) |
| 9 | `hf_temporal_mean` | Средняя доля ВЧ-энергии по фреймам |
| 10 | `spectral_autocorr_peak` | Автокорреляция спектра — детекция comb filter |
| 11 | `crest_factor_std` | Разброс пиковости по фреймам — целостность транзиентов |
| 12 | `crest_factor_p95` | 95-й перцентиль пиковости по фреймам |
### Шаг 3: Три независимых канала
Каждый канал ловит свой тип дефекта:
#### Канал 1 — LogReg модель (`ch1_prob`)
- **Вход:** 12 метрик → StandardScaler → LogisticRegression
- **Выход:** `ch1_prob` — вероятность "плохого" (0.0–1.0)
- **Порог bad:** `ch1_prob > 0.45`
- **Порог borderline:** `ch1_prob > 0.20`
- **Что ловит:** Обрезку полосы частот (телефония, VoIP, кодеки G.711/AMR/speex), общие спектральные дефекты
- **Обучен на:** 108 вручную размеченных сэмплов (50 good + 58 bad)
- **Это главный канал** — ловит ~70% дефектов
#### Канал 2 — Comb filter (`ch2_comb`)
- **Вход:** одна метрика `spectral_autocorr_peak`
- **Порог:** `> 0.987` → bad
- **Что ловит:** Металлический резонанс / comb filter. Звучит как "из бочки" или "робот"
- **Зачем отдельно:** У таких записей bandwidth нормальный, поэтому канал 1 даёт им низкий bad_prob (0.06–0.49). Только автокорреляция ловит периодические пики в спектре
- **Редкий дефект** — срабатывает на ~1% сэмплов
#### Канал 3 — Целостность транзиентов (`ch3_transient`)
- **Вход:** одна метрика `crest_factor_std`
- **Порог:** `< 1.20` → bad
- **Что ловит:** Артефакты взрывных согласных /p/ /b/ /t/. Когда кодек "съедает" резкие звуки. У хороших записей разброс пиковости большой (есть острые и тихие моменты), у плохих — всё сглажено
- **Срабатывает на:** ~21% сэмплов
### Шаг 4: Итоговый вердикт
```
if ch1_prob > 0.45 OR ch2_comb > 0.987 OR ch3_transient < 1.20:
verdict = "bad"
elif ch1_prob > 0.20:
verdict = "borderline"
else:
verdict = "good"
```
**Логика OR** для bad — достаточно одного сработавшего канала. Для TTS ошибка "пропустить плохое" дороже чем "выбросить хорошее".
**Borderline** — зона неопределённости канала 1: модель не уверена (0.20–0.45). Рекомендуется ручная проверка.
---
## Таблица порогов
| Канал | Метрика | Порог bad | Порог borderline | Направление | Срабатываний |
|---|---|---|---|---|---|
| Ch1 | `ch1_prob` | **> 0.45** | **> 0.20** | чем выше — тем хуже | 617 / 1000 |
| Ch2 | `spectral_autocorr_peak` | **> 0.987** | — | чем выше — тем хуже | 11 / 1000 |
| Ch3 | `crest_factor_std` | **< 1.20** | — | чем ниже — тем хуже | 210 / 1000 |
---
## Порядок сортировки
Датасет отсортирован по `ch1_prob` **по убыванию** (сначала худшие):
- **Строка 0:** худший сэмпл (ch1_prob = 0.976)
- **Строка 500:** середина
- **Строка 999:** лучший сэмпл (ch1_prob = 0.008)
---
## Как использовать
```python
from datasets import load_dataset
ds = load_dataset("KaniTTS-research-team/emolia_select", split="train")
# Только хорошие
good = ds.filter(lambda x: x["verdict"] == "good")
print(f"Good: {len(good)}")
# Хорошие + сомнительные
not_bad = ds.filter(lambda x: x["verdict"] != "bad")
print(f"Not bad: {len(not_bad)}")
# Свой порог (менее агрессивный)
custom = ds.filter(lambda x: x["ch1_prob"] < 0.5 and x["ch2_comb"] < 0.99 and x["ch3_transient"] > 1.0)
print(f"Custom: {len(custom)}")
# Послушать худший сэмпл
print(ds[0]["verdict"], ds[0]["ch1_prob"])
# ds[0]["audio"] — массив 24 кГц
```
---
## Главный вывод
Основная проблема качества в этом датасете — **bandwidth truncation** (обрезка полосы частот), а не шум или клиппинг. Плохие записи имеют резкий срез на 3–5 кГц (типичные телефонные/VoIP кодеки), хорошие — плавное затухание до 10–12 кГц.
Метрики которые **НЕ работают** для этого датасета: SNR, HNR, voiced_ratio, clip_ratio.
---
## Три типа дефектов
| Тип | Кол-во | Как звучит | Что ловит |
|---|---|---|---|
| **Bandwidth truncation** | ~70% bad | Глухо, как по телефону | Канал 1 (bandwidth, rolloff, flatness) |
| **Comb filter** | ~2% bad | Металлический звон, "из бочки" | Канал 2 (autocorr peak) |
| **Transient artifacts** | ~20% bad | Смазанные согласные, "каша" | Канал 3 (crest factor) |
---
## Источник
- **Исходный датасет:** `KaniTTS-research-team/emolia_selected_dev` (1000 сэмплов)
- **Модель фильтра:** Обучена на 108 вручную размеченных крайних случаях (50 good + 58 bad)
- **Анализ:** `KaniTTS-research-team/emolia_dermo_recognition`
- **Аудио:** Ресемплировано в 24 кГц
---
*Создано 2026-03-28 · 3-канальный фильтр · 12 метрик · 24 кГц*
提供机构:
KaniTTS-research-team



