Модель переобучена на пересобранном датасете (15 классов, люб. дубляж); модели в Git LFS обновлены, документация
docker / build (push) Successful in 1m49s

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
DenozordecandClaude Sonnet 5.5 committed 2026-10-29 20:27:26 +07:00
1 parent 05537ac9e9
commit 111e854789
11 files changed
+8886 -5415

No files matched your search

+2 -2
View File
@@ -3,7 +3,7 @@
По тексту дорожки озвучки (или HTML-странице релиза с трекеров rutracker /
kinozal / nnm-club) модель определяет:
* **тип озвучки** (`translation_type`, 14 классов: проф. дубляж, проф. многоголосый,
* **тип озвучки** (`translation_type`, 15 классов: проф. дубляж, проф. многоголосый,
авт. одноголосый, …) — классификация;
* **автора** (`studio`: студия или переводчик) — извлечение имени прямо из текста
(работает и для авторов, которых не было в обучении) + нормализация по словарю
@@ -70,7 +70,7 @@ docs/ документация
* [docs/architecture.md](docs/architecture.md) — устройство модели и пайплайна
* [docs/dataset.md](docs/dataset.md) — схема датасета, семантика классов, аудит
* [docs/training-windows.md](docs/training-windows.md) — обучение на Windows+GPU, troubleshooting
* [docs/api-reference.md](docs/api-reference.md) — **все значения ответа сервиса (14 классов `translation_type` и др.) и принцип работы; `labels.csv` для этого открывать не нужно**
* [docs/api-reference.md](docs/api-reference.md) — **все значения ответа сервиса (15 классов `translation_type` и др.) и принцип работы; `labels.csv` для этого открывать не нужно**
* [docs/inference.md](docs/inference.md) — CLI/API, JSON-контракт
* [docs/integration.md](docs/integration.md) — Rust/TypeScript: HTTP-сервис и ONNX
+8838 -5370
View File
File diff suppressed because it is too large. Load diff
+1
View File
@@ -7,6 +7,7 @@
"bos_token_id": null,
"classifier_dropout": null,
"directionality": "bidi",
"dtype": "float32",
"eos_token_id": null,
"hidden_act": "gelu",
"hidden_dropout_prob": 0.1,
+1 -1
View File
@@ -1,6 +1,6 @@
{
"backbone": "ai-forever/ruBert-base",
"n_types": 14,
"n_types": 15,
"n_bio": 3,
"dropout": 0.1,
"span_weight": 1.0,
@@ -5,6 +5,7 @@
"авт. одноголосый",
"двухголосый",
"люб. двухголосый",
"люб. дубляж",
"люб. многоголосый",
"люб. одноголосый",
"многоголосый",
Binary file not shown.
Binary file not shown.
+2 -2
View File
@@ -3,10 +3,10 @@
| Документ | Содержание |
|---|---|
| [architecture.md](architecture.md) | Схема пайплайна, multi-task модель (тип + BIO-спан + 18+), почему извлечение вместо классификации |
| [dataset.md](dataset.md) | Схема labels.csv, семантика 14 классов, словарь алиасов, находки аудита и как они обработаны |
| [dataset.md](dataset.md) | Схема labels.csv, семантика 15 классов, словарь алиасов, находки аудита и как они обработаны |
| [training-windows.md](training-windows.md) | Пошаговое обучение на Windows с GPU (RTX 5070 Ti / Blackwell), гиперпараметры, troubleshooting, переобучение на свежем датасете |
| [inference.md](inference.md) | CLI, Python API, JSON-контракт (таблица полей), обработка HTML, ограничения |
| [api-reference.md](api-reference.md) | **Справочник ответа сервиса**: все 14 значений `translation_type`, все поля дорожки и релиза, принцип работы. Читать вместо `data/labels.csv` |
| [api-reference.md](api-reference.md) | **Справочник ответа сервиса**: все 15 значений `translation_type`, все поля дорожки и релиза, принцип работы. Читать вместо `data/labels.csv` |
| [integration.md](integration.md) | Интеграция из Rust и TypeScript: HTTP-сервис (путь А) и ONNX без Python (путь Б), трейдоффы |
| [docker.md](docker.md) | Docker-образ сервиса, переменные окружения (в т.ч. FlareSolverr), API, модели в контейнере, CI/CD в Gitea, развёртывание на VPS |
+8 -8
View File
@@ -67,7 +67,7 @@
| Поле | Тип | Значения / описание |
|---|---|---|
| `segment` | string | текст дорожки, по которому сделано предсказание |
| `translation_type` | string | **один из 14 классов** — [таблица ниже](#translation_type-14-классов) |
| `translation_type` | string | **один из 15 классов** — [таблица ниже](#translation_type-15-классов) |
| `type_confidence` | float 0..1 | вероятность выбранного класса |
| `studio_span` | string \| null | фрагмент текста, распознанный как автор/студия |
| `studio` | string \| null | каноническое имя автора из словаря алиасов; неизвестное имя возвращается как в тексте; `null` — автора нет |
@@ -86,10 +86,10 @@
Поле `lang` описывает только язык дорожки; `role` и `lang` не зависят от `translation_type`.
### translation_type: 14 классов (15 после переобучения на пересобранных данных)
### translation_type: 15 классов
> После пересборки датасета (см. [dataset.md](dataset.md)) добавляется класс `люб. дубляж` — любительский
> дубляж; модели, обученные раньше, его не возвращают и по-прежнему отдают 14 классов из списка ниже.
> Текущая модель знает 15 классов: к 14 из списка ниже добавлен `люб. дубляж` — любительский дубляж
> (см. [dataset.md](dataset.md)); модели, обученные раньше, его не возвращают и отдают 14 классов.
> Источник истины для конкретной модели — `GET /health` → `classes`; клиенту безопасно сопоставлять по подстроке
> (`дубляж` → дубляж), как описано ниже: `люб. дубляж` её содержит.
@@ -98,7 +98,7 @@
```json
["авт. двухголосый", "авт. многоголосый", "авт. одноголосый", "двухголосый", "люб. двухголосый",
"люб. многоголосый", "люб. одноголосый", "многоголосый", "неизвестно", "одноголосый",
"люб. дубляж", "люб. многоголосый", "люб. одноголосый", "многоголосый", "неизвестно", "одноголосый",
"проф. двухголосый", "проф. дубляж", "проф. многоголосый", "проф. одноголосый"]
```
@@ -114,7 +114,7 @@
| Значение | Кто озвучивал | Вид |
|---|---|---|
| `проф. дубляж` | профессиональная студия | дубляж (речь актёров заменяет оригинал; в страницах «Дублированный») |
| `люб. дубляж` | любительская озвучка | дубляж/псевдодубляж; только в моделях, обученных после пересборки датасета |
| `люб. дубляж` | любительская озвучка | дубляж/псевдодубляж; в текущей модели есть; в моделях, обученных раньше, его нет |
| `проф. многоголосый` | профессиональная студия | закадровый, три и более голоса |
| `проф. двухголосый` | профессиональная студия | закадровый, два голоса |
| `проф. одноголосый` | профессиональная студия | закадровый, один голос |
@@ -145,7 +145,7 @@
```ts
type Track = {
segment: string; // никогда null
translation_type: string; // один из 14 классов, никогда null
translation_type: string; // один из 15 классов, никогда null
type_confidence: number; // 0..1
studio_span: string | null; // null — автора в тексте нет
studio: string | null; // null вместе со studio_span
@@ -217,7 +217,7 @@ Cloudflare: FlareSolverr нестабилен.
4. **Контекст аудио.** К тексту дорожки подмешивается подходящая строка «Аудио» страницы
(кодек, каналы, битрейт, язык, 18+) в виде хвоста `[RUS AC3 6ch 448kbps 18+]`.
5. **Модель-классификатор** (`DubTagger` на основе ruBert-base, `models/best`) делает за один проход
несколько предсказаний: `translation_type` (14 классов), спан автора (разметка BIO по токенам),
несколько предсказаний: `translation_type` (15 классов), спан автора (разметка BIO по токенам),
флаг 18+ и язык (`ENG`/`RUS`/`UKR`).
6. **Постобработка.** Автор канонизируется словарём алиасов; 18+ ставится также по строке «Аудио»;
язык: строка «Аудио» → нейросеть → слова в тексте; строка «Аудио» подбирается к дорожке по имени
+2 -2
View File
@@ -62,7 +62,7 @@ model.predict_file("page.txt")
## JSON-контракт
Полный справочник значений (14 классов `translation_type`, `lang`, `role`, `audio`, агрегат релиза, принцип работы) — в [api-reference.md](api-reference.md); ниже краткий пример.
Полный справочник значений (15 классов `translation_type`, `lang`, `role`, `audio`, агрегат релиза, принцип работы) — в [api-reference.md](api-reference.md); ниже краткий пример.
```json
{
@@ -84,7 +84,7 @@ model.predict_file("page.txt")
| Поле | Тип | Описание |
|---|---|---|
| `segment` | string | текст дорожки, по которому сделано предсказание (префикс снят) |
| `translation_type` | string | один из 14 классов (см. docs/dataset.md) |
| `translation_type` | string | один из 15 классов (см. docs/dataset.md) |
| `type_confidence` | float | softmax-вероятность класса |
| `studio_span` | string \| null | фрагмент текста, распознанный как имя автора |
| `studio` | string \| null | каноническое имя автора по словарю алиасов; null — автора в тексте нет |
+28 -27
View File
@@ -1,37 +1,37 @@
# Аудит датасета: data/labels.csv
строк в CSV: 41209
строк после подготовки: 48259 (train 42641 / test 5618)
источники: {'kinozal': 13665, 'rutracker': 16539, 'nnm': 18055}
уникальных нормализованных текстов: 17942
групп (релиз ∪ одинаковый текст): 6367
удалено: пустой текст 0, мусорный studio 153, не-озвучка (оригинал/субтитры) 6, противоречивые дубли 0 (групп-противоречий: 0)
спан автора найден: 23631 (49.0%), не найден: 243
аугментировано морфологических вариантов: 7032
дорожек 18+: 720 (из них без упоминания «18» в тексте: 12)
язык размечен: 20371 из 48259; со строкой «Аудио» во входе: 9575; классы: {'RUS': 20166, 'UKR': 150, 'ENG': 55}; редкие (<20, не учатся): {'DEU': 3, 'FRA': 9, 'CHI': 4, 'POL': 2, 'KAZ': 10, 'GEO': 1, 'BEL': 2, 'KOR': 1, 'LAV': 1, 'CZE': 1, 'ITA': 1}
строк в CSV: 44677
строк после подготовки: 35383 (train 31343 / test 4040)
источники: {'kinozal': 6382, 'rutracker': 14342, 'nnm': 14659}
уникальных нормализованных текстов: 18870
групп (релиз ∪ одинаковый текст): 6681
удалено: пустой текст 0, мусорный studio 155, не-озвучка (оригинал/субтитры) 6, противоречивые дубли 0 (групп-противоречий: 0), несколько дорожек в одной строке 20, лишние повторы (> 40 одинаковых) 16950
спан автора найден: 24004 (67.8%), не найден: 231
аугментировано морфологических вариантов: 7658
дорожек 18+: 701 (из них без упоминания «18» в тексте: 8)
язык размечен: 15282 из 35383; со строкой «Аудио» во входе: 11796; классы: {'RUS': 14673, 'UKR': 556, 'ENG': 53}; редкие (<20, не учатся): {'DEU': 7, 'FRA': 14, 'CHI': 3, 'KAZ': 10, 'GEO': 2, 'BEL': 2, 'KOR': 1, 'JPN': 4, 'LAV': 1, 'CZE': 1, 'ITA': 6, 'SPA': 8}
## Распределение translation_type
- проф. дубляж: 18022
- проф. многоголосый: 13644
- авт. одноголосый: 4199
- неизвестно: 3023
- проф. двухголосый: 2362
- одноголосый: 2189
- люб. многоголосый: 1666
- многоголосый: 1128
- люб. одноголосый: 883
- люб. двухголосый: 707
- проф. одноголосый: 267
- двухголосый: 162
- авт. многоголосый: 5
- авт. двухголосый: 2
- проф. дубляж: 9936
- проф. многоголосый: 9831
- авт. одноголосый: 4265
- неизвестно: 2800
- проф. двухголосый: 2153
- одноголосый: 2126
- люб. многоголосый: 1381
- многоголосый: 824
- люб. одноголосый: 646
- люб. двухголосый: 551
- люб. дубляж: 380
- проф. одноголосый: 293
- двухголосый: 192
- авт. двухголосый: 3
- авт. многоголосый: 2
## Спан не найден (примеры)
- [rutracker] studio=«datynet; : Куценко» text=«Одноголосый закадровый datynet; перевод: Куценко»
- [rutracker] studio=«datynet и Yuka_chan; :Куценко» text=«Любительский (двухголосый закадровый) datynet и Yuka_chan; перевод:Куц»
- [rutracker] studio=«Дубляж, Blu-ray CEE_ _2009г» text=«Профессиональный (дублированный) |Дубляж, Blu-ray CEE_[МОСФИЛЬМ]_2009г»
- [rutracker] studio=«AC3, 6ch , 448 кбит/с Ист-Вест *» text=«Русский (Дублированный), AC3, 6ch (L, C, R, Ls, Rs +LFE), 448 кбит/с |»
- [rutracker] studio=«R5, - Карусель, - Пучков ака Гоблин, - Гаврилов, - Горчаков, - Живов» text=«Многоголосый закадровый - R5, Многоголосый закадровый - Карусель, Авто»
- [rutracker] studio=«ТК Россия, / озвучен в 2009 году» text=«Профессиональный (многоголосый закадровый) |ТК Россия, (Илья Хвостиков»
- [rutracker] studio=«den904 & DeadSno Janetta» text=«Любительский (двухголосый закадровый) den904 & DeadSno перевод Janetta»
- [rutracker] studio=«AC3, 6ch , 448 кбит/с Blu-ray CEE +» text=«Русский (Дублированный), AC3, 6ch (L, C, R, Ls, Rs +LFE), 448 кбит/с |»
@@ -40,5 +40,6 @@
- [rutracker] studio=«AC3, 6ch , 384 кбит/с Сербин» text=«Русский (Профессиональный (один голос)), AC3, 6ch (L, C, R, Ls, Rs +LF»
- [rutracker] studio=«AC3, 6ch , 384 кбит/с Гаврилов» text=«Русский (Профессиональный (один голос)), AC3, 6ch (L, C, R, Ls, Rs +LF»
- [rutracker] studio=«Oдноголосый Матвеев Алексей» text=«Oдноголосый закадровый |Матвеев Алексей|»
- [rutracker] studio=«телеканал Интер, Андрей Гаврилов» text=«Профессиональный (дублированный), Профессиональный (многоголосый закад»
- [rutracker] studio=«1+1 / Новий канал украинский» text=«Профессиональный (двухголосый закадровый) 1+1 / Новий канал [Євген Паш»
- [rutracker] studio=«1+1 / Новий канал украинский» text=«Профессиональный (двухголосый закадровый) 1+1 / Новий канал [Євген Паш»
- [rutracker] studio=«Дубляж, Blu-ray CEE_ _2007г» text=«Профессиональный (дублированный) |Дубляж, Blu-ray CEE_[Невафильм]_2007»
- [rutracker] studio=«Дубляж, Blu-ray CEE_ _2004г» text=«Профессиональный (дублированный) |Дубляж, Blu-ray CEE_[Невафильм]_2004»