Реч в текст на български: изпитание на два локални модела
Излезе нов модел, който обещава по-добро разпознаване на реч. Как да разбереш дали е по-добър за български, а не за рекламата? Един и същ звук, верен текст за сравнение и едно и също мерило. Пробвахме Nemotron 3.5 Transcribe срещу Whisper large-v3 на наша машина — ето метода и какво излезе.
01Какво ще научиш
- Как се сравняват модели за реч в текст честно: тест с верен текст и процент грешни думи.
- Защо „нормализирането“ на текста решава половината сравнение.
- Как се командва модел, който приема указания с думи — език, дословно или изчистено, имена.
- Какво не казва процентът — и защо човек чете грешките.
02Преди да започнеш
- Компютър, на който моделите работят при теб 🔒 локално — гласът не излиза навън. Whisper върви и само на процесор; Nemotron иска видеокарта с много памет.
- Памет за Nemotron: пълните тегла са около 63 GB. Ние ги заредихме „олекотени“ (FP8 при зареждане) — около половината. Машината ни е с 128 GB обща памет.
- Python и ffmpeg — за подготовка на звука и за сметката.
- Около час и половина за сваляне на модела, ако връзката е обикновена.
03Стъпки
-
Вземи записи с верен текст
Без верен текст не можеш да кажеш кой греши — само кой пише различно. Затова започни с публичен тест: FLEURS на Google има български записи и текста им. Взехме 60 различни изречения, по един запис на изречение, с фиксиран случаен избор — така пробата се повтаря.
Звукът във формата, който моделите очакватffmpeg -i zapis.mp3 -ac 1 -ar 16000 zapis.wav -
Мери с едно мерило
Мерилото е процентът грешни думи: колко думи са заменени, изпуснати или добавени спрямо верния текст. Преди сметката и двата текста се „нормализират“ еднакво — малки букви, без препинателни знаци. Иначе един модел губи точки за запетая, а не за дума.
Процент грешни думи · Pythonimport re, unicodedata def dumi(s): s = unicodedata.normalize("NFC", s.lower()).replace("ѝ", "и") return re.sub(r"[^\w\s]", " ", s).split() def razlika(a, b): # колко думи да сменим, махнем или добавим d = list(range(len(b) + 1)) for i, x in enumerate(a, 1): p, d[0] = d[0], i for j, y in enumerate(b, 1): p, d[j] = d[j], min(d[j] + 1, d[j - 1] + 1, p + (x != y)) return d[-1] def greshki(verni, modelni): e = sum(razlika(dumi(v), dumi(m)) for v, m in zip(verni, modelni)) return 100 * e / sum(len(dumi(v)) for v in verni)⚠️Капан: числатаНие не нормализираме числата. „М16“ срещу „М шестнадесет“ се брои за грешка. Затова числата на различни сайтове не се сравняват едно с друго — всеки нормализира по своему. -
Пусни двата модела с едни и същи условия
И на двата кажи изрично езика и сложи „температура“ 0 — без случайност. Whisper приема езика като настройка. Nemotron приема указание с думи заедно със звука: език, дословно или изчистено, как да пише числата, кои имена да очаква.
Указание към Nemotron · транскрипцияAudio transcription. Language: Bulgarian, in its standard writing system. Formatting: punctuation and capitalization. Output: transcript only.Заявка към локалния сървър (vLLM) · Pythonimport base64, requests zvuk = base64.b64encode(open("zapis.wav", "rb").read()).decode() otg = requests.post("http://localhost:<порт>/v1/chat/completions", json={ "model": "nemotron", "temperature": 0, "chat_template_kwargs": {"enable_thinking": False}, "messages": [{"role": "user", "content": [ {"type": "text", "text": "Audio transcription. Language: Bulgarian. Output: transcript only."}, {"type": "audio_url", "audio_url": {"url": "data:audio/wav;base64," + zvuk}}]}]}) print(otg.json()["choices"][0]["message"]["content"])💡Имена и терминиДобави към указанието „Context terms:“ и изброй имената, които ще се чуят — организации, хора, места. Така моделът ги пише правилно, вместо да ги гадае. -
Прочети числата — и грешките
На 60-те български изречения:
Резултат · 28.10.2026Модел Грешни думи По-добър в Whisper large-v3 15,23 % 14 изречения Nemotron 3.5 Transcribe 11,86 % 36 изречения (равни: 10 изречения)Nemotron пише по-чисто окончанията и сложните думи: „заледяванията и снеговалежите“ там, където Whisper пише „залетяванията и снеговележите“. Но прочети и обратните случаи. В едно изречение Nemotron „довърши смисъла“ сам и написа гладко, но грешно: „спускащи се от М шестнадесет“ вместо „с пушката си М16“. В жив запис веднъж обърна смисъла на цяло изречение.
✅ПравилотоПо-малко грешни думи не значи по-безопасен текст. Протокол, цитат или решение, записано от модел, се чете от човек срещу звука.⚠️Капан: скоросттаWhisper ни работеше на процесора, Nemotron — на видеокартата. Затова 17 секунди срещу 1 секунда на запис не е сравнение на моделите, а на машините. Скорост сравнявай само на една и съща техника. -
Пробвай жив запис и превод
Тестовите записи са четене на глас. Живата реч в зала е по-трудна. Пуснахме по 3 минути жива лекция на български — двата текста се различаваха в около 12 % от думите, без верен текст, по който да кажем кой е прав. Тук решава човек, който слуша.
Nemotron може и да превежда от звук: пуснахме английско изказване с указание „Please translate the given speech to Bulgarian.“ и получихме гладък български текст. Whisper превежда само към английски.
⚠️Капан: грешно зададен езикАко кажеш на Whisper „български“, а записът е на английски, той връща полупревод с грешки. Първо провери на какъв език е записът — Whisper може да го познае сам, ако не му зададеш език.
04Проверка
1. Какво ти трябва, за да кажеш кой модел греши по-малко?
2. Защо текстовете се нормализират преди сметката?
3. Моделът с по-малко грешни думи написа протокол от среща. Какво правиш?
4. Единият модел работи на процесор, другият на видеокарта. Какво казва разликата в скоростта?
05Какво следва
06Източници
- NVIDIA · Nemotron 3.5 Transcribe — картата на модела — езици, указания, пускане с vLLM, лиценз (на английски).
- NVIDIA · Nemotron 3.5 Transcribe и Granary v2 — какво е „транскрипция с указания“ (на английски).
- Google · FLEURS — тестовите записи с верен текст, вкл. български.
- OpenAI · Whisper large-v3 и faster-whisper — моделът и бързото му изпълнение.
- The New Stack · Nvidia launches a promptable transcription model — новината, 28.10.2026 (на английски).