Whistle: вышла нейросеть распознавания речи в файле 16,9 МБ
Whistle, модель распознавания речи для телефонов, носимых устройств, роботов, умного дома, автомобилей и микроконтроллеров. Она поставляется одним файлом в 16,9 МБ, работает на процессоре без зависимостей и загружается в тот же C++-движок, что и Needle, из того же контейнера и с той же квантизацией. Всё считается на самом устройстве.
Модель делает три вещи. Первая, расшифровка: аудио 16 кГц моно длиной до 30 секунд за один проход на английском, немецком, французском, испанском, итальянском, нидерландском и польском; язык определяется автоматически, если его не указать. Вторая, временные метки слов: для каждого слова начало, конец и вероятность, выровненные по вниманию декодера. Третья, речевые эмбеддинги: выход энкодера, по одной строке на каждый кадр в 80 мс, без декодирования текста.
Устройство модели. Звук нарезается окном 25 мс с шагом 10 мс на 80 лог-мел-коэффициентов, ограничивается полосой 250-3500 Гц и нормируется по каналам. 30 секунд, это 3000 кадров; свёрточный блок (128 каналов, ядро 9) трижды вдвое сокращает их число, оставляя 375 кадров по одному на 80 мс. Энкодер, восемь блоков Simple Attention (четыре остаточные линии mHC и MLP Monarch Hadamard вместо обычной feed-forward-сети, те же блоки, что у Needle); внимание не каузальное, то есть кадр на 3-й секунде смотрит на кадр на 12-й. Декодер, восемь блоков Laddered Simple Attention шириной 512, с 8 query-головами на 2 KV-головы, и engram-обращениями в слоях 3 и 7 по 18 432 ячейкам. Особенность для речи, управляемое гейтом перекрёстное внимание к энкодеру в каждом слое декодера: ключи и значения считаются один раз при поступлении клипа и хранятся на всё время декодирования, поэтому пять лучей стоят пяти коротких кэшей транскрипта, а не пяти проходов по аудио.
Декодирование идёт лучевым поиском на пять лучей с нормировкой логарифма вероятности на длину. Есть подсказки по ключевым словам: автомат Ахо, Корасик идёт по переданным фразам рядом с лучами и повышает их вероятность. Транскрипт ограничен 320 токенами; словарь, 8192 текстовых фрагмента плюс семь языковых токенов, поэтому определённый язык выдаётся токеном. Декодер обучен «лесенкой»: каждая глубина от 2 слоёв и выше обучена как отдельная модель, нужную выбирают при загрузке флагом --audio-depth; энкодер не урезается, все восемь блоков работают при любой глубине. Перед декодером движок оценивает диапазон громкости клипа, и на тишине сразу возвращает пустой транскрипт и пустой язык, не запуская лучевой поиск.
Сравнение. По словам авторов, Whistle впереди Whisper base на LibriSpeech test-clean и test-other, SPGISpeech, Earnings-22 и в среднем по FLEURS; Whisper base впереди на TED-LIUM, AMI и в среднем по MLS, но весит 145,3 МБ против 16,9. Для сравнения запускали Whistle на собственном C++-движке (5 лучей), openai-whisper и moonshine-voice в режиме без стриминга по цельному аудио. Время до первого токена у Whistle: 5,9 мс на клипе 5 секунд, 11,1 мс на 10 секундах и 36,3 мс на 30 секундах. Whisper дополняет любой вход до 30 секунд, поэтому его время до первого токена не зависит от длины клипа, а у Whistle оно растёт вместе с ней. Ошибки по словам (WER) считались нормализаторами Whisper; у Whistle они измерены на 86 174 фразах, а для Whisper и Moonshine взяты опубликованные их авторами значения для многоязычных чекпойнтов. Авторы утверждают, что тестовых записей нет в обучающих и валидационных данных, проверяли по контрольным суммам аудио и идентификаторам дикторов.
Использование. Движок поставляется в готовом виде для семнадцати платформ, от macOS и Linux до Android, iOS, watchOS, Windows on ARM, RISC-V, MIPS, браузера и компонента WASI. Речевой C API состоит из трёх функций: needle_load, needle_transcribe и needle_embed. Движок не читает переменные окружения: всё задаётся скомпилированными значениями по умолчанию или явными флагами. Функция needle_complete может принять клип напрямую: движок расшифровывает его, отвечает на транскрипт с учётом переданных инструментов и возвращает один JSON с вызовами и речевыми полями. Вызов возвращает текст, язык, миллисекунды до первого токена и токены в секунду после него; word_timestamps=True добавляет слова с временами и вероятностями, keywords=[...] повышает вероятность указанных фраз, language="de" принудительно задаёт язык. Команда needle whistle playground расшифровывает речь с микрофона в терминале, needle whistle compare прогоняет клип через Whistle, Whisper и Moonshine с таймингами. Веса лежат на Hugging Face, движок, в репозитории Cactus-Compute/needle3, исходный код, на GitHub.
Ключевые факты
- Whistle, один файл 16,9 МБ, работает на CPU без зависимостей в том же C++-движке, что и Needle; Whisper base для сравнения весит 145,3 МБ.
- Три функции: расшифровка до 30 секунд за проход на семи языках (английский, немецкий, французский, испанский, итальянский, нидерландский, польский), временные метки слов с вероятностями и речевые эмбеддинги по одной строке на 80 мс.
- Время до первого токена у Whistle: 5,9 мс на клипе 5 секунд, 11,1 мс на 10 секундах, 36,3 мс на 30 секундах; у Whisper оно не зависит от длины клипа, так как вход дополняется до 30 секунд.
- По данным авторов, Whistle впереди Whisper base на LibriSpeech, SPGISpeech, Earnings-22 и среднем по FLEURS, уступает на TED-LIUM, AMI и среднем по MLS.
- Движок собран для семнадцати платформ (включая Android, iOS, браузер, RISC-V); веса на Hugging Face, код в Cactus-Compute/needle3.
Почему это важно
Распознавание речи целиком на устройстве обычно упирается в размер модели и требования к окружению. Whistle предлагает расшифровку на семи языках, временные метки слов и эмбеддинги в одном файле на 16,9 МБ, который работает на процессоре и не требует зависимостей. Для сравнения, Whisper base занимает 145,3 МБ. Ещё одна особенность: время до первого токена растёт вместе с длиной клипа (5,9 мс на 5 секундах, 36,3 мс на 30), тогда как Whisper всегда дополняет вход до 30 секунд.
Кому это важно
Разработчикам приложений для телефонов, носимых устройств, роботов, умного дома, автомобилей и микроконтроллеров, которым нужна офлайн-расшифровка речи без внешних библиотек. Также тем, кому нужны временные метки слов или речевые эмбеддинги без декодирования текста, и тем, кто уже использует движок Needle.
Как это применить
Достаточно базовой установки, если звук, WAV 16 кГц или сырые отсчёты; для других частот дискретизации и записи с микрофона нужен дополнительный пакет [mic] (soxr и sounddevice). Вызов возвращает текст, язык, миллисекунды до первого токена и токены в секунду; word_timestamps=True добавляет слова с временами, keywords=[...] подталкивает поиск к нужным именам и терминам, language="de" задаёт язык вручную. Команда needle whistle playground позволяет проверить расшифровку с микрофона в терминале, а needle whistle compare прогоняет один клип через Whistle, Whisper и Moonshine с таймингами. Глубину декодера выбирают флагом --audio-depth. Веса, на Hugging Face, движок, в Cactus-Compute/needle3. Условия лицензии и цена в тексте не указаны.
Можно ли доверять
Источник, технический пост самих авторов модели, поэтому сравнения, их собственные. Показатели Whistle по ошибкам в словах измерены авторами на 86 174 фразах, а у Whisper и Moonshine взяты опубликованные их авторами значения для многоязычных чекпойнтов, то есть условия сравнения не идентичны. Сами значения WER в тексте не приведены: сказано лишь, на каких наборах Whistle впереди Whisper base, а на каких позади. Авторы заявляют, что тестовых записей нет в обучающих и валидационных данных, и описывают проверку по контрольным суммам аудио и идентификаторам дикторов. Независимых проверок в тексте нет.
Риски и подводные камни
Whistle обгоняет Whisper base не везде: на TED-LIUM, AMI и в среднем по MLS впереди Whisper base. Сравнение с Moonshine по отдельным наборам в тексте не раскрыто. Расшифровка за один проход ограничена 30 секундами, транскрипт, 320 токенами, поддерживаются семь языков. Оборудование, на котором измерялись тайминги, не указано, поэтому абсолютные миллисекунды стоит проверить на своём устройстве. Из семнадцати платформ не сказано, какие именно проверялись в бенчмарках.