Найти в Дзене
Кириши HackerSpace

Переводим видео/аудио на телефоне БЕЗ ИНТЕРНЕТА

Пре пре пре 👋 ребзя...
Эта инфа будет полезна тем, кто не владеет навыками перевода на слух, но имеет потребность в переводе различных видео роликов или трэков, а так же находится в условиях ограниченного доступа к сервисам онлайн переводчиков. (whitе list)
Недавно я наткнулся на отличный архив видео докладов с конференции 38c3, где выступали отличные спикеры с отличными докладами по
Оглавление

Пре пре пре! 👋 ребзя...

Эта инфа будет полезна тем, кто не владеет навыками перевода на слух, но имеет потребность в переводе различных видео роликов или аудио-трэков, а так же находится в условиях ограниченного доступа к сервисам онлайн переводчиков.

Недавно я наткнулся на отличный архив видео докладов с конференции 38c3, где выступали различные спикеры с интересными докладами по программированию, радиосвязи, информацинной безопасности, спутниковой связи, рассказами о проблемами развития HackSpace'ов в других локациях и т.д.

При просмотре этих видосиков, для меня проблемой стал языковой барьер.

Если в случае с Английским языком, я ещё "Болие-Лимения" врубался о чём речь,

Thx /////AMG
Thx /////AMG

то в случае когда выходил новый спикер и начинал вещать на Немецком, я впадал в ступор.

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

Поэтому сегодня с вами организуем свой локальный перевод на своих скромных вычислительных мощностях (в моём случае это SnapDragon 8s gen 4, 16Gb RAM)

Помимо этого нам потребуется предварительно скачать Termux установить ffmpeg, Python и собрать llama.cpp, а так же whisper.cpp

  • - Whisper для генерации .srt субтитров
  • - Riva translate для перевода этих самых субтитров

Скачали , собрали , поехали...

0) Выбираем нужное нам видео

Допустим это файл: NASHE_VIDEO.mp4

1) Преобразуем видео в .wav

Для этого используем ffmpeg и сделаем это одной командой:

ffmpeg -i NASHE_VIDEO.mp4 -ac 2 -ab 160k -ar 48000 -async 48000 -f wav -acodec pcm_s16le NASHE_VIDEO".wav"

2) Отправляем полученый .wav на генерацию .srt субтитров

Переходим в директорию собранного whisper'a и командуем

./whisper-cli -m ../../models/ggml-medium.bin ~/NASHE_VIDEO.wav -osrt

Ждём ...

на моей железяке генерация субтитров с 58 минутного видео заняла ~1 час

В конечном итоге файл субтитров будет иметь такой формат:

  • - Первая строка - идентификатор секции
  • - Вторая строка - таймкод
  • - Третья - сам текст
  • - Четвёртая - перенос строки, разделитель
.srt format
.srt format

3) Применяем модель переводчика

В качестве модели переводчика я выбрал модель Riva Translate от Nvidia которую предварительно сконвертировал в формат gguf для запуска в llama.cpp

-4

По сравнению с предыдущей моделью madlad400 которую я использовал ранее, Riva имеет меньший набор языков (12 штук), но при этом наименьший вес, более высокую скорость инференса с меньшим потреблением ресурсов.

Так же у Riva есть незначительное отличие от Madlad в формате входных данных, если у Madlad управление направлением перевода осуществляется конструкцией:

<2en>TEXT или <2ru>TEXT

То у Riva префикс запроса такой:

-5

Сама команда вызова нейронки в случае перевода с Английского на Русский короткой фразы "Hello world, my name is Vladimir. I'm from Kirishi" будет выглядеть вот так:

./llama-cli -no-cnv --jinja -m ~/storage/downloads/riva-translate-4b-instruct-q4_k_m.gguf -p "<s>System You are an expert at translating text from English to Russian.</s> <s>User What is the Russian translation of the sentence: Hello world, my name is Vladimir. I'm from Kirishi.</s> <s>Assistant" --no-display-prompt 2>/dev/null

главное ключами "-no-cnv" игнорировать переход в интерактивный режим и подавить любой вывод кроме конечного ответа перенаправлением потока ошибок в /dev/null

Так как видео может быть очень длинным и разговоров там может быть немеренное количество, а на вход нашей модели можно подать длинну контекста максимум 4092 токена, то если мы попытаемся сразу целиком отправить файл субтитров на перевод, получим ошибку ограничения длинны контекста

Слишком длинный промпт
Слишком длинный промпт

Поэтому попробуем программно выдирать из файла субтитров каждую третью строчку и отдельно порциями подавать на вход нейронке. Для этого я написал вот такой мини костыль на Python

translate.py
translate.py

После всех этих манипуляций имеем обновлённый файл субтитров .srt с переводом на нужный нам язык, который можно подключить вместе с видео в VLC плеере.

До...
До...

После...
После...

Итого: при переводе файла субтитров состоящего из 1540 секций, мне потребовалось 2.5 часа времени и ~80% заряда аккумулятора 🪫

-10

P/S можно использовать и третью TTS "текст ту спич" нейронку для синтеза речи и генерации аудиодорожки, которую потом так же можно прилепить к видео. Но я пока ненашёл адекватных нейросетей которые могли бы это сделать на моих минимальных вычислительных мощностях.

Примерно такой же пайплайн нужен и для детектирования голоса на стримах и его автоматического перевода