Qwen-2.5-Omni умеет работать почти с любыми данными. Разбираем, как
Давно мы не обсуждали конкретные модели. Давайте сегодня обсудим, тем более, повод имеется: модель Qwen2.5-Omni. Она вышла в прошлом году, умеет работать с разными типами данных, у неё открытый исходный код и любопытная архитектура.
Я люблю Qwen: это модели хорошего качества. Не без заскоков, но кто вообще без заскоков? Архитектура её любопытна тем, что состоит из двух частей: модели, которая думает, и модели, которая выдаёт ответ. Подробности есть в техническом отчёте, а я здесь на пальцах поясню, что к чему.
Сразу про использование: достать её можно на github и huggingface – это если вам код писать. Если просто в чате пообщаться, то есть интерфейс.
Честно скажу: не пользовалась. Но я до него доберусь. Сейчас уже доступна версия Qwen3-Omni – в общем, загляните туда при случае.
Сделать так, чтобы модель могла одновременно обрабатывать, например, текст, звук и изображение – непростая задача: разные типы данных по-разному преобразуются в векторы, и их потом сложно совместить, чтобы модель могла с ними работать. Ну и есть чисто технические ограничения, связанные с вычислительными мощностями и с тем, что при обработке куски данных будут перемешиваться и сбивать результат.
Так что первое достижение авторов этой работы – новый способ трансформации видео в векторы. Я думаю, вы знаете, но на всякий случай поясню: модель может работать только с числами, поэтому всё, что мы даём ей на вход, превращаем сначала в числа. Особенно это сложно с видео, потому что там непрерывный поток изображений и аудиодорожка.
Так вот, авторы придумали изящный выход: разбить то и другое на кусочки, пронумеровать и передавать последовательно (видео – аудио – видео – аудио). Это чтобы информация была синхронизирована – раз, и чтобы было понятно, какой кусок звука относится к какому куску видео – два.
А второе достижение – новая двойная архитектура.
Думающая часть архитектуры Qwen2.5-Omni принимает и обрабатывает данные в формате текста, видео и звука. Она же преобразует эти данные в векторы и генерирует ответ в виде текста, а говорящая часть – это, по собственному выражению авторов, «рот». То есть, она произносит сгенерированный текстовый ответ.
На первый взгляд может показаться, что думающая часть делает всю работу, но у «рта» тоже важная роль.
Во-первых, у двух специализированных моделей результаты получаются лучше, чем у одной модели, которая и пишет, и говорит.
Во-вторых, текстовый ответ генерируется последовательно, токен за токеном (мы здесь про это говорили подробно). Если его так же, токен за токеном, произносить, он будет звучать неестественно – лучше сначала весь ответ целиком сгенерировать, потом озвучить с правильной тональностью.
Так что разделение труда в итоге позволяет производить более естественно звучащую речь.
Помимо прочего, они ещё используют прямую оптимизацию предпочтений, чтобы сделать процесс генерации речи стабильнее. Чтобы модель хорошо понимала разные акценты, особенности произношения и помехи в записи звука, ей нужно во время обучения передавать не идеально чистые, а реалистичные записи со всеми перечисленными особенностями. Но тогда во время генерации речи она тоже будет добавлять те же особенности, а это нам не нужно. Прямая оптимизация предпочтений как раз позволяет настроить генерацию выхода так, чтобы убрать лишнее и чтобы качество звука всегда было высокое.
Заключение
В общем, модель интересная, ещё и маленькая, что здорово: можно использовать локально. Если у меня руки дойдут её протестировать, напишу об этом у себя в телеграме. Я записываю все свои созвоны и совещания, потом делаю расшифровку и использую для этой цели whisper-large-v3 – справляется хорошо. Будет интересно сравнить её с Qwen.
Расшифровки совещаний я, естественно, не покажу никому, но что-нибудь придумаю для наглядности. Наговорю какой-нибудь текст на ходу в метро или что-то в этом роде.