Hugging Face выпустила AnySpeechRecognizer и AnyDecisionModel: речь и решения на Apple

Hugging Face выпустила AnySpeechRecognizer и AnyDecisionModel: речь и решения на Apple

Hugging Face анонсировала два пакета для Swift, которые продолжают подход AnyLanguageModel: привычный программный интерфейс (API) плюс свобода выбора модели. Идея авторов в том, что для распознавания речи и принятия решений существуют специализированные модели, которые лучше, быстрее и дешевле языковой модели общего назначения. Оба пакета умеют скачивать открытые модели с Hugging Face Hub и запускать их на устройстве.

AnySpeechRecognizer повторяет API SpeechAnalyzer, который Apple представила в macOS 26 и iOS 26 (SpeechAnalyzer, SpeechTranscriber, DictationTranscriber, SpeechDetector, AssetInventory), но позволяет выбирать движок. По умолчанию остаётся фреймворк Speech от Apple: если код использует общий API, достаточно заменить import Speech на import AnySpeechRecognizer. Чтобы перейти на другой движок, меняется только создание транскрайбера, например SpeechTranscriber с ParakeetSpeechModel(variant: .v3). Установка ресурсов, запуск анализатора и чтение результатов остаются прежними. Можно подключить и собственный движок, реализовав SpeechRecognitionModel и SpeechRecognitionExecutor.

Доступные модели: Parakeet v3 (NVIDIA Parakeet TDT 0.6B v3) распознаёт 25 европейских языков и сам определяет язык, так что локаль передавать не нужно; Parakeet Ultra, дообученная Moondream версия v3, в большинстве замеров авторов она оказалась точнее; Parakeet Unified, англоязычный Parakeet от NVIDIA. Все три работают на собственной среде выполнения пакета на Core ML и поддерживают файлы и живой ввод, промежуточные (volatile) результаты, тайминги и уверенность по словам. Qwen3-ASR от Alibaba (размеры 0.6B и 1.7B) знает 30 языков и 22 китайских диалекта, включая мандаринский, кантонский, японский и корейский, которых у Parakeet нет. Он выдаёт один итоговый результат на сегмент длиной до 40 секунд, без промежуточных результатов, таймингов слов и уверенности, работает на GPU, медленнее Parakeet и лучше подходит для файлов, чем для живого ввода.

Модели в формате Core ML авторы сами сконвертировали и выложили на Hub. Каждый репозиторий фиксирует исходный чекпойнт и контрольную сумму каждого файла, а пакет привязан к конкретной ревизии. В репозиториях Parakeet есть 8-секундный энкодер для живого ввода: он сокращает время анализа примерно на треть ценой несколько более высокой доли ошибок в словах. Скачивание происходит только по запросу приложения: около 600 МБ на каждый Parakeet, ещё около 590 МБ на живой энкодер, от 0,9 до 2,4 ГБ на Qwen3-ASR и около 250 МБ на Sortformer. Файлы кладутся в стандартный кэш Hugging Face.

Отдельно добавлено определение говорящих (диаризация): в Speech от Apple такого модуля нет. SpeakerDiarizer запускает NVIDIA Streaming Sortformer на Core ML рядом с транскрайбером Apple или Parakeet на общей временной шкале. Он отслеживает до четырёх говорящих, в том числе когда они перебивают друг друга, а SpeakerTimeline приписывает каждое слово с отметкой времени своему говорящему. По умолчанию используется Sortformer v2; можно выбрать v2.1, обученную NVIDIA на большем числе записей встреч и точнее на встречах в замерах авторов.

Замеры сделаны утилитой hear на Mac Studio с M4 Max и macOS 27.0.1. По данным авторов, Parakeet расшифровывает час аудио за 20-40 секунд из файла или за 1,5-2,5 минуты в живом режиме, занимая около 100 МБ памяти после компиляции модели Core ML; Qwen3-ASR заметно медленнее и требует нескольких гигабайт. Встречи трудны для всех: на записях AMI, где люди говорят одновременно, у всех протестированных движков доля ошибок в словах превысила 23%. Авторы предупреждают, что цифры получены на одной машине и нескольких наборах данных, и советуют мерить на своём железе и аудио (hear evaluate работает на своих файлах). Пока проверено только на macOS 27, не на iPhone; в планах, новые движки, в том числе Core AI на macOS 27 и iOS 27.

