Представляем AnySpeechRecognizer и AnyDecisionModel: открытые модели для работы с речью и принятия решений на платформах Apple

Источник: Hugging Face•

Представляем AnySpeechRecognizer и AnyDecisionModel: открытые модели для работы с речью и принятия решений на платформах Apple

Мы стремимся развивать и демократизировать искусственный интеллект с помощью открытого исходного кода и открытой науки.

Языковые модели способны на многое. Они пишут тексты, создают резюме, переводят и вызывают инструменты. Но это лишь малая часть того, на что способно машинное обучение.

Допустим, клиент звонит в вашу службу поддержки. Сначала нужно узнать, что он сказал (распознавание речи). Затем нужно решить, куда его направить (принятие решений). Можно поручить обе задачи языковой модели, но существуют специализированные модели для каждой из них, которые работают лучше, быстрее и стоят дешевле.

В нашем обзоре AnyLanguageModel 1.0 мы подвели итоги года использования локальных и размещенных на сервере моделей в Swift. Поскольку AnyLanguageModel и swift-huggingface теперь достигли версий 1.x, мы распространяем тот же подход на речь и принятие решений: привычные API Swift с возможностью выбора модели.

Сегодня мы анонсируем два пакета:

  • AnySpeechRecognizer реализует новый API преобразования речи в текст от Apple с возможностью выбора движка распознавания (включая Parakeet от NVIDIA и Qwen3-ASR от Alibaba, работающие локально на Core ML), а также добавляет диаризацию спикеров для отслеживания того, кто и когда говорит.
  • AnyDecisionModel отвечает на вопросы «да-нет», с выбором вариантов ответа и по шкале оценок, возвращая типизированные результаты и вероятности. Он вычисляет каждый ответ на основе вероятностей модели, а не генерирует текст. Для этого используется модель на вашем устройстве с MLX, Core AI или llama.cpp, либо модель принятия решений от Jev или Ollama.

Оба пакета могут загружать открытые модели с Hugging Face Hub и запускать их на устройстве.

AnySpeechRecognizer

Компьютеры расшифровывают речь уже не первое десятилетие, и за последние несколько лет они научились делать это очень хорошо. На платформах Apple для этого уже есть API. macOS 26 и iOS 26 представили SpeechAnalyzer — новый API преобразования речи в текст от Apple. Вы добавляете в анализатор такие модули, как SpeechTranscriber и SpeechDetector, передаете ему файл или поток аудио буферов и считываете результаты из асинхронных последовательностей по мере их поступления. AssetInventory устанавливает модели, поэтому ваше приложение само решает, когда выполнять загрузку.

Это отлично спроектированный API, но единственный поддерживаемый им движок — собственный от Apple. AnySpeechRecognizer сохраняет этот API, позволяя вам выбрать движок:

Пакет повторяет структуру SpeechAnalyzer, SpeechTranscriber, DictationTranscriber, SpeechDetector и AssetInventory, используя фреймворк Speech от Apple в качестве движка по умолчанию. Если ваш код использует этот общий API, достаточно изменить импорт. Чтобы вместо этого использовать Parakeet, измените только способ создания транскрийбера:

Шаги по установке ресурсов, запуск анализатора и чтение результатов остаются прежними. В содержится полный пример и перечислилены отличия от фреймворка Apple.

Знакомство с моделями

Parakeet v3 — это модель Parakeet TDT 0.6B v3 от NVIDIA. Она мультиязычна: распознает 25 европейских языков и сама определяет, какой именно звучит, поэтому указывать локаль не нужно.

Parakeet Ultra — это дообученная версия v3 от компании Moondream. В большинстве наших измерений она показала себя более точной.

Parakeet Unified — англоязычная версия Parakeet от NVIDIA.

Все три модели Parakeet работают на собственной среде выполнения Core ML пакета, которая поддерживает файлы и живой ввод, промежуточные результаты, тайминги слов и оценку уверенности для слов.

Qwen3-ASR — речевая модель от Alibaba в версиях на 0.6B и 1.7B параметров. Она распознает 30 языков и 22 китайских диалекта, включая мандаринский, кантонский, японский и корейский, которые не поддерживаются Parakeet. Она определяет язык автоматически, но вы можете задать его вручную:

