Распознавание речи, генерация субтитров и изучение языков при помощи Whisper |
||||||||||||||||||||||||||||||||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2022-10-14 01:28 алгоритмы распознавания речи, распознавание образов, алгоритмы машинного обучения
Распознавание речи в действии
Есть ряд платных решений по переводу речи в текст (Automatic Speech Recognition). Сравнительно малыми усилиями можно сделать бесплатное решение, — дообучить на своих данных end2end модель (например, взять фреймворк NeMo от NVIDIA) или гибридную модель типа kaldi. Сверху понадобится добавить расстановку пунктуации и денормализацию для улучшения читаемости ("где мои семнадцать лет" -> "Где мои 17 лет?"). Недавно в открытый доступ была выложена мультиязычная модель whisper от OpenAI. Попробовал ее large вариант на нескольких языках и расшифровал 30 выпусков "Своей игры" результат понравился, но есть нюансы. Модель транскрибирует тексты вместе с пунктуацией и капитализацией, расставляет временные метки, умеет генерировать субтитры и определять язык. Языков в обучающем датасете порядка ста. Чтобы прикинуть по качеству, нужно посмотреть на их распределение — данных на 100 часов и более было лишь для 30 языков, более 1000 ч. — для 16, ~10 000 часов — у 5 языков, включая русский. Модель заслуживает внимания так как умеет делать очень много "из коробки". Давайте разберемся подробнее и научимся ей пользоваться. Про модель Пара слов про whisper. В тесном мире ASR данных хватает, но не всегда хватает разметки. По этой причине появились unsupervised подходы по обучению на данных без транскрипций с последующим дообучением на небольшом размеченном датасете. В этом случае объем первичных данных можно увеличить до миллиона часов (см. wav2vec 2.0). Энкодер при этом выучивает очень качественные представления для звуков (точнее для их численного представления), но для преобразования их в человеческий вид все равно потребуется целевой размеченный людьми датасет. Объемы таких датасетов могут быть от ста до нескольких тысяч часов, то есть на много порядков меньше всех аудио, которые можно найти в интернете. Для русского языка также есть открытые датасеты, нарпример OpenSTT и SOVA. Авторы whisper идут по пути компромисса, используя weakly supervised подход. Взяли все доступные аудио с транскрипцями из интернета и пофильтровали их, но не сильно. Получили некий зашумленный датасет, в котором в том числе есть и транскрипции сделанные другими ASR системами, много тишины и шумов, смех, апплодисменты и т.д. Объем получился 680 000 часов на 97 языках, из которых 117 000 часов не на английском. Обучение на таком большом зашумленном датасете, по мнению авторов, дает значительное улучшение обобщающей способности модели и её устойчивости к посторонним звукам. Еще одной особенностью модели является её многозадачность. Задачи распознавания речи, перевода (с языка X на английский), определения языка и детекции голоса (VAD) при обучении были приведены к единому виду (в виде последовательности токенов, включая специальные — <|nospeech|>, <|transcribe|>, <|translate|> и другие) в seq2seq манере. Это позволяет упаковать несколько специализированных моделей в одну и обучать все задачи совместно. Архитектура whisper. Robust Speech Recognition via Large-Scale Weak Supervision.Модельный ряд Моделей натренировали несколько, — с увеличением количества параметров качество растет, но не драматически. Base и small моделями можно пользоваться на домашнем компьютере на CPU, medium и large тоже запустятся, но будут работать довольно медленно. Все эксперименты я проводил на large модели с использованием 3090 ti.
Архитектура В качестве архитектуры взяли трансформер. Основной гипотезой авторов было обучение на большом шумном датасете, поэтому они не стали вносить значительных изменений в модель, чтобы не получить "побочных улучшений". Подробнее про процесс обучения можно почитать в статье, а мы пойдем дальше. Для начала установим библиотеку. Установка Чтобы запустить whisper у себя на компьютере, поставим библиотеку:
Это консольный клиент, модели подгрузятся при первом запуске. Также нужно, чтобы в системе был установлен ffmpeg для работы с медиа данными. Для windows ffmpeg.exe нужно скачать отсюда, положить в любую папку и добавить её в PATH. Под linux библиотеку можно установить через консоль, например так:
Ещё установим библиотеку yt-dlp для работы с youTube, она нам скоро пригодится.
Если что-то не получилось, не стесняйтесь писать, мы все здесь чему-то учимся. Транскрибация Попробуем расшифровать несколько типичных видео разных жанров и с разным набором лексики. Cпециализированные домены (звонки в коллл-центр и т.д.) мы сейчас рассматривать не будем, так как без дообучения под такой домен результат будет заведомо плохой (я пробовал). И напротив, обычная речь с микрофона на общие темы распознается на отлично. Репортаж Сначала попробуем транскрибировать ролик с несколькими спикерами, без специальной лексики и названий. Возьмем репортаж про Питерский трамвай. Трамвай в Питере летом. Сгенерировано Stable Diffusion.Скачаем файл командой:
VPPknXEXk1k — это id ролика на youTube (файл). Теперь переведем его в текст:
В папке result появится файлик piter.mp3.txt. Вот его начало:
Как видим, водитель трамвая говорит простым языком, хотя и довольно сбивчиво. Модель все слова распознала корректно и расставила пунктуацию. Числа также были приведены к цифровому формату корректно. Выступление Возьмем выступление о кибербезопасности со специализированными IT-терминами и большим количеством говорящих, которые периодически друг друга перебивают. IT-конференция. Сгенерированно Stable Diffusion.
Здесь тоже все хорошо, сеть знает о существовании некоего SOC'а, о существовании IT-шников, разговорных вариантов имен ("Юр") и даже многоточие поставила к месту. А теперь проблемы Чтобы вскрыть первую проблему возьмем случай посложнее — песни. Образный лексикон и постоянная музыка на фоне. Модель для этих целей не предназначена, но дадим ей шанс и ознакомимся с потенциальными проблемами. Транскрибируем "Очи черные" Высоцкого (файл). Высоцкий с гитарой. Сгенерировано Stable Diffusion.
Получим вот такое:
Проблема 1. Зацикливание Как авторы пишут в статье (раздел Limitations and future work) с размером модели растет её устойчивость, но при транскрибации продолжительного аудио авторегрессионная природа модели может давать эффекты зацикливания, пропуска крайних слов сегмента и галлюцинаций (выдавать слова, которых нет на записи). Чаще всего это будет наблюдаться для малоресурсных языков и малознакомых доменов. Можно попробовать побороться с этим, поигравшись с параметрами сэмплинга --temperature и ---logprob_threshold. Можно отключить авторегрессионность параметром --condition_on_previous_text, что ожидаемо ухудшит осмысленность текста, хоть и уберет зацикленность в нашем случае:
Есть еще один хак, — можно подать в модель затравку (привет prompt-инженерам) через параметр --initial_prompt:
Затравка не считается транскрипцией, поэтому в результат не попадет. К ней мы еще вернемся чуть позже. Генерируем субтитры Собрал страничку из субтитров СИ.Модель по умолчанию расставляет временные метки для фрагментов, поэтому еще раз заглянем в папку result, — и увидим там srt файл. Все это время уже генерировали субтитры. Вот расшифровка репортажа про трамвай:
Своя игра Ради интереса я транскрибировал большой моделью несколько последних выпусков телепередачи Своя игра и собрал из них страничку. Результат в целом мне понравился:
Как мы видим, из обучающей выборки не убирали транскрипции звуков ("апплодисменты", "смех", "музыкальная заставка" и т.д.). Это не хорошо и не плохо, так как бывают различные требования к результату. Лекции на английском Так же я попробовал расшифровать лекции по машинному обучению от Андрея Карпати. Страничка и репозиторий.
Английские технические термины разспознаются достаточно хорошо. EMB здесь посчиталось за аббревиатуру, на самом деле произносилось название переменной. Проблема 2. Отключение расстановки пунктуации У модели есть еще один failure mode. Насколько я понял из кода, модель может перестать обуславливаться на предыдущий фрагмент, если сэмплинг был с высокой температурой (а она при ошибках начинает повышаться, так как заданы несколько дискретных значений). На эту тему есть дискуссия. Такое может чаще случаться в самом начале, а также рандомно на длинных аудио (больше часа). За время моих экспериментов я с таким не встретился. Авторы говорят, что пока что так, но вы если сломалось с самого начала, то попробуйте использовать --initial_prompt. Изучение языков Т-800, он же Арнольд ШварценеггерКак человек, имеющий легкий "сдвиг" на изучении языков и смежные темы, я бы выделил и еще одно применение этой модели. По сгенерированным субтитрам можно нарезать роликов или аудио с фразами на нужную тему и использовать для улучшения языковых навыков. Это подойдет как минимум для языков из первой десятки, так как качество распознавания на них достойное. Разумеется можно взять и готовые субтитры к какому-нибудь фильму или сериалу. В общем, я покажу как это можно сделать, а вы уж решайте дальше. Подготовим видео (фильм, сериал или видео с youTube). В случае youTube воспользуемся уже знакомой утилитой и выкачаем видео какой-нибудь лекции:
Сгенерируем субтитры whisper'ом, или возьмем готовые. srt файл с субтитрами назовем subs.srt. Скрипты для следующий действий я выложил в репозиторий, качаем его. Сначала приведем субтитры к более удобному виду.
Этот csv файл сдоержит начало и конец фрагмента, а также его содержание.
Оставим в нем только нужные строки, например, первую и третью:
Теперь нарежем по этим параметрам видео фрагменты:
Запустится ffmpeg и в папке output начнут появляться наши видео. При желании можно предварительно "прожечь" субтитры прямо в исходное видео, тогда после нарезки у нас будут ролики с фразами в кадре:
Дополнительно К вышесказанному можно добавить еще несколько направлений, которые можно попробовать. Диаризация — разделение спикеров. Понадобится при необходимости вычленить из аудиопотока определенного человека или добавить имя говорящего к субтитрам. Whisper не был на это натренирован, но вот здесь этот вопрос обсуждают и делятся наработками (colab). Дообучение. Точно повысит качество под вашу конкретную задачу, так как whisper — модель общего назначения. Опять же, официально пока скриптов нет, но обсуждается здесь и есть colab. Ссылки Градиент обреченный — завел канал про машинное обучение и рабочие моменты. Приглашаю всех, кому интересна эта тема. Транскрипции Своей игры — можно посмотреть на качество распознавания whisper и повторить на своих видео. Whisper — репозиторий с моделью и инструкциями, там же ссылка на статью. NeMo — фреймворк для обучения своих SOTA моделей. Выбирайте модель(например, Conformer-CTC) и дообучайте на своих данных. Video Splitter — подготовил репозиторий для нарезки видео по субтитрам. Multipunct — репозиторий для тренировки пунктуационной модели. Как пользоваться писал тут. Источник: habr.com Комментарии: |
|||||||||||||||||||||||||||||||