Создание двуязычных субтитров к видео, распознавание и перевод речи
Введение
При изучении иностранных языков, иногда хочется иметь двуязычные субтитры к понравившемуся видео, озвученных носителями языка. Но, что делать, если готовых субтитров нет, а самому распознать и перевести живую речь героев не хватает знаний? Особенно это касается тех, кто только-только начинает осваивать новый язык. Но, как говориться, безвыходных ситуаций не бывает, как минимум, всегда существует три выхода, даже если вас съели.
В данном случае мы воспользуемся современными технологиями для решения нашей задачи. Вот наш алгоритм действий:
1. Скачиваем понравившийся видео ролик из Интернета, например, Ютуба.
2. Обрезаем его, если он слишком большой.
3. Вытаскиваем из него звуковую дорожку.
4. Если речь героев происходит на фоне большого шума либо музыки, то мы можем с помощью онлайн-сервисов отделить музыку от вокала либо речи.
5. Звуковой файл с речью (обычно, до 8–10 минут, иначе режем на куски) скармливаем нескольким сервисам по преобразованию mp3-файлов в текст. Используем несколько вариантов, потому, что любой сервис может содержать ошибки. Затем используем метод «перекрёстной лжи», как выразился один товарищ,
6. Группируем варианты распознанной речи по отдельным фразам, из которых убираем полные дубликаты (при желании).
7. Загружаем наш mp3-файл в звуковой редактор, например, Audacity и делаем там поиск звука между заданными интервалами, что позволяет нам создать предварительные метки для звуковых интервалов.
8. Слушаем отдельно каждый такой интервал и пытаемся сопоставить ему на слух вариант распознанной фразы. Для большей надежности, иностранные фразы в разных онлайн переводчиках и из всех возможных фраз выбираем наиболее подходящую. При этом сам язык знать не обязательно, достаточно внимательного прослушивания. При необходимости, редактируем звуковые интервалы и, в качестве их меток, указываем иностранные фразы.
9. Закончив редактирование меток, сохраняем их в текстовый файл, который, затем, загружаем в Эксел. Там у нас будут звуковые интервалы и оригинальные фразы. Если мы еще не сделали перевод (что логично для внешних либо внутренних субтитров), топереводим.
10. Файл Эксел с интервалами и текстом копируем в текстовый файл, с которым мы, в дальнейшем будем работать с помощью скриптов Питона. Запускаем, представленный ниже, скрип Питона по преобразованию текста в файл субтитров, формата ass / ssa. Имена файлов видео и субтитров должны совпадать.
11. Запускаем оригинальное видео, например, с помощью PopPlayer, чтобы видеть субтитры. В случае обнаруженных ошибок субтитры легко отредактировать.
12. Для публикации видео с субтитрами, внешние субтитры можно сделать внутренними, т.е., «прожечь» их. Это делаем с помощью стандартной команды ffmpeg (см. ниже).
Таким образом, мы создаем видео с двуязычными субтитрами, по которому можем учить язык сами и давать это делать другим. Кроме субтитров, по аналогичной схеме можно делать данные к обучающей программе «L'école, v. 1.00» (https://habr.com/ru/articles/848836/), что позволяет работать с каждой фразой индивидуально, но это уже тема другой статьи.
Замечу, что онлайн-сервисы заметно повысили качество своей работы, за последний год. ИИ («Искусственный Идиот»?) явно становится лучше, по крайней мере, местами.
Часть первая (результирующая)
В качестве подопытного кролика взят часовой французский мультфильм «Santiago des mers — 1 heure des aventures les plus intrépides de Santiago et Lorelai! — Nick Jr.» («Сантьяго морей — 1 час самых бесстрашных приключений Сантьяго и Лорелай! — Ник младший») : https://www.youtube.com/watch? v=vTac3i0qO9s .
Поскольку, видео слишком длинное, мы вырезали из него только первый эпизод, длительностью 4 минуты 28 секунд.
С помощью предложенного алгоритма мы получаем файл субтитров, который «прожигаем» в оригинальном видео. В результате получился короткий ролик со встроенными французско-русскими двуязычными субтитрами, который опубликованы на моих каналах в :
https://my.mail.ru/mail/emmerald/video/_myvideo
и
https://dzen.ru/id/66ef0791df72c165d37a34ea
Но, на мой взгляд, лучше работать с внешними субтитрами, которые представляют собой текстовый файл. Тогда в нем легко редактировать обнаруженные ошибки от которых никто не застрахован. Поэтому, есть возможность скачать как оригинальный эпизод «Santiago des mers — Episode 1.mp4» в :
https://disk.yandex.ru/d/MUJWsq3g4LXpng
так и субтитры «Santiago des mers — Episode 1.ssa» к нему :
https://disk.yandex.ru/d/HaIh_zAQ8O6cqA .
Часть вторая (техническая)
Теперь мы пройдемся по всем пунктам алгоритма, чтобы получить нужный результат.
1. Данный ролик, на Ютубе, стал приватным. Чтобы посмотреть его, надо войти в аккаунт. Я это сделать сейчас не могу, поскольку живу в новом регионе России, для которых Ютуб как заблокировал доступ к моему каналу (https://www.youtube.com/@scholium9807), так и возможность создать новую учетную запись. Поэтому, я воспользуюсь ранее скачанным файлом, когда он еще был в открытом доступе. Думаю, что загрузить подходящий файл с Ютуба, не должно вызвать проблем, поскольку в Интернете достаточно соответствующих сервисов.
2. Как уже сказано, мы вырезали только первый эпизод с помощью ffmpeg (см. в Интернете) команды:
ffmpeg.exe -y -ss 00:00:00.00 -t 04:28.00 -i Video.mp4 -c: v copy Video_.mp4
3. Вытаскиваем оттуда звуковую дорожку с помощью аналогичной команды:
ffmpeg -y -ss 00:00:00.00 -i Video_.mp4 -f mp3 Audio_.mp3
4. В файле Audio_.mp3 есть немного музыки и много шума. Поэтому, можно попытаться извлечь вокал, например, с помощью сервисов:
https://vocalremover.org/ru/ (бесплатно 10 минут, с одного ай-пи)
https://multimedia.easeus.com/ru/vocal-remover/ (бесплатно 20 минут, с одного ай-пи)
и др.,
Мы используем первую ссылку, хотя, можно сразу скормить исходный mp3-файл любому сервису, по распознаванию речи. Однако, делать разметку звуковых интервалов лучше для «чистого» звука. Тем не менее, мы рассмотрим оба случая, просто, чтобы оценить качество распознавания речи для различных случаев.
Начнем с последнего варианта, затем рассмотрим работу с вокалом.
5. Лучший сервис, на мой взгляд, по распознаванию речи это:
https://any2text.ru/ (бесплатно 10 минут, с одного ай-пи)
Но, в данном случае, мы имеем не слишком ровную и чистую речь, кроме того, иногда этот сервис тоже слегка подглючивает, вплоть до зажевывания небольшой части текста. Поэтому мы проконтролируем распознавание, также в других сайтах:
https://www.audio2edit.com/ru/speech-to-text
https://converter.app/audio-to-text/
https://transcri.io/fr/transcription-audio-en-texte
https://www.zamzar.com/tools/mp3-to-text
Имеется и множество других, на ваш выбор
Задействуем, все эти сервисы и получим текстовые файлы с искомой французской речью. Им, кстати, лучше сразу давать нормальные имена, например, связанные с именем соответствующего сервиса, чтобы потом не путаться.
Чтобы сопоставить текст из всех полученных вариантов, нужно, чтобы файлы, хотя бы, содержали примерно одинаковое количество строк. В данном случае, мы имеем:
— 9 строк, не считая пустых для any2text_ru.txt
— 75 строк, для audio2edit_com.txt
— 92 строки, для converter_app.txt
— 1 строку, для transcri_io.txt
— 106 строк, для zamzar_com.txt
Основная разница — в количестве символов перевода строки, не считая ошибочного распознавания. И как мы будем сравнивать эту кучу?
По логике вещей, нам надо добавить разделители строк, например, после точек, восклицательного и вопросительного знака и, может быть, запятых. Заодно, можно вручную убрать пустые строки, поскольку их немного.
Чтобы добавить разделитель строки после восклицательного знака с пробелом, воспользуемся, например, редактором Notepad++. Начнем с первого файла (рис. 1).
Рис. 1. Добавление символов перевода строки между предложениями.
В результате получим текст, как на рис. 2. Затем тоже самое проделаем с вопросительным знаком и точкой. Получаем в итоге 61 строку. Что-ж, поставим разделитель строк и после запятых (рис. 3).
Рис. 2. Добавление символов перевода строки после восклицательных знаков.
Рис. 3. Добавление символов перевода строки после вопросительных знаков, точек и запятых.
Мы видим, что предложения часто получаются слишком короткими, поэтому, лучше после запятых ставить пробелы вручную, для слишком длинных предложений. Поэтому, сделаем отмену последней операции и добавить разделитель строк после запятых только для длинных строк. Получаем 69 линий текста.
Аналогичную работу проделаем для файла transcri_io.txt, с его одной строкой. В результате получаем там условные 75 линий текста, в зависимости, от того, что считать длинными строками.
Таким образом, мы имеем:
— 69 строк, для any2text_ru.txt
— 75 строк, для audio2edit_com.txt
— 75 строк, для transcri_io.txt
— 92 строки, для converter_app.txt
— 106 строк, для zamzar_com.txt
Здесь я немного переставил порядок файлов, чтобы сблизить результаты.
6. Сейчас нам надо сопоставить между собой полученные фразы. Думаю, что проще это сделать в Экселе, в котором мы будем делать попарное соответствие.
Сначала просто загрузим строки из текстовых файлов в соответствующие столбцы файла Эксел (рис. 4).
Рис. 4. Сопоставление распознанных текстов из различных сервисов
Как видим, в первом приближении, соответствие так себе. Поэтому, нам ничего не остается делать, как «причесывать» полученные фразы вручную. Будет делать это попарно. Начнем с сопоставления первого и второго столбца.
Первые строки это названия файлов. Вторые строки там совпадают. С третьей по восьмую строки хотя и не совпадают, полностью, но созвучны. Для понимания этого не надо знать ни язык, ни перевод. Тем более что отдельные слова могут быть одинаковыми (их можно рассматривать как ключи). Десятая строчка второго столбца равна одиннадцатой строке первого, а их вышележащие строки созвучны. Поэтому сдвигаем второй столбец с девятой строки и до конца столбца на одну строку вниз. 16-я и 17-я строки первого столбца похожи на 16-ю строку второго, поэтому опять сдвигаем второй столбец с 17-й строки на одну позицию вниз. А 16-ю строку второго столбца можно разделить на две части (в районе запятой) и вторую часть перенести в 17 строку.
Короче говоря, хотя и муторно, но нужно проделать эту работу для всех строк, во всех смежных столбцах, если мы желаем качественного распознания произносимых фраз.
В данном случае, я проделаю эту работу сам и покажу уже готовый результат (рис. 5–6).
Рис. 5. Выравнивание, по ключевым словам, распознанных текстов, начало файла Эксел.
Рис. 6. Выравнивание, по ключевым словам, распознанных текстов, конец файла Эксел.
В итоге, тексты мы выровняли, но можно заметить достаточно много глюков в каждом из них. А желтым цветом обозначен вообще явный мусор. Однако, именно поэтому мы и используем несколько сервисов для распознавания речи, поскольку ни один из них не может дать стопроцентную гарантию, в общем случае. А так, применение нескольких вариантов должно уменьшить общее количество ошибок.
Тем не менее, самая главная работа еще впереди — сопоставление звуковых интервалов — письменным фразам. Но, сначала, нам надо их сгруппировать и убрать дублирующие и пустые строки (которые возникают из-за отсутствия соответствия).
Для группировки подобных фраз мы воспользуемся следующим трюком. Скопируем все столбцы с текстом и звездочками (для фиксации границ между фразами) в обычный текстовый файл (рис. 7).
Рис. 7. Копирование, через буфер обмена, содержимого файла Эксел, в тестовый файл.
ока что это бесструктурная куча, для упорядочения которой заменим символы табуляции на символы перевода строк. В результате получаем более «причесанный» текст (рис. 8).
Рис. 8. Структурирование текстового файла для исходных звуковых данных.
Этот результат нас вполне устраивает. Осталось только убрать оттуда дубликаты, хотя это не обязательно, одинаковые строки указывают на их большую вероятность.
Работа с вокалом
Мы проделали распознавание речи для необработанного файла, содержащего шум и музыку вместе с речью. Настала очередь получить аналогичные результаты для «чистого» звука, т.е., без слишком больших помех.
Повторим пункты 5–6 для очищенного mp3-файла. Окончательный результат представлен на рис. 9.
Рис. 9. Структурирование текстового файла для очищенных звуковых данных
Разница, хотя, и не принципиальная, но имеется. При большом желании эти файлы можно объединить. Мы сделаем это хотя бы один раз, чтобы лучше сравнить возможности сервисов распознавания речи, в зависимости от наличия / очистки шума. Сравнивать будет по сервисам, парами — оригинал / обработанный файлы (рис. 10).
Рис. 10. Объединенный текстовый файл для всех вариантов
Если бегло проанализировать все варианты, то видно, что ошибки распознавания есть везде. В данном случае это скорее связано с самой озвучкой мультфильма, поскольку мы выбрали не самый простой вариант. Если же мы имеем в наличии студийный цифровой звук, то распознавание идет значительно лучше, тогда и количество вариантов можно уменьшить. Альтернативой может служить использование внутренних либо внешних субтитров, но эту тему оставим для следующей статьи. Пока же мы будем использовать полный вариант.
Заметим, что до сих пор мы еще совершенно не вникали в перевод полученных фраз. Мы смотрим только на наличие / отсутствие ключевых слов в сравниваемых фразах.
7. Теперь мы должны загрузить исходный mp3-файл в звуковой редактор, сделать там предварительную разметку для отдельных звуковых фраз и затем начать выбирать, на слух, наиболее подходящую фразу из нашего списка, для каждой из них, с учетом ее перевода (ибо оригинальные фразы, с глупыми переводами, нам явно не подойдут).
При этом, мы оставляем в своем текстовом файле, подходящий вариант оригинала и его перевод (через табулятор), а в звуковом редакторе в качестве имени метки записываем иностранный текст. Это нам пригодится для дальнейшей работы.
Теперь по порядку.
В качестве звукового редактора выбираем, как уже упоминалось, бесплатную программу Audacity и загружаем туда оба наши звуковые файлы, оригинальный (рис. 11) и очищенный от шума и музыки (рис. 12).
Рис. 11. Загрузка оригинального mp3-файла в программу Audacity.
Рис. 12. Загрузка очищенного mp3-файла в программу Audacity и выбор режима усиления звука.
Хорошо видно, что разметку неочищенного звука будет тяжело делать из-за сплошного аудио потока. Поэтому для этих целей лучше выбрать второй вариант, с «чистым» звуком. Но сначала усилим аудио, ради удобства использования, например, с коэффициентом 5 (пункт меню «Эффекты / Усиление»). И, «не отходя от кассы», сразу запускаем режим поиска звуковых интервалов (пункт меню «Анализ / Поиск звука») Результат видим на рис. 13–14.
Рис. 13. Усиление «чистого» звука и поиск звуковых интервалов.
Рис. 14. Увеличенный фрагмент найденных звуковых интервалов, с заданными параметрами.
Как видим, показаны даже лишние интервалы, для очень слабого звука. Чтобы их было меньше, можно изменить параметры звука в диалоге поиска звука (рис. 13). Но, в данном случае это не принципиально, поскольку будем удалять лишние метки вручную. Тем более что нам придется редактировать, практически, каждую метку.
Чтобы увеличить изображение звука, используем команду «Ctrl+1», а для уменьшения «Ctrl+3», либо через пункты меню.
8. Этот пункт нашего алгоритма, пожалуй, самый трудный. Нужно будет прослушать и, при необходимости, отредактировать координаты и метку каждого звукового интервала. Кроме того, нужно выбрать из распознанных фраз наиболее подходящую вместе с ее переводом.
Для сопоставления текста и звука мы расположим рядом два окна. В первом мы будем редактировать звуковые интервалы и их метки, а во втором оригинальный текст и перевод (рис. 15).
Рис. 15. Совместное использование двух окон — со звуковым файлом и редактируемым текстом.
В звуковом редакторе мы немного увеличили изображение и выбрали первый, автоматически определенный интервал. Его прослушивание явно указывает на нашу первую фразу в текстовом редакторе. Только слева наблюдается некоторый посторонний звук, который мы уберем сдвигом первого интервала вправо.
Второй интервал явно лишний, зато третий содержит несколько фраз. Поэтому, отредактируем эти интервалы, сначала, координаты и их номера. Надеюсь, что команды редактирования аудио-редактора вы освоите самостоятельно. А мы пока установим соответствие первых нескольких звуковых интервалов номерам распознанных фраз. Для этого в текстовом редакторе мы начнем их отсчет (рис. 16).
Рис. 16. Установка соответствий номеров фраз номерам меток.
Вторую и третью звуковые фразы трудно разделить без артефактов. Поэтому мы их объединим, в т.ч., в тексте. Остальные пять фраз вполне соответствуют нашим распознанным группам.
Теперь из десяти фраз каждой группы мы должны выбрать по одному значению, для которого, через табулятор сразу укажем перевод, в текстовом редакторе. А лишние фразы — удалим. При этом, если мы заменим цифры в метках аудио-редактора на оригинальную фразу, то можем удалить и использованные номера в текстовом редакторе.
Но какую фразу, из каждой группы, нам выбрать?
Думаю, что фразы можно сначала выбирать на слух, а затем проверять их на смысловой контекст с помощью онлайн-переводчиков. Обычно, хватает пары:
https://translate.google.com/? sl=auto&tl=ru&op=translate
https://www.deepl.com/ru/translator
Даже не зная языка, можно, более-менее, успешно делать правильный выбор. В результате, наши редакторы звука и текста будут выглядеть, примерно, как на рис. 17. Кстати, чтобы метки полностью находились на одной линии, достаточно увеличить изображение звука.
Рис. 17. Установка полного соответствия между звуковыми интервалами, их текстовыми значениями и переводами.
Естественно, профессиональный переводчик найдет здесь много ошибок. А мы, ведь, «не волшебники, только учимся!». Тем менее, уверен, что лучше так, чем никак.
Теперь, нам остается проделать всю эту работу для остальных интервалов и фраз.
В каждой работе надо искать приятные стороны. В данном случае, несмотря на довольно скучную процедуру установления соответствия звуковых интервалов — тексту (оригинальному и переводам), попутно мы проникаемся ощущением погружения в новую языковую среду, причем, многие фразы, которые особо «цепляют», почти сразу запоминаются.
9. Как бы там ни было, но искомый результат соответствия мы получили в виде нескольких файлов:
— Файл проекта программы «Audacity».
— Файл текстовых меток, которые мы получаем путем сохранения выделения, посредством пунктов меню «Файл / Ещё экспорт… / Меток…». Кстати, в файле меток будут указаны интервалы используемых звуковых фраз.
— Наш текстовый файл с оригинальными фразами и их подходящим переводом.
Поскольку, во всех текстовых файлах используется, в качестве горизонтального разделителя, табулятор, то эти данные легко загружаются в Эксел, через буфер обмена в разные столбцы. После проверки по ключу (оригинальным фразам) данных из разных файлов, мы получаем итоговый результат (рис. 18), который вы можете скачать из https://disk.yandex.ru/i/q3UBUwdWfSoQPg (файл Main.xls).
Рис. 18. Итоговый результат обработки данных в формате Эксел.
В данном файле, значения интервалов в секундах (столбцы A и B) преобразуются в номера кадров, с учетом количества кадров в секунду (в нашем случае — 25, что можно узнать в видеоплейере) , по формулам:
Столбец E1: =ОКРУГЛ (A1×25; 0)
Столбец F1: =ОКРУГЛ (B1×25; 0)
и далее по аналогии. А столбцы G и H расширяют предыдущий интервал, в кадрах, до промежуточных значений между ними. Но, вы можете использовать другие формулы.
10. Столбцы I и J дублируют аналогичные C и D, для удобства копирования столбцов G — J в текстовый файл (пусть это будет Main.txt — рис. 19), который послужит источником данных для скрипта Питона, чтобы получить искомый файл субтитров.
Рис. 19. Исходный файл Main, txt для скрипта Питона
Файл Main, txt служим источником данных для нашего скрипата CreateTitres.py, который создает необходимый нам файл субтитров — Main.ssa (рис. 20).
Рис. 20. Результирующий файл Main.ssa для скрипта Питона
Сам скрипт и файлы данных можно скачать по ссылке: https://disk.yandex.ru/d/ADMwiFMC89PacA
11. Теперь мы имеем оригинальный файл первого эпизода под именем Video_.mp4 и только что полученный файл субтитров Main.ssa. Осталось дать им общее имя, например «Santiago des mers — Episode 1_.mp4» и «Santiago des mers — Episode 1_. ssa» и расположить их в одном каталоге (знак подчеркивания означает, что субтитры внешние). После чего запускаем подходящий видеоплейер, скажем, PotPlayer и радуемся полученному результату, описанному в первой части этой статьи.
12. Но, если мы желаем иметь единственное видео, со встроенными субтитрами, то тогда нам надо «прожечь» полученный файл Main.ssa в оригинальном ролике Video_.mp4. Это мы делаем с помощью знакомого уже нам ffmpeg:
ffmpeg -y -i Video_.mp4 -vf ass=Main.ssa «Santiago des mers — Episode 1.mp4»
также представленного выше.
Выводы
Здесь мы рассмотрели достаточно сложный случай, без субтитров (распознавание с помощью Ютуба, это не более, чем один из вариантов, причем, не самый лучший), с шумом и музыкой, быстрой, живой речью. Ну, а вообще-то, можно выбирать варианты попроще.
Несмотря на громоздкость предлагаемого алгоритма, творческий момент и глубокая вовлеченность в процесс, помогают лучше усваивать живую речь носителей языка, которая заметно отличается от произношения русскоговорящих, да и франкоговорящих тоже, преподавателей французского языка.
Особенно важна точность в интервалах звуковых фраз и усиление их звука для интерактивной работы с ними, как в программе «L'école, v. 1.00».
Если иметь дело со встроенными субтитрами, например: «Easy French 1 — à Paris!» (https://www.youtube.com/watch? v=bb4zvZdrMz4) то, мы можем, используя подобную технологию, получать субтитры на родном языке (ср. файл AParis.mp4 в https://disk.yandex.ru/i/yfSjG5M5rEIP2w).
Ну, а если субтитры внешние, без русского языка (примеры есть на моих каналах), то добавить туда русский перевод не составит особого труда, что, с учетом творческой составляющей, делает процесс изучения иностранного языка более продуктивным, чем простое зазубривание.