# Аудит дорожек в описаниях релизов (raw) — выводы и план Вход: все сохранённые страницы `data/raw/{kinozal,nnm,rutracker}/*.json` (35 384 релиза: kinozal 10 541, nnm 13 677, rutracker 11 166) против `data/labels.csv` (48 896 строк). Текст как у сервиса: kinozal — «Техданные» + «Релиз», nnm/rutracker — пост. Цифры и примеры: `reports/tracks_audit_numbers.md`, пересчёт: .venv\Scripts\python tools\audit_tracks.py [--cache путь.pkl] Строка дорожки = «Перевод N: / Озвучка: / Дубляж:» или кодек-строка («Аудио N: AC3 … (MVO, X)») русской/украинской дорожки; субтитры и сводки без типа/студии не считаются. Студии сравниваются через `release.same_studio` («А. Гаврилов» = «Андрей Гаврилов»), словарь — студии меток (≥ 5 раз) без мусора. ## Что нашлось ### 1. Студии из кодек-строк не попадают в метки (главное) Студия названа в строке дорожки релиза, но её нет среди меток этого релиза: | | релизов с метками | из них с недостающей студией | недостающих студий | из кодек-строк «Аудио» | из «Перевод:» | релизов, где у меток **нет ни одной** студии, а в кодек-строке есть | |---|---|---|---|---|---|---| | kinozal | 9 932 | 1 690 (17 %) | 3 736 | 3 240 | 496 | 1 129 | | nnm | 10 085 | 1 295 (13 %) | 2 032 | 1 003 | 1 029 | 653 | | rutracker | 7 742 | 972 (13 %) | 1 645 | 531 | 1 114 | 495 | Топ недостающих: kinozal — HDrezka 362, TVShows 339, LostFilm 211, Red Head Sound 164, LeDoyen 117, Jaskier 101, MovieDalen 89, Мосфильм-Мастер 80; nnm/rutracker — LeDoyen, Postmodern, НТВ+, HDrezka, 1+1, NewStation, Невафильм. Причина: разметка строится по строкам «Перевод:», а кодек-строки идут только как `audio_raw` к уже найденной дорожке (`studio_source=audio` — всего 992 строки). Типичный kinozal: «Перевод: Профессиональный (многоголосый закадровый)» без студии + «Аудио 2: AC3 … (MVO, LostFilm)». Это та же дыра, что закрыла доразметка nnm «Перевод:» (nnm 0.58 → 0.85 по релизам), только крупнее. Обратное (студия в метках, которой нет на странице) почти не встречается: 1 / 22 / 14. ### 2. «Перевод N:» с несколькими студиями размечен частично (nnm, rutracker) ~1 000 студий на трекер — из строк вида «Перевод 3-6: Профессиональный (многоголосый) — Jaskier, TVShows, HDrezka Studio, LostFilm» или «Перевод: Дублированный (Iyuno-SDI Group, Le Doyen), Многоголосый (LostFilm, Jaskier, TVShows)»: в метках часть списка. Сводка prepare_data тоже видит «несколько дорожек в одной строке». ### 3. Форматы кодек-строк, которые не ловят правила Это правила разметки (`segmenter.RE_AUDIO_TRACK`) и запасной путь сервиса (`release.codec_segments`), а не модель-сегментатор: промах здесь — дыра в метках сегментатора и в фолбэке, не измеренная потеря предсказания. | | кодек-строк | мимо RE_AUDIO_TRACK | мимо codec_segments | |---|---|---|---| | kinozal | 18 297 | 11 664 (из них 10 395 — «Аудио:» без номера) | 12 858 | | nnm | 15 151 | 2 850 | 4 696 | | rutracker | 11 471 | 2 496 | 5 058 | * **мимо обоих**: «Аудио pic RUS:» (374), «Аудио #N Русский:» (175), «Аудио N Rus:» / «Аудио 3 Rus:» (~220), «Аудио rus N:», «Звук N:», «Аудио #N (rus):», «• №N: Русский (АС3 …)», «Аудио 2. Русский:», nnm «Russian (Dolby AC3, 6 ch) …» без префикса (1 483), «Аудио (rus):». * **«Аудио:» без номера** исключено намеренно (сводка «Аудио: Русский, английский (AC3…)»), но ~1 000 таких строк (kinozal 184, nnm 378, rt 463) — одна дорожка с типом/студией («Аудио: AC3, 6 ch, 448 kbps - Русский (MVO, Jaskier)»). Нужно отличать сводку из нескольких языков от одиночной дорожки, а не снимать правило. * **мимо codec_segments, но ловит RE_AUDIO_TRACK** (1 378 / 2 224 / 3 025): кодек-строка со студией, но без тип-слова — «Аудио Rus: AC3 … |HDRezka|», «… | AlexFilm», «- Rus (HDRezka Studio)». `RE_CODEC_TRACK` требует тип озвучки, и на kinozal это та же студия из п. 1. * «АVO / МVO» с кириллической буквой — 99 строк, `\bAVO\b` их не видит. ### 4. Мусор в колонке studio меток | вид | kinozal | nnm | rutracker | |---|---|---|---| | источник: Лицензия / Blu-ray CEE/EUR / iTunes / Netflix | 245 | 590 | 231 | | «X по заказу Y» | 131 | 67 | 120 | | язык-префикс «Русский, - AlexFilm», «Украинский, AMC» | 72 | — | 13 | | тип-слово («дубляж», «полное дублирование») | 45 | 41 | 19 | | каналы/кодек («6 ch», «AC3, 6ch, 448 кбит/с Ист-Вест») | 7 | 89 | 18 | | язык вместо студии («Русский», «Украинский») | 7 | 26 | 18 | | неру дорожка (казахский, «+ Английский + Комментарии») | 4 | 6 | 26 | Всего ~1 800 строк (≈ 4 %, вместе с «субтитрами» в studio). Часть уже чистит prepare_data («мусорный studio 155»), остальное идёт в обучение. ### 5. Релизы без меток | | без меток | нет строк дорожек | «не требуется»/немой | строки без типа | **есть тип озвучки** | |---|---|---|---|---|---| | kinozal | 609 | 15 | 186 | 407 (русские фильмы «Аудио: Русский (AC3…)») | 1 | | nnm | 3 592 | 1 605 | 520 | 1 050 | **417** | | rutracker | 3 424 | 1 537 | 535 | 790 | **562** | legacy и `ok=False` среди них нет — все страницы обычные. ~980 релизов nnm/rutracker с настоящими дорожками сборщик не разметил: «Перевод 1: Профессиональный (двухголосый закадровый) Пётр Гланц и Евгения Лютая», «Перевод: Двуголосый (НТВ+)», аниме «Озвучка: … от StudioBand», «Аудио 1: AC-3, RUS(int) … | Озвучкa: Дубляж Reanimedia». «Строки без типа» — в основном «Перевод: DreamersTeam» / «Озвучка: Persona99» (тип неизвестен, но студия есть). ## План (по ожидаемому эффекту на e2e) Каждый пункт: сначала `--dry-run` со счётом строк, потом prepare → train, ворота — e2e `tests/e2e_segmenter.py` (E2E_MAX=400) и joint exact на test-split против текущей `models/best`. 1. **Метки из кодек-строк** (kinozal 3 240, nnm 1 003, rt 531 студий; 2 277 релизов, где у меток нет студий вовсе). В `harvest_core` + `tools/relabel_studios.py`: студия из кодек-строки русской дорожки, которой нет среди меток, → заполнить studio-less строку того же типа или добавить строку `studio_source=audio`, `raw` = кодек-строка. Ожидание: kinozal recall студий (сейчас 0.93 по парам, но в gold этих студий просто нет — метрика тоже сдвинется, сравнивать на одном gold). Dry-run: число строк по трекерам, выборка 50 глазами. 2. **Разбор списков студий в одной «Перевод:»** (~2 100 студий nnm+rt): одна дорожка на студию с общим типом; «Дублированный (A, B), Многоголосый (C, D)» — тип у каждой группы свой. 3. **Доразметка ~980 релизов без меток с типом озвучки** (nnm 417, rt 562): найти, почему сборщик их пропустил (вероятно, формат «Перевод 1:» в nnm и «Озвучка: … от X» в аниме), поправить парсер, прогнать relabel. 4. **Форматы кодек-строк в правилах**: расширить `RE_AUDIO_TRACK` / `RE_AUDIO_PREFIX` на «Аудио pic RUS», «Аудио N Rus:», «Аудио #N Русский:», «Звук N:», «• №N:», «Russian (…)» без префикса; одиночное «Аудио:» с типом/студией; `RE_CODEC_TRACK` — студия из словаря без тип-слова; кириллические «АVO/МVO». Тесты на каждый формат. Даёт метки сегментатору (переобучение сегментатора — только если e2e лучше текущих весов) и покрытие фолбэка. 5. **Чистка мусорных студий** — после решений ниже; правила в prepare_data (мусор) и в сборщике (язык-префикс, тип-слова, каналы). ## Решения за вами (не исправления) * **Лицензия / Blu-ray CEE / iTunes / Netflix** (~1 070 строк): студия или источник дорожки? Сейчас модель учится выдавать их как студию. * **«X по заказу Y»** (~320): хранить целиком, только X, или X + заказчик отдельным полем? * **«Русский, - AlexFilm»** (85): срезать язык-префикс — почти наверняка да, но это меняет метки. * **Неру дорожки** (казахский Qazaqstan, «+ Английский + Комментарии», ~36): выкидывать из меток или учить lang-голову (KAZ сейчас < 20 примеров и не учится).