Qwen3-ASR выдает один окончательный результат для каждого сегмента длительностью до 40 секунд, без промежуточных результатов, таймингов слов и оценки уверенности. Она работает на GPU и работает медленнее, чем Parakeet, поэтому лучше подходит для расшифровки файлов, а не для живого ввода.

Чтобы добавить другой движок, реализуйте SpeechRecognitionModel для его конфигурации и SpeechRecognitionExecutor для сеанса одного модуля. В README входит небольшой провайдер, который возвращает текст-заполнитель, чтобы помочь вам начать работу.

Модели Core ML на Hub

Чтобы запускать эти модели в приложениях, мы конвертировали их в формат Core ML и опубликовали на Hub:

В каждом репозитории указан исходный чекпоинт и контрольная сумма для каждого файла, а пакет фиксирует его на определенной версии. Репозитории Parakeet добавляют 8-секундный энкодер для живого ввода, что сокращает время анализа в реальном времени примерно на треть ценой небольшого роста уровня ошибок в словах. В репозитории также представлены рабочие процессы конвертации, большинство из которых основано на скриптах FluidInference, причем каждая конвертация проверяется на соответствие оригинальной модели.

Загрузка происходит только тогда, когда ее запрашивает ваше приложение: около 600 МБ для каждой модели Parakeet, плюс около 590 МБ для энкодера реального времени, от 0.9 до 2.4 ГБ для Qwen3-ASR и около 250 МБ для Sortformer. Файлы помещаются в стандартный кэш Hugging Face, поэтому десктопное приложение для Mac вне песочницы может совместно использовать их с Python и другими инструментами Hugging Face.

Диаризация спикеров

При расшифровке разговора часто требуется узнать, кто именно что сказал. Это и есть диаризация спикеров, и поскольку во фреймворке Speech от Apple нет соответствующего модуля, AnySpeechRecognizer добавляет его. SpeakerDiarizer запускает Streaming Sortformer от NVIDIA на базе Core ML параллельно с транскрийбером Apple или Parakeet на общей шкале времени:

Диаризатор отслеживает до четырех спикеров, даже когда они говорят одновременно. Объект SpeakerTimeline собирает результаты и сопоставляет каждое слово с определенным таймингом и конкретным спикером, позволяя распечатать расшифровку по репликам участников. Как и поддержка изображений в AnyLanguageModel, это выходит за рамки возможностей современного API Apple.

По умолчанию диаризатор использует Sortformer v2. Вы также можете выбрать версию v2.1, которую NVIDIA обучила на большем объеме данных встреч, и которая в наших тестах также показала более высокую точность на записях совещаний.

Насколько хорошо это работает?

Мы протестировали пакет с помощью его инструмента командной строки hear на компьютере Mac Studio с процессором M4 Max и macOS 27.0.1. Вот уровни ошибок в словах на файлах LibriSpeech длительностью от 3 до 8 минут:

Parakeet расшифровывает часовую аудиозапись из файла примерно за 20–40 секунд, или примерно за 1.5–2.5 минуты в реальном времени, занимая около 100 МБ памяти после того, как Core ML скомпилирует модель. Qwen3-ASR работает значительно медленнее и требует несколько гигабайт памяти. Совещания даются с трудом для всех: на записях AMI, где люди перебивают друг друга, у каждого протестированного нами движка уровень ошибок в словах превышал 23%.

Эти показатели получены на одном компьютере и на нескольких наборах данных, поэтому проводите измерения на собственном оборудовании и аудиоматериалах. Команда hear evaluate работает с вашими файлами, а инструмент натуральной речевой оценки natural-speech-eval.py из репозитория воспроизводит эти измерения. Пока мы проводили тестирование только на macOS 27, но не на iPhone.

В дальнейшем мы планируем добавить новые движки, в том числе Core AI для macOS 27 и iOS 27.

AnyDecisionModel

AnyDecisionModel — это совсем другая история. Здесь нет фреймворка Apple, под который можно было бы подстроиться, да и модели принятия решений не такая уж новинка.

Модель можно назвать моделью принятия решений только в том случае, если она создана в регионе Décision во Франции; в противном случае это просто игристое zero-shot классификации.

Модель можно назвать моделью принятия решений только в том случае, если она создана в регионе Décision во Франции; в противном случае это просто игристое zero-shot классификации.

Новиздесь заключается в самом названии, огромной шумихе и волне моделей, обученных принимать решения. Мы считаем, что за этим будущее, поэтому нам понадобился Swift API, который к этому готов.

Приложения часто просят языковые модели принимать решения. Является ли это сообщение срочным? Какая команда должна обработать этот тикет? Насколько расстроен этот клиент? Обычный подход заключается в том, чтобы отправить языковой модели промпт и распарсить сгенерированный ею текст. Это дает один ответ, но не показывает вероятности, которые модель присвоила альтернативным вариантам.

Вот как выглядит решение на Swift:

urgent имеет тип Double. team — это Choice<Department>, содержащий выбранный вариант, вероятность для каждой опции и значение уверенности. anger — это Score, содержащий ожидаемый уровень, вероятность для каждого уровня и значение уверенности. Поскольку Department соответствует протоколу Choosable, team.value представляет собой Department, который можно использовать в исчерпывающем операторе switch.

Если вы использовали Foundation Models или AnyLanguageModel, паттерн «модель и сессия» покажется вам знакомым. DecisionSession хранит единое состояние, которое может быть текстом или JSON, и каждый вопрос относится к этому состоянию. Вопросы независимы: ответ никогда не становится входными данными для последующего вопроса. Чтобы задать несколько вопросов одновременно, передайте их в decide(_:) в виде батча.

Для каждого вопроса бэкенд MLX создает промпт с однотокеновой меткой для каждого разрешенного ответа, а затем считывает вероятность каждой метки за один прямой проход (forward pass).

Попробуйте в деле: Emoji Magnet

Emoji Magnet — это приложение для macOS с текстовым полем над кучей из 343 эмодзи. Введите фразу, например «вещи, которые вы носите», и подходящие эмодзи поднимутся из кучи. Уточните ее до «вещи, которые вы носите зимой», и эмодзи, которые больше не подходят, упадут обратно.

В приложении нет встроенных правил по ключевым словам; модель решает все во время инференса. Когда вы перестаете печатать, оно задает модели один вопрос с ответом «да» или «нет» для каждого эмодзи, например:

Состояние сессии хранит введенную фразу. В приведенной выше демо-версии используется хостинговый бэкенд Jev, который отвечает на все 343 вопроса за один запрос, поэтому эмодзи укладываются примерно за полсекунды для каждой фразы. Без TYPESAFE_AI_API_KEY приложение запускает Qwen3 4B на вашем Mac с бэкендом MLX. Этот бэкенд использует кэширование префиксов для однократной оценки состояния, а затем отвечает на 16 вопросов за один прямой проход. На M4 Max группа из 16 вопросов обрабатывается примерно за 0,45 секунды после загрузки модели. Полный проход по всем 343 эмодзи занимает около 10 секунд, и результаты каждой группы появляются по мере их поступления.

Emoji Magnet находится в репозитории AnyDecisionModel-Examples.

Головы решений (Decision heads) и Clef

Чтение вероятностей следующих токенов отлично работает с универсальными языковыми моделями, однако эти модели не обучались принятию решений. Модели Clef от Cloudflare — пример более нового подхода: это модель с обученной головой решений, которая преобразует состояние и схему типизированных вопросов в решения, возвращая вероятности для всех разрешенных вариантов по всем вопросам за один прямой проход. Clef-Flash — это вариант с 9 миллиардами параметров.

AnyDecisionModel запускает Clef-Flash на Mac с помощью MLX:

Вы используете те же сессии и вопросы, но MLXHeadDecisionModel считывает каждое решение из обученной головы решений Clef, а не из вероятностей следующих токенов. 4-битная модель весит 6,2 ГБ для скачивания, и в ее карточке рекомендуется Mac с объемом памяти не менее 16 ГБ. Clef умеет работать с изображениями и видео, но этот бэкенд принимает только текстовые состояния и JSON.

Калибровка и проверка вероятностей

Сырые вероятности от языковых моделей часто бывают излишне самоуверенными. Локальные бэкенды принимают объект Calibration, который применяет температуру к каждому ответу и смещение (bias) к ответам «да/нет». Используйте раздельные наборы данных для настройки калибровки и оценки результатов.

Языковые модели также могут отдавать предпочтение какому-то варианту из-за его позиции в списке. На бэкендах MLX, Core AI и llama.cpp, работающих на основе следующих токенов, включите параметр rotationDebiasing, чтобы задавать вопрос с выбором вариантов для каждого сдвига опций по кругу и усреднять полученные вероятности. Это требует выполнения одной оценки промпта для каждого сдвига.

Каждый локальный выбор и оценка также включают значение уверенности, основанное на энтропии их вероятностей. Оно измеряет степень концентрации вероятностей, а не правильность ответа, поэтому перед выбором порогового значения обязательно проверьте уровень ошибок на собственных данных. Диагностика бэкендов на основе следующих токенов сообщает, какую долю вероятности модель выделила на разрешенные ответы. Низкое значение означает, что большую часть вероятности модель распределила в другие места.

Бэкенды

У AnyDecisionModel есть шесть бэкендов:

  • MLX запускает небольшую языковую модель на чипах Apple Silicon с помощью mlx-swift-lm и скачивает ее из Hub.
  • Головы решений MLX запускают модель с собственной обученной головой решений, такой как Clef.
  • Core AI выполняет те же задачи, что и MLX, используя модель Core AI на macOS 27 и iOS 27.
  • llama.cpp считывает решения из локальной модели GGUF через llama.swift.
  • Jev вызывает Jev от TypeSafe через API System One или любой сервер, реализующий его, например Kev.
  • Ollama вызывает модель принятия решений System One на локальном сервере Ollama или в облаке Ollama. Требуется Ollama версии 0.35.0 или новее (либо 0.40.5 или новее для облачных моделей).

Бэкенды на основе следующих токенов размечают ответы как «да» и «нет», от A до Z или от 0 до 9, поэтому выбор может содержать не более 26 вариантов, а оценка — не более 10 уровней. Головы решений не имеют таких ограничений.

Как и AnyLanguageModel, этот пакет использует трейты пакетов Swift (package traits). Без трейтов у него нет сторонних зависимостей. Вы получаете базовые типы, а также бэкенды Jev и Ollama, которые также собираются на Linux. Включите трейт MLX, CoreAI или Llama для использования локальных бэкендов.

Начало работы

Оба пакета требуют Swift 6.2 или новее, а также macOS 26 / iOS 26 или новее. Среды выполнения Parakeet и Sortformer, а также бэкенд MLX требуют чипов Apple Silicon. Задачи сборки MLX в AnyDecisionModel используют Swift 6.4 или новее от Xcode и тулчейн Metal; для Core AI требуется Xcode 27 и среда выполнения ОС версии 27.

Добавьте пакеты в ваш Package.swift:

В настоящее время трейт CoreAI в AnyDecisionModel нельзя комбинировать с AnySpeechRecognizer, поскольку coreai-kit 0.7.3 требует swift-huggingface версии ниже 1.0, в то время как AnySpeechRecognizer требует версию 1.x.

В каждом файле README содержится больше примеров и подробностей о требованиях и бэкендах. AnySpeechRecognizer также включает инструмент командной строки hear, который транскрибирует локальные файлы, размечает спикеров и оценивает результаты. Каждая команда hear требует указания --backend apple, --backend parakeet или --backend qwen; перед анализом запустите hear prepare с теми же опциями бэкенда и модели, чтобы установить необходимые ассеты.

Попробуйте их в своих приложениях и расскажите нам, что работает, а что нет. Мы приветствуем issues и pull requests в обоих репозиториях.

Ссылки

Спасибо NVIDIA за Parakeet, Sortformer и NeMo, Moondream за Parakeet Ultra, FluidInference (проекты FluidAudio и mobius которой задокументировали соглашения, используемые средой выполнения Parakeet и конвертерами Core ML), Cloudflare за Clef, а также всем, кто внес вклад в AnyLanguageModel, чьи паттерны заимствованы в обоих пакетах.

О чём эта статья

Ещё в разделе «AI и машинное обучение»

Все →

Ещё от Hugging Face