Книга: Инжиниринг искусственного интеллекта
Назад: Г.8 Архитектурные паттерны для мультимодальных приложений
Дальше: Д.4 TTS: как компьютер говорит

ГЛАВА Д. ГОЛОСОВЫЕ АССИСТЕНТЫ: ASR, TTS И КОНВЕЙЕРЫ

«Говорить - значит быть услышанным. А для ассистента - ещё и понятым.»



От картинок - к звуку



В главе Г мы научили модель видеть. Но пользователь скорее спросит голосом «Алиса, какая погода?», чем напечатает. Голосовые интерфейсы становятся стандартом, особенно в мобильных и IoT-устройствах.

Эта глава - о том, как устроены голосовые ассистенты, почему они до сих пор медленнее чат-ботов и когда появятся модели, которые слушают и говорят без промежуточного текста.

Голос - это не просто ещё одна модальность. Голос - это самый естественный для человека способ общения. Но для машины - самый сложный.



В главе Д

ASR: как компьютер слышит (Whisper, Vosk, проблемы шума и акцентов).

NLU для голоса: когда нужен быстрый классификатор, а когда -LLM.

TTS: как компьютер говорит (три поколения синтеза речи, от конкатенативного до нейросетевого).

Латентность: почему 5 секунд - это много и как их сокращать.

Клонирование голоса: возможности и риски.



И главное - почему конвейер из трёх моделей (ASR → NLU/LLM → TTS) медленный и хрупкий, но пока лучший вариант. И когда появятся единые модели, которые слушают и говорят без промежуточного текста.



Д.1 Чем голосовой ассистент отличается от чат-бота

Чат-бот работает только с текстом. Вы пишете - он отвечает. Всё просто.

Голосовой ассистент (Алиса, Siri, Google Assistant) работает иначе. Вы говорите - он должен вас услышать, понять, подумать и ответить голосом. Звучит как одно действие, но на самом деле это конвейер из трёх независимых моделей:



ASR (Automatic Speech Recognition) - распознавание речи. Превращает звук в текст.



NLU / LLM - понимание. Понимает, что вы хотели, и генерирует ответ.



TTS (Text-to-Speech) - синтез речи. Превращает текст ответа в звук.



Каждая из этих моделей - отдельная инженерная задача со своими моделями, данными и метриками. И каждая - отдельная точка, где что-то может пойти не так.



Д.2 ASR: как компьютер слышит

Задача ASR - превратить аудио (звуковую волну) в текст.



Как это работает (упрощённо)



Аудио нарезается на очень короткие фрагменты - обычно 25 миллисекунд с шагом 10 миллисекунд. Из каждого фрагмента извлекаются частотные признаки - как «отпечаток» звука. Самая популярная технология - MFCC (мел-кепстральные коэффициенты), которая имитирует восприятие звука человеческим ухом.

Эти признаки подаются в нейросеть. Раньше использовали скрытые марковские модели (HMM), теперь - трансформеры или сверточные сети (CNN). Сеть предсказывает последовательность фонем (минимальных единиц звука) или сразу букв. Фонемы затем собираются в слова с помощью языковой модели.



Современные ASR (на 2025–2026)







Что может пойти не так





Шум

В метро или на улице ASR может не разобрать слова.





Акцент

Модель обучалась на «чистом» русском - грузинский или дагестанский акцент может её сбить.





Омофоны

«Луг» и «лук» звучат почти одинаково. Без контекста ASR ошибётся.





Громкость

Тихая речь или крик - модель может не справиться.





Инженерный совет

Не пытайтесь обучить свой ASR с нуля. Берите Whisper - он решает 95% задач. Если нужна экономия ресурсов (офлайн, телефон) - берите Vosk.





Д.3 От ASR к пониманию: NLU для голоса



Казалось бы, после ASR у нас есть текст. Можно просто скормить его LLM и получить ответ. Для многих сценариев это действительно работает - особенно если вы используете GPT-4o или другую мощную модель.

Но есть нюанс. Голосовые команды часто простые: «поставь будильник на 7 утра», «какая погода в Москве?», «позвони маме». Запускать LLM на каждую такую команду - как стрелять из пушки по воробьям. Дорого и медленно.





Поэтому классический подход к голосовым ассистентам - выделение намерения (intent) и сущностей (entities):





«поставь будильник на 7 утра» → intent = set_alarm, entities = {time: "07:00"}

«какая погода в Москве?» → intent = get_weather, entities = {city: "Москва"}

«позвони маме» → intent = make_call, entities = {contact: "мама"}





Для этого используются маленькие модели - классификаторы на BERT или даже обычные ML-модели (fastText, логистическая регрессия). Они работают за миллисекунды и стоят копейки.

А когда пользователь задаёт сложный вопрос («напомни купить молоко, когда буду у метро»), система переключается на LLM.





Гибридный подход (рекомендуемый)



Назад: Г.8 Архитектурные паттерны для мультимодальных приложений
Дальше: Д.4 TTS: как компьютер говорит