AnyDecisionModel, другой случай: готового API Apple, на который можно опереться, нет, а сами модели решений, по словам авторов, не совсем новы. Новое, название, шумиха и набор моделей, обученных принимать решения; авторы считают, что именно туда всё идёт, и хотели получить готовый Swift-интерфейс. Обычно приложения просят языковую модель решить, срочно ли сообщение, какой команде передать заявку, насколько раздражён клиент, и разбирают сгенерированный текст, получая один ответ без вероятностей альтернатив. AnyDecisionModel вместо генерации текста берёт ответ из вероятностей модели: вопросы «да/нет», с выбором из вариантов и по шкале оценок, с типизированными результатами. Поддерживаются локальная модель через MLX, Core AI или llama.cpp, а также модели решений от Jev или Ollama.

В примере создаётся MLXDecisionModel (mlx-community/Qwen3-4B-Instruct-2507-4bit) и DecisionSession с текстом обращения клиента. Метод probability даёт Double, choice возвращает Choice с выбранным случаем enum (для типов, поддерживающих Choosable, значение можно использовать в исчерпывающем switch), вероятностями по вариантам и значением уверенности, score, Score с ожидаемым уровнем, вероятностями уровней и уверенностью. Сессия хранит одно состояние (текст или JSON), вопросы независимы и могут передаваться пакетом через decide(_:). MLX-бэкенд для каждого вопроса строит запрос с односимвольной меткой на каждый допустимый ответ и считывает вероятности меток за один прямой проход.

Демонстрация, macOS-приложение Emoji Magnet: над кучей из 343 эмодзи поле ввода; вводишь фразу вроде «things you wear», и подходящие эмодзи всплывают, а при уточнении («in winter») неподходящие падают обратно. Встроенных ключевых правил нет, всё решает модель: после паузы в наборе она получает по одному вопросу «да/нет» на каждый эмодзи. С облачным бэкендом Jev, отвечающим на все 343 вопроса одним запросом, эмодзи оседают примерно за полсекунды на фразу. Без ключа TYPESAFE_AI_API_KEY приложение запускает Qwen3 4B локально через MLX с кэшированием префикса: состояние вычисляется один раз, затем по 16 вопросов за проход. На M4 Max группа из 16 занимает около 0,45 секунды после загрузки модели, полный проход по 343 эмодзи, около 10 секунд. Приложение лежит в репозитории AnyDecisionModel-Examples.

Для моделей с обученной «головой решений» пакет умеет запускать Clef-Flash (вариант на 9B) от Cloudflare на Mac через MLXHeadDecisionModel (mlx-community/clef-flash-4bit, head: .jointSchema). Такая модель превращает состояние и схему типизированных вопросов в решения и возвращает вероятности всех допустимых вариантов по всем вопросам за один прямой проход. 4-битная модель занимает 6,2 ГБ, карточка модели рекомендует Mac не менее чем с 16 ГБ памяти. Clef читает изображения и видео, но этот бэкенд принимает только текст и JSON.

Наконец, о калибровке: сырые вероятности языковых моделей часто завышают уверенность. Локальные бэкенды принимают Calibration, температуру для каждого ответа и смещение для ответов «да/нет»; подбирать калибровку и оценивать результат следует на разных наборах данных. Кроме того, модели могут отдавать предпочтение варианту из-за его места в списке.

Ключевые факты

  • AnySpeechRecognizer повторяет API SpeechAnalyzer из macOS 26/iOS 26 и позволяет выбрать движок: Apple по умолчанию, NVIDIA Parakeet (v3 на 25 европейских языков, Ultra от Moondream, Unified для английского) или Alibaba Qwen3-ASR (30 языков и 22 китайских диалекта); для общего API достаточно сменить import.
  • Добавлена диаризация на NVIDIA Streaming Sortformer: до четырёх говорящих, слова привязываются к спикерам через SpeakerTimeline; по умолчанию Sortformer v2, опционально v2.1.
  • Замеры авторов на M4 Max Mac Studio (macOS 27.0.1): Parakeet расшифровывает час аудио за 20-40 секунд из файла и за 1,5-2,5 минуты вживую, около 100 МБ памяти; на записях встреч AMI у всех движков доля ошибок в словах выше 23%.
  • AnyDecisionModel отвечает на вопросы «да/нет», с выбором и по шкале, беря ответ из вероятностей модели (MLX, Core AI, llama.cpp, Jev или Ollama); поддерживается и Clef-Flash 9B от Cloudflare (4-битная версия 6,2 ГБ, рекомендуется Mac от 16 ГБ).
  • В демо Emoji Magnet (343 эмодзи) локальный MLX-бэкенд с Qwen3 4B обрабатывает группу из 16 вопросов примерно за 0,45 с, полный проход, около 10 с; облачный Jev отвечает на все вопросы за запрос, примерно полсекунды на фразу.

Почему это важно

API SpeechAnalyzer в macOS 26 и iOS 26 удобен, но за ним стоит только движок Apple. Новые пакеты позволяют сохранить тот же код и подставить открытые модели, работающие на устройстве: Parakeet для быстрого распознавания европейских языков и Qwen3-ASR для китайских диалектов, японского и корейского. Вдобавок появляется диаризация, которой в Speech от Apple нет. Во втором пакете показан способ получать от модели не сгенерированный текст, а вероятности решений, что полезно для классификации заявок, оценки срочности или настроения клиента.

Кому это важно

Разработчикам приложений для macOS и iOS на Swift, которым нужна расшифровка звонков, встреч и диктовки без отправки аудио в облако. Тем, кто делает маршрутизацию обращений, модерацию или оценку тональности и хочет типизированные ответы с вероятностями вместо разбора текста. Тем, кто следит за моделями решений вроде Clef от Cloudflare и ищет для них Swift-интерфейс.

Как это применить

Для распознавания: если код уже использует SpeechAnalyzer, замените import Speech на import AnySpeechRecognizer; чтобы взять Parakeet или Qwen3-ASR, поменяйте только создание SpeechTranscriber. Для живого ввода подходят Parakeet (Qwen3-ASR лучше для файлов). Учтите объёмы скачивания: около 600 МБ на Parakeet, до 2,4 ГБ на Qwen3-ASR, около 250 МБ на Sortformer, загрузка происходит только по запросу приложения. Для решений: создайте DecisionSession с состоянием (текст или JSON) и задавайте вопросы через probability, choice и score; для локального запуска используйте MLXDecisionModel, для Clef-Flash, MLXHeadDecisionModel. Подробные примеры авторы вынесли в README и репозиторий AnyDecisionModel-Examples.

Можно ли доверять

Источник, блог самой Hugging Face, то есть заявления о собственных пакетах и их качестве исходят от разработчиков. Результаты замеров получены авторами на одной машине (Mac Studio с M4 Max, macOS 27.0.1) и нескольких наборах данных; сами авторы просят проверять на своём железе и звуке и дают для этого утилиту hear evaluate и скрипт natural-speech-eval.py. Утверждение, что Parakeet Ultra точнее других в большинстве замеров, исходит от авторов; независимых подтверждений в тексте нет. Часть текста о позиционном смещении в конце материала не вошла в пересказ.

Риски и подводные камни

Проверка проводилась только на macOS 27, на iPhone пока нет. На сложных записях встреч с перебиваниями доля ошибок в словах у всех проверенных движков выше 23%. Qwen3-ASR медленнее Parakeet, использует GPU и не даёт промежуточных результатов, таймингов и уверенности. Бэкенд для Clef принимает только текст и JSON, хотя сама модель читает изображения и видео; для Clef-Flash рекомендуется Mac от 16 ГБ. Сырые вероятности языковых моделей часто переоценивают уверенность, поэтому нужна калибровка на отдельном от оценки наборе данных; кроме того, модели могут отдавать предпочтение варианту из-за его позиции в списке.