Очень уж мне нравится смотреть сериалы, а еще я учу с их помощью языки. И если раньше я прилежно останавливал видео на непонятном месте, перематывал назад, включал субтитры и забивал незнакомые слова в Анки, то сейчас я делаю то же самое. Разве что лень заставила этот процесс автоматизировать, что привело к созданию расширения Say It Again для проигрывателя VLC со следующими особенностями:
- Навигация по субтитрам (переход к предыдущей, следующей фразе) — клавиши y, u;
- Сохранение слова, его транскрипции и перевода вместе с контекстом (см. скриншот) — клавиша i;
- Функция «Еще раз»: переход к предыдущей фразе, показ субтитра и пауза — клавиша backspace;
- Подключение любых словарей в формате Stardict (в сети лежат словари из Lingvo x3);
- Экспорт в Anki или другую программу, понимающую файлы в формате csv;
Но зачем?
В какой-то момент я понял, что просмотр сериалов с включенными субтитрами перестал давать ощутимые плоды (кроме повышения скорочтения). Но, выключая субтитры, я сталкивался со шквалом непонятных слов. Приходилось отматывать видео назад (конечно же либо недостаточно, либо слишком далеко от нужного места), включать субтитры, останавливать проигрывание, искать в словаре незнакомые слова, выписывать их в отдельный файлик, потом забивать в Анки (порой с контекстом, т.е. с фразой из фильма!) — в общем, геморрой. Отсюда и родилась идея расширения, которым я пользуюсь сегодня, и которым хочу поделиться с общественностью. Оно позволяет автоматизировать процесс сохранения слов с контекстом в текстовый файл такого вида:
desecrate [ˈdesɪkreɪt] оскорблять, осквернять, позорить You've desecrated my owls. Weeds S07E12
Как этим пользоваться?
На самом деле не самый user-friendly процесс, но тут уж ничего не поделаешь. Скрипт проверялся на VLC 2.0.5 под Windows.
- Скачиваем последнюю версию скрипта say_it_again.lua с Гитхаба (прямая ссылка)
- Копируем его, в зависимости от платформы, в %ProgramFiles%VideoLANVLCluaextensions или /usr/share/vlc/lua/extensions.
- Ищем и качаем словарь в формате Stardict (копирайт? не, не слышал). Лично мне нравятся англо-английские словари Oxford American Dictionary.
- Распаковываем его. В результате должны получиться три файла на словарь: *.idx, *.dict, *.ifo. Если вместо *.dict у нас есть *.dz, то распаковываем его тоже — это обычный zip.
- Скачиваем базы WordNet и также распаковываем их куда-нибудь.
- Редактируем say_it_again.lua, изменяя dict_dir, wordnet_dir, chosen_dict.
Пример настроек
- Запускаем VLC, открываем файл видео, рядом с которым лежит файл субтитров в формате srt; включаем в меню View — Say It Again.
- Voilà — используем кнопки y, u, i и backspace для соответствующих действий (см. выше)
Можно обойтись без словарей (dict_dir = nil, chosen_dict = nil), но тогда значение слова придется забивать руками, и не будет транскрипции — смысл автоматизации теряется.
Также можно не подключать wordnet (wordnet_dir = nil), но тогда не будет работать нормализация слов — по слову was не найдет в словаре глагол be.
Технический аспект — VLC и Lua
Начиная, кажется, с версии 1.1, проигрыватель VLC позволяет расширять свой функционал с помощью скриптов на Lua. Для этого расширение должно удовлетворять определенным требованиям (некоторые не обязательны, но VLC будет ругаться):
- Возвращать свое описание в виде таблицы функцией descriptor(). Формат таблицы можно посмотреть в готовых скриптах в хранилище аддонов vlc;
- Иметь функции activate(), deactivate();
- В зависимости от capabilities, указанных в таблице с описанием, нужны функции input_changed(), meta_changed(), menu(), trigger_menu();
- Максимум может быть одно диалоговое окно на расширение. Хак с удалением и пересозданием диалога заново ведет к вылетаниям VLC.
Вообще надо сказать, что механизм расширений довольно сырой, и VLC падает без предупреждения буквально от любого чиха. Вот некоторые моменты, которые я для себя отметил:
- Чтобы обрабатывать периодические события вместо поллинга лучше подписаться на событие intf-event.
- Обработчик колбэка должен быть «коротким», т.е. в нем не должно быть времязатратных операций. С учетом того, что параллелизм в и без того склонную к падениям систему я вносить не хотел, то пришлось изобретать небольшой хак: в начале хендлера отписываться от событий, а в конце подписываться вновь.
- А вообще корутины (coroutines) работают.
- Лучший способ иметь несколько разных диалогов, что я нашел, — это очищать текущий и наполнять его контролами в зависимости от задачи.
Работа с форматами Stardict и WordNet, а также экспорт в Anki
Описание форматов Stardict и WordNet привела Bienne в своей статье, поэтому повторяться не буду. Экспорт в Anki работает через csv-файл. Последовательность полей в нем захардкожена в соответствии со следующей моделью карточек (или, как это сейчас называется, Note Type):
Процесс импорта:
Эпилог
Расширение создавалось под собственные нужды, и его концепция менялась в процессе написания и использования. Отсюда следует немного хаотичный код и отпугивающий внешний вид. Тем не менее, я надеюсь, что кому-нибудь данные разработки покажутся интересными.
Автор: zm33y