Модель переобучена на пересобранном датасете (15 классов, люб. дубляж); модели в Git LFS обновлены, документация
docker / build (push) Successful in 1m49s
docker / build (push) Successful in 1m49s
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
1 parent
05537ac9e9
commit
111e854789
11 files changed
+8885
-5414
No files matched your search
@@ -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
File diff suppressed because it is too large.
Load diff
@@ -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,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
@@ -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 |
|
||||
|
||||
|
||||
@@ -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
@@ -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 — автора в тексте нет |
|
||||
|
||||
+27
-26
@@ -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=«Дубляж, Blu-ray CEE_ _2007г» text=«Профессиональный (дублированный) |Дубляж, Blu-ray CEE_[Невафильм]_2007»
|
||||
- [rutracker] studio=«Дубляж, Blu-ray CEE_ _2004г» text=«Профессиональный (дублированный) |Дубляж, Blu-ray CEE_[Невафильм]_2004»
|
||||
Reference in new issue
Block a user