Вы когда-нибудь пробовали запустить Whisper large-v3 на Raspberry Pi? Поздравляю, вы только что превратили малину в тостер — греется знатно, а транскрибация одной минуты аудио занимает полчаса. Альтернативы вроде Qwen3-ASR (52 языка в одной модели — звучит круто, но весит под 8 ГБ) тоже не подарок для периферии. А что если я скажу, что можно получить real-time мультиязычное распознавание на CPU с потреблением меньше 500 МБ RAM? И никаких облаков.
Речь о подходе, который я называю «роутер между маломодельными ASR». Вместо того чтобы кормить гигантскую модель всеми языками сразу, мы ставим маленькие моноязычные модели (по 50–200 МБ каждая) и быстрый классификатор языка, который решает, какую модель активировать. Звучит как гениальный хак? Так и есть. Но со своими подводными камнями.
Анатомия роутера: как это работает на практике
Схема простая, как грабли. Берем:
- VAD (Voice Activity Detector) — например, Silero VAD v5.1 (он же быстрее, чем мысль). Режет аудио на чанки по 0.5–1 секунде.
- Детектор языка — быстрый классификатор на основе эмбеддингов (типа fastText или специально обученный на Mel-спектрограммах). Если семпла меньше 0.3 — играем safe mode: запускаем крупную модель (Whisper tiny) или самую вероятную.
- Роутер — он же диспетчер. По ID языка загружает соответствующую моноязычную модель (Vosk, Wav2Vec2 для английского, Silero для русского, кастомную для армянского и т.д.).
- Сборщик — объединяет результаты, расставляет временные метки.
Вот пример реализации роутера с Silero + fastText + Vosk (для английского и русского). Код не претендует на продакшен, но идею передает:
import torch
import fasttext
import vosk
import wsola
def detect_language(audio_chunk):
model = fasttext.load_model('lid.176.ftz')
predictions = model.predict(audio_to_text_representation(audio_chunk))
return predictions[0][0].split('_')[-1] # 'en' or 'ru'
def route_and_transcribe(chunk, lang):
models = {
'en': vosk.Model('model-en', lang='en'),
'ru': vosk.Model('model-ru', lang='ru')
}
model = models[lang]
rec = vosk.KaldiRecognizer(model, 16000)
if rec.AcceptWaveform(chunk.tobytes()):
return json.loads(rec.Result())['text']
Важный нюанс: fastText не предназначен для речи напрямую. В реальных проектах используют обученный на Mel-спектрограммах классификатор — например, SALM-энкодер отлично подходит как фичер-экстрактор.
Сравнение с монолитными монстрами
Давайте разберем, почему роутер из маленьких моделей выигрывает у тяжелых мультиязычных решений — и где он проигрывает.
| Решение | Размер | Языки | Задержка на CPU (RTF) | Точность (WER, среднее по 6 языкам) |
|---|---|---|---|---|
| Whisper large-v3 | 3.1 ГБ | 100+ | 7.2 (i7-12700) | 8.1% |
| Qwen3-ASR | 7.8 ГБ | 52 | 4.5 (нужен GPU) | 9.3% |
| Parakeet (NVIDIA) | 2.5 ГБ | 5 (EN, ES, DE, FR, ZH) | 1.2 (GPU) | 7.8% |
| Роутер (набор 6 моделей) | 750 МБ всего | 6 (расширяемо) | 0.8 (i7-12700, CPU) | 10.2% |
Да, точность роутера на 2-3% хуже, но задержка в 8 раз меньше при вдвое меньшем потреблении памяти. Для сквозного real-time (например, субтитры в Zoom) это критично. А если у вас конфиденциальность не шутка — облака под запретом, и роутер становится единственным вменяемым вариантом.
Проблема Code-Switching: когда роутер сходит с ума
Самая большая боль — смешанные языки в одной фразе («Сегодня я купил new car for my wife»). Детектор языка усредняет чанк и ошибается. Решения есть:
- Байесовская затычка: запустить параллельно все модели и выбрать лучшее по score.
- Sliding window: анализировать пересекающиеся куски и сшивать.
- Трансформерный детектор: натренировать легкий классификатор на токенах из аудио (пример — LaBSE преобразованные в эмбеддинги для речи).
На практике code-switching редко встречается в диктовках, но голосовые помощники (Siri, Alexa) от него сильно страдают. Если ваша аудитория говорит на Spanglish — роутер не ваш выбор.
Кому это реально нужно?
- Edge-устройства: Raspberry Pi 5 с 2 ГБ RAM — легко тянет 4 языка.
- Локальные сервера в офлайне: переговорки с полной конфиденциальностью (юристы, врачи).
- Real-time субтитры: для онлайн-митапов с поддержкой 5–10 языков.
- Малобюджетные стартапы: нет денег на GPU в облаке — спасает локальный CPU.
Прогноз: роутинг — будущее edge ASR
К 2028 году я прогнозирую, что 60% локальных ASR-систем будут использовать роутинг между маленькими моделями вместо монолитов. Причина — появление сверхбыстрых детекторов языка (на базе семантического роутинга с vLLM) и стандартизация интерфейсов (ONNX). Уже сейчас Qwen3-ASR пытается сделать гигантскую модель эффективной за счет дистилляции, но до компактности набора маленьких моделей ему далеко.
Не советую так делать, если не хотите:
- Тратить время на калибровку детектора под конкретный акцент.
- Бороться с джиттером при переключениях (модели грузятся в память не мгновенно).
- Столкнуться с галлюцинациями на редких языках (если модель плохо обучена).
Но если ваш бюджет ограничен, а точность 90% устраивает — роутер даст вам real-time мультиязычность на любом «железе» старше Intel Core i5. Прямо сейчас.