-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmodels.py
More file actions
129 lines (106 loc) · 7.27 KB
/
Copy pathmodels.py
File metadata and controls
129 lines (106 loc) · 7.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
"""Каталог моделей распознавания - описание данными (PLAN 2.3).
Один список, из которого живут и настройки, и автовыбор, и загрузка. Добавить
модель = дописать строку сюда, а не править UI.
Размеры - не «на глаз» и не из статей: посчитаны по метаданным HuggingFace для
тех самых файлов, которые onnx-asr реально качает под нужную квантизацию
(16 июля 2026). В одном репозитории лежат все варианты сразу, поэтому размер
репозитория - не размер модели: у GigaAM папка целиком 852 МБ, а нужный набор
int8 - 226 МБ. План, кстати, ошибался: Parakeet int8 весит 670 МБ, а не 456.
Про sha256. Плановый пункт «проверка sha256» закрыт не своей таблицей хэшей, а
тем, что её и так делает huggingface_hub: он тянет файлы по sha-адресуемым
блобам и сверяет их сам. Свои константы пришлось бы править при каждой
переквантизации у автора репозитория - это ловушка, а не проверка.
Квантизация: int8 вчетверо легче fp32 и на нашей проверке не потеряла ни слова
(tools/bench_asr.py умеет сравнить оба варианта на вашей речи).
"""
from dataclasses import dataclass
# Умолчание - GigaAM v2 CTC. Она точнее v3 по единственному независимому
# замеру (8.42 против неизвестного - v3 независимо не мерил никто), а знаки
# препинания за неё ставит программа: полировкой, если стоит Ollama, и заглавной
# с точкой, если не стоит.
#
# Раньше умолчанием была v3 e2e - ровно потому, что сама расставляла знаки. С
# разбором на ходу (streaming.py) её преимущество в скорости перестало что-либо
# значить: пока человек говорит, успевает любая модель из каталога.
DEFAULT = "gigaam-v2-ctc"
@dataclass(frozen=True)
class Model:
id: str # идентификатор для onnx-asr (или репозиторий HF)
title: str # как показать человеку
quant: str | None # int8 | None (fp32)
size_mb: int # столько скачается на самом деле
langs: str # словами, а не кодами: это читает человек
device: str # на чём разумно жить
license: str
url: str
why: str # одна строка: зачем она вообще в списке
# Ставит ли модель знаки препинания сама. У GigaAM это умеет только
# вариант e2e; обычные CTC и RNN-T отдают сплошную строчную строку.
#
# От этого зависит, звать ли punct_rules: поверх модели, которая уже
# расставила знаки, правила дадут дубли и запятую там, где e2e осознанно
# её не поставила.
punctuates: bool = False
CATALOG: list[Model] = [
Model(
id="gigaam-v2-ctc",
title="Обычная",
quant="int8",
size_mb=236,
langs="русский",
device="CPU",
license="MIT",
url="https://huggingface.co/ai-sage/GigaAM",
why="Самая точная по независимому замеру. Подходит почти всем.",
),
Model(
id="gigaam-v2-rnnt",
title="Внимательная",
quant="int8",
size_mb=238,
langs="русский",
device="CPU",
license="MIT",
url="https://huggingface.co/ai-sage/GigaAM",
why="Чуть медленнее, но аккуратнее с окончаниями и редкими словами.",
),
]
# Каталог намеренно из двух моделей, а был из девяти.
#
# Девять - это витрина, а не выбор. Человек, которому программу отдали, не
# может отличить CTC от RNN-T и не должен: он не знает, что выбирает, и любой
# его выбор будет случайным. А случайный выбор здесь дорог - половина моделей
# не ставит знаков препинания, часть весит гигабайт, часть плоха на русском.
#
# Убраны: Parakeet и Whisper (по-русски заметно хуже, а многоязычность нужна
# не владельцу), Vosk и T-one (легче и быстрее, но точность ниже - а после
# разбора на ходу скорость перестала что-либо решать), GigaAM v3 (её главное
# преимущество - собственная пунктуация - обесценилось, когда знаки стала
# ставить сама программа).
#
# Достать любую из них обратно: git show <коммит>~1:models.py.
BY_ID = {m.id: m for m in CATALOG}
def get(model_id: str) -> Model | None:
return BY_ID.get(model_id)
def quant_for(model_id: str, fallback: str | None = "int8") -> str | None:
m = BY_ID.get(model_id)
return m.quant if m else fallback
def puts_punctuation(model_id: str) -> bool:
"""Ставит ли эта модель знаки препинания сама.
Для модели не из каталога решаем по имени: e2e-варианты GigaAM умеют, всё
остальное - нет. Это нужно не для красоты, а для людей, обновившихся со
старой версии: в их конфиге лежит gigaam-v3-e2e-rnnt, которого в каталоге
уже нет, а знаки он ставит.
"""
m = BY_ID.get(model_id)
if m is not None:
return m.punctuates
return "e2e" in str(model_id or "").lower()
def pick(_language: str | None = None) -> str:
"""Какую модель ставить. Всегда одну и ту же.
Раньше здесь был выбор по языку: русский - GigaAM, остальное - Parakeet.
Многоязычных моделей в каталоге больше нет, и выбирать не из чего.
Функцию оставляем: её зовут мастер первого запуска и миграция конфига, и
ломать их ради одной строки незачем.
"""
return DEFAULT