Привет, Хабр! В этом посте я продолжаю цикл статей о том, как выжать максимум из обычного VPS от RUVDS. В прошлый раз мы экспериментировали с языковыми моделями, а сегодня попробуем запустить систему распознавания речи — FasterWhisper, оптимизированную версию модели Whisper от OpenAI. Как и в прошлый раз, сделаем это в рамках бюджета в 5000 рублей в месяц.
Что такое Whisper?
Прежде чем мы начнём эксперименты, давайте разберёмся, с чем имеем дело. Whisper — это система автоматического распознавания речи (ASR), разработанная OpenAI и выпущенная в открытый доступ в сентябре 2022 года. В отличие от многих других моделей, Whisper обучался на внушительном наборе данных — 680 000 часов многоязычного аудио, собранного из интернета. И здесь кроется его главное преимущество: благодаря такому разнообразному датасету модель отлично справляется с различными акцентами, фоновым шумом и даже специализированной лексикой. И самое главное, в отличие от своих более популярных собратьев, произведённых OpenAI (ChatGPT различных версий), Whisper является Open Source моделью с открытым доступом. Да, иногда Open в OpenAI всё-таки означает Open Source, но, увы, лишь иногда.
Архитектура Whisper достаточно проста: это encoder-decoder трансформер, который принимает на вход 30-секундные отрезки аудио, преобразованные в лог-мел спектрограмму. А дальше начинается самое интересное: декодер не просто расшифровывает речь, но и умеет определять язык, ставить временные метки для фраз и даже переводить речь на английский. Причём всё это — в рамках одной модели без необходимости дополнительных настроек.
FasterWhisper, с которым мы будем работать — это оптимизированная версия оригинальной модели, использующая CTranslate2 для ускорения инференса. По сути, это тот же Whisper, но значительно быстрее и эффективнее в использовании ресурсов. Что особенно важно для нашего эксперимента на VPS.
Настраиваем окружение
Система у нас остаётся прежней — CentOS из прошлой статьи, как и остальная конфигурация сервера — 4 ядра CPU и 12 гигабайт RAM. И тут стоит сделать небольшое отступление, почему мы выбрали именно Docker-версию FasterWhisper. За кадром осталась увлекательная история о том, как Whisper на CPU умудрился изрядно попить крови у автора — что при установке через pip, что через conda. И это притом, что на домашней машине с CUDA и GPU от NVIDIA всё вставало без малейших проблем! Складывается впечатление, что CPU-версия живёт какой-то своей, особенно капризной жизнью. Либо, возможно, как это часто бывает с нейросетевыми проектами, мне не повезло, когда какая-то из библиотек для Python успела обновиться недавно и поломала совместимость с зависимостями, что за ней ещё пока не успели обновиться следом.
А в Docker-контейнере окружение уже настроено и содержит все необходимые зависимости. Тем более, что по аппетитам Whisper достаточно скромная модель, а Docker процессорных ресурсов почти не потребляет — теми несколькими сотнями мегабайт памяти, которые он съест, вполне можно пожертвовать ради душевного спокойствия и рабочего решения из коробки.
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
FasterWhisper Server
Теперь самое интересное — запустим FasterWhisper Server в контейнере. Что здесь происходит? Мы запускаем готовый Docker-образ с FasterWhisper, который уже настроен для работы на CPU.
docker run --publish 8000:8000 --volume ~/.cache/huggingface:/root/.cache/huggingface fedirz/faster-whisper-server:latest-cpu
Важный момент — мы монтируем кэш Hugging Face в контейнер, чтобы не скачивать модели каждый раз при перезапуске. Веб-интерфейс на основе Gradio будет доступен по появившемуся в консоли адресу — 0.0.0.0:8000, откроем его и продолжим уже в нём.
Тестируем на практике
Для тестирования я выбрал не совсем обычный материал, а именно отрывок из так и не завершённого романа «Азатот» Говарда Филипса Лавкрафта, причём сразу в двух версиях: оригинал на английском и русский перевод. Почему именно это произведение? Во-первых, оно относительно короткое, что идеально для первичного тестирования. Во-вторых, содержит специфическую лексику и сложные конструкции, что поможет проверить возможности модели в более сложных условиях, чем простая повседневная речь. В-третьих, я просто очень люблю творчество Лавкрафта, и это одно из моих любимых его произведений.
Азатот на русском
Когда мир состарился и люди разучились удивляться чудесам; когда тускло-серые города уперлись в дымное небо своими уродливыми и мрачными домами-башнями, в тени которых невозможно даже помыслить о ласковом солнце или цветущих весенних лугах; когда учёность сорвала с Земли покровы красоты, а поэтам осталось воспевать лишь неясные видения, кое-как углядев их затуманенным внутренним взором; когда эти времена настали и все былые наивные мечтания безвозвратно канули в Лету, жил один человек, который научился странствовать за пределами скучной повседневной жизни — в тех пространствах, куда удалились мечты, покинувшие этот мир.
Об имени и месте жительства этого человека известно мало; впрочем, имена и места имеют какое-то значение только в обыденном, бодрствующем мире и потому не представляют для нас интереса. Нам вполне достаточно знать, что он жил в большом городе среди высоких стен, где царили вечные сумерки, и что он проводил свои дни в безрадостных и суетливых трудах, а по вечерам возвращался домой — в комнату с единственным окном, из которого открывался вид не на поля или рощи, а на унылый двор с точно такими же окнами, глядевшими друг на друга в тупом безысходном отчаянии. В этом каменном мешке больше не на что было глядеть, и лишь перегнувшись через подоконник и посмотрев прямо вверх, можно было увидеть кусочек неба с двумя-тремя проплывающими звездочками. А так как зрелище однообразных стен и окон способно свести с ума человека, который все свободное время посвящает мечтам и книгам, обитатель этой комнаты взял за правило еженощно высовываться из окна, чтобы увидеть вверху частичку того, что лежит за пределами будничного мира, заключенного в сумрачных стенах многоэтажных городов. С годами он научился различать медленно проплывающие звезды, называл их по именам, а в своем воображении продолжал следить за их полетом и после того, как они исчезали из виду. Так проходила его жизнь, пока однажды его сознание не раскрылось для таких потрясающих картин, какие не дано узреть обычному человеческому глазу. В ту ночь была разом преодолена гигантская пропасть, и загадочные небеса спустились к окну одинокого мечтателя, чтобы смешаться с воздухом его тесной комнатушки и сделать его свидетелем невероятных чудес.
В полночь комнату озарили потоки лилового сияния с золотистыми блестками, а за ними внутрь ворвались вихри огня и пыли, насыщенные ароматами запредельных миров. И он узрел пьянящий океанский простор, озаренный неведомыми людям солнцами, а также диковинных дельфинов и морских нимф, резвящихся в неизмеримых глубинах. Некая беззвучная и беспредельная стихия приняла мечтателя в свои объятия и увлекла его в таинственные дали, при этом не коснувшись его тела, которое так и застыло на подоконнике. Много дней, несовпадающих с земными календарями, ласковые волны запредельных сфер несли человека к его мечтам — тем самым мечтам, которые были забыты и утрачены остальными людьми, — а потом он провел долгие счастливые века спящим на залитом солнцем зеленом берегу под благоухание цветущих лотосов и алых гиацинтов.
Об имени и месте жительства этого человека известно мало; впрочем, имена и места имеют какое-то значение только в обыденном, бодрствующем мире и потому не представляют для нас интереса. Нам вполне достаточно знать, что он жил в большом городе среди высоких стен, где царили вечные сумерки, и что он проводил свои дни в безрадостных и суетливых трудах, а по вечерам возвращался домой — в комнату с единственным окном, из которого открывался вид не на поля или рощи, а на унылый двор с точно такими же окнами, глядевшими друг на друга в тупом безысходном отчаянии. В этом каменном мешке больше не на что было глядеть, и лишь перегнувшись через подоконник и посмотрев прямо вверх, можно было увидеть кусочек неба с двумя-тремя проплывающими звездочками. А так как зрелище однообразных стен и окон способно свести с ума человека, который все свободное время посвящает мечтам и книгам, обитатель этой комнаты взял за правило еженощно высовываться из окна, чтобы увидеть вверху частичку того, что лежит за пределами будничного мира, заключенного в сумрачных стенах многоэтажных городов. С годами он научился различать медленно проплывающие звезды, называл их по именам, а в своем воображении продолжал следить за их полетом и после того, как они исчезали из виду. Так проходила его жизнь, пока однажды его сознание не раскрылось для таких потрясающих картин, какие не дано узреть обычному человеческому глазу. В ту ночь была разом преодолена гигантская пропасть, и загадочные небеса спустились к окну одинокого мечтателя, чтобы смешаться с воздухом его тесной комнатушки и сделать его свидетелем невероятных чудес.
В полночь комнату озарили потоки лилового сияния с золотистыми блестками, а за ними внутрь ворвались вихри огня и пыли, насыщенные ароматами запредельных миров. И он узрел пьянящий океанский простор, озаренный неведомыми людям солнцами, а также диковинных дельфинов и морских нимф, резвящихся в неизмеримых глубинах. Некая беззвучная и беспредельная стихия приняла мечтателя в свои объятия и увлекла его в таинственные дали, при этом не коснувшись его тела, которое так и застыло на подоконнике. Много дней, несовпадающих с земными календарями, ласковые волны запредельных сфер несли человека к его мечтам — тем самым мечтам, которые были забыты и утрачены остальными людьми, — а потом он провел долгие счастливые века спящим на залитом солнцем зеленом берегу под благоухание цветущих лотосов и алых гиацинтов.
Азатот на английском
When age fell upon the world, and wonder went out of the minds of men; when grey cities reared to smoky skies tall towers grim and ugly, in whose shadow none might dream of the sun or of spring’s flowering meads; when learning stripped earth of her mantle of beauty, and poets sang no more save of twisted phantoms seen with bleared and inward-looking eyes; when these things had come to pass, and childish hopes had gone away forever, there was a man who travelled out of life on a quest into the spaces whither the world’s dreams had fled.
Of the name and abode of this man but little is written, for they were of the waking world only; yet it is said that both were obscure. It is enough to know that he dwelt in a city of high walls where sterile twilight reigned, and that he toiled all day among shadow and turmoil, coming home at evening to a room whose one window opened not on the fields and groves but on a dim court where other windows stared in dull despair. From that casement one might see only walls and windows, except sometimes when one leaned far out and peered aloft at the small stars that passed. And because mere walls and windows must soon drive to madness a man who dreams and reads much, the dweller in that room used night after night to lean out and peer aloft to glimpse some fragment of things beyond the waking world and the greyness of tall cities. After years he began to call the slow-sailing stars by name, and to follow them in fancy when they glided regretfully out of sight; till at length his vision opened to many secret vistas whose existence no common eye suspects. And one night a mighty gulf was bridged, and the dream-haunted skies swelled down to the lonely watcher’s window to merge with the close air of his room and make him a part of their fabulous wonder.
There came to that room wild streams of violet midnight glittering with dust of gold; vortices of dust and fire, swirling out of the ultimate spaces and heavy with perfumes from beyond the worlds. Opiate oceans poured there, litten by suns that the eye may never behold and having in their whirlpools strange dolphins and sea-nymphs of unrememberable deeps. Noiseless infinity eddied around the dreamer and wafted him away without even touching the body that leaned stiffly from the lonely window; and for days not counted in men’s calendars the tides of far spheres bare him gently to join the dreams for which he longed; the dreams that men have lost. And in the course of many cycles they tenderly left him sleeping on a green sunrise shore; a green shore fragrant with lotus-blossoms and starred by red camalotes.
Of the name and abode of this man but little is written, for they were of the waking world only; yet it is said that both were obscure. It is enough to know that he dwelt in a city of high walls where sterile twilight reigned, and that he toiled all day among shadow and turmoil, coming home at evening to a room whose one window opened not on the fields and groves but on a dim court where other windows stared in dull despair. From that casement one might see only walls and windows, except sometimes when one leaned far out and peered aloft at the small stars that passed. And because mere walls and windows must soon drive to madness a man who dreams and reads much, the dweller in that room used night after night to lean out and peer aloft to glimpse some fragment of things beyond the waking world and the greyness of tall cities. After years he began to call the slow-sailing stars by name, and to follow them in fancy when they glided regretfully out of sight; till at length his vision opened to many secret vistas whose existence no common eye suspects. And one night a mighty gulf was bridged, and the dream-haunted skies swelled down to the lonely watcher’s window to merge with the close air of his room and make him a part of their fabulous wonder.
There came to that room wild streams of violet midnight glittering with dust of gold; vortices of dust and fire, swirling out of the ultimate spaces and heavy with perfumes from beyond the worlds. Opiate oceans poured there, litten by suns that the eye may never behold and having in their whirlpools strange dolphins and sea-nymphs of unrememberable deeps. Noiseless infinity eddied around the dreamer and wafted him away without even touching the body that leaned stiffly from the lonely window; and for days not counted in men’s calendars the tides of far spheres bare him gently to join the dreams for which he longed; the dreams that men have lost. And in the course of many cycles they tenderly left him sleeping on a green sunrise shore; a green shore fragrant with lotus-blossoms and starred by red camalotes.
▍ Тест на русском языке
Для начала посмотрим, как Whisper справится с почти тремя минутами текста на русском. Получилось не идеально, однако результат впечатляет. Несмотря на то, что это самая маленькая модель, качество оказалось сопоставимым с результатами платных сервисов, предоставляющих перевод речи в текст, или с возможностями Telegram с Premium-подпиской.
С учётом того, что модель специально не дообучалась под русский язык, результат впечатляет ещё больше. Что касается скорости — почти три минуты текста были расшифрованы за чуть меньше минуты. При этом так как была нажата опция «Stream», можно было в реальном времени наблюдать, как аудиофайл преобразуется по частям в текст.
▍ Тест на английском языке
С поправкой на моё не ужасное, но и не идеальное произношение, получилось опять же достаточно неплохо. Что до скорости, то результат аналогичный с поправкой на то, что файл вышел чуть больше.
Реальное применение
Но где же всё это может быть полезным? Первый и самый очевидный сценарий — внутрикорпоративное использование. Представьте ситуацию: ваша компания, как многие другие, серьёзно относится к безопасности данных и категорически запрещает использование сторонних сервисов для расшифровки речи. При этом потребность в транскрибации постоянно возникает — будь то записи совещаний, обучающие материалы или интервью с клиентами. Развёртывание собственного сервиса на VPS позволяет как удовлетворить требования по информационной безопасности и конфиденциальности корпоративных данных, так и наконец-то избавиться от нужды перепечатывать руками очередной еженедельный созвон по планёрке.
Второй сценарий более предпринимательский — запуск собственного сервиса расшифровки речи как бизнеса. Да, на рынке есть множество готовых решений, использующих мощные графические процессоры, но у них есть существенный недостаток — цена. Начать с решения на базе центрального процессора может быть разумной стратегией для тестирования рынка и формирования базы клиентов. Тем более, как показало наше тестирование, даже базовая модель на CPU способна обеспечить вполне приемлемое качество распознавания достаточно сложной и комплексной речи. В дальнейшем, если прототип себя покажет хорошо, то можно будет уже задуматься о расширении кластеров, настройке балансировщиков, очередей и т. п., но для того, чтобы опробовать всё это перед полноценными инвестициями в облачную инфраструктуру, хватит и одного VPS.
Прототип сервиса по расшифровке текста на React.
Подводим итоги
В отличие от наших экспериментов с мультимодальными LLM в прошлой статье, где анализ одного изображения мог занимать до 10 минут (успеешь и чай попить, и в окно посмотреть, и о жизни подумать), FasterWhisper показал себя как вполне жизнеспособное решение для повседневного использования. Трёхкратное отношение времени обработки к длительности аудио на CPU — это уже не просто эксперимент, а нечто, что можно реально применять в работе. И если LLM на CPU оставляли впечатление «без слёз не взглянешь», то здесь виден реальный потенциал для коммерческого использования.
В следующей статье мы немного отойдём от темы нейросетей, хотя без машинного обучения всё равно не обойдётся. Поговорим о том, есть ли жизнь за пределами Google Docs и как можно организовать работу с документами на собственном VPS. Разберёмся, пригодны ли OpenSource решения для этой задачи или же self-host будет настолько мучителен, что с криком «Nevermore!», в эту степь вовсе более не вернём.
А пока что — всем спасибо за внимание, и до встречи в следующих статьях серии «VPS на пределе возможностей»!
© 2024 ООО «МТ ФИНАНС»
Telegram-канал со скидками, розыгрышами призов и новостями IT ?
schebotar
Какие системные требования? Сколько памяти сожрало?
VPS на пределе возможностей это понятно, но VPS разные бывают.
Были мысли реализовать self-hosted решение для транскрибрования голосовых сообщений в matrix ботом.
OrkBiotechnologist Автор
К сожалению точные данные замеров в процессе написания были утеряны, в отличие от первого поста где LLM тестировал. В следующем посте упомяну параллельно.
dimonier
Сколько памяти и CPU должно быть у vps, чтобы это решение взлетело? Без этого непонятно, насколько оно рентабельно и, соответственно, жизнеспособно.
OrkBiotechnologist Автор
Конфигурация VPS для всех экспериментов остаётся незименной в рамках этого цикла с первого поста -
dimonier
Спасибо!
Выглядит дороговато.
Для рядового пользователя есть варианты проще/дешевле:
- Через Yandex Cloud можно за 5 т.р. в месяц распознать 138 часов звука (по копейке за секунду) с довольно высокой скоростью, это 6 часов аудио каждый рабочий день.
- По цене трёх месяцев такого VPS можно купить б/у GTX 1080 Ti с 11 ГБ RAM и (при наличии остального десктопного компа) транскрибировать аудиозаписи со скоростью 10x (для модели Whisper medium).
OrkBiotechnologist Автор
Пожалуйста!
Вам спасибо за прочтение и что ссылкой на ваш проект по расшифровке на Гитхабе поделились!