Учим язык, смотря сериалы: vlc + lua + stardict + wordnet + anki = l'amour

zm33y 19 февраля 2013 в 15:07 118k
Очень уж мне нравится смотреть сериалы, а еще я учу с их помощью языки. И если раньше я прилежно останавливал видео на непонятном месте, перематывал назад, включал субтитры и забивал незнакомые слова в Анки, то сейчас я делаю то же самое. Разве что лень заставила этот процесс автоматизировать, что привело к созданию расширения Say It Again для проигрывателя VLC со следующими особенностями:

  • Навигация по субтитрам (переход к предыдущей, следующей фразе) — клавиши y, u;
  • Сохранение слова, его транскрипции и перевода вместе с контекстом (см. скриншот) — клавиша i;
  • Функция «Еще раз»: переход к предыдущей фразе, показ субтитра и пауза — клавиша backspace;
  • Подключение любых словарей в формате Stardict (в сети лежат словари из Lingvo x3);
  • Экспорт в Anki или другую программу, понимающую файлы в формате csv;


Say It Again screenshot



Но зачем?


В какой-то момент я понял, что просмотр сериалов с включенными субтитрами перестал давать ощутимые плоды (кроме повышения скорочтения). Но, выключая субтитры, я сталкивался со шквалом непонятных слов. Приходилось отматывать видео назад (конечно же либо недостаточно, либо слишком далеко от нужного места), включать субтитры, останавливать проигрывание, искать в словаре незнакомые слова, выписывать их в отдельный файлик, потом забивать в Анки (порой с контекстом, т.е. с фразой из фильма!) — в общем, геморрой. Отсюда и родилась идея расширения, которым я пользуюсь сегодня, и которым хочу поделиться с общественностью. Оно позволяет автоматизировать процесс сохранения слов с контекстом в текстовый файл такого вида:
Пример файла экспорта
desecrate [ˈdesɪkreɪt] оскорблять, осквернять, позорить You've desecrated my owls. Weeds S07E12



Как этим пользоваться?


На самом деле не самый user-friendly процесс, но тут уж ничего не поделаешь. Скрипт проверялся на VLC 2.0.5 под Windows.
  1. Скачиваем последнюю версию скрипта say_it_again.lua с Гитхаба (прямая ссылка)
  2. Копируем его, в зависимости от платформы, в %ProgramFiles%\VideoLAN\VLC\lua\extensions или /usr/share/vlc/lua/extensions.
  3. Ищем и качаем словарь в формате Stardict (копирайт? не, не слышал). Лично мне нравятся англо-английские словари Oxford American Dictionary.
  4. Распаковываем его. В результате должны получиться три файла на словарь: *.idx, *.dict, *.ifo. Если вместо *.dict у нас есть *.dz, то распаковываем его тоже — это обычный zip.
  5. Скачиваем базы WordNet и также распаковываем их куда-нибудь.
  6. Редактируем say_it_again.lua, изменяя dict_dir, wordnet_dir, chosen_dict.
    Пример настроек

  7. Запускаем VLC, открываем файл видео, рядом с которым лежит файл субтитров в формате srt; включаем в меню View — Say It Again.
  8. Voilà — используем кнопки y, u, i и backspace для соответствующих действий (см. выше)

Можно обойтись без словарей (dict_dir = nil, chosen_dict = nil), но тогда значение слова придется забивать руками, и не будет транскрипции — смысл автоматизации теряется.
Также можно не подключать wordnet (wordnet_dir = nil), но тогда не будет работать нормализация слов — по слову was не найдет в словаре глагол be.

Технический аспект — VLC и Lua


Начиная, кажется, с версии 1.1, проигрыватель VLC позволяет расширять свою функциональность с помощью скриптов на Lua. Для этого расширение должно удовлетворять определенным требованиям (некоторые не обязательны, но VLC будет ругаться):
  1. Возвращать свое описание в виде таблицы функцией descriptor(). Формат таблицы можно посмотреть в готовых скриптах в хранилище аддонов vlc;
  2. Иметь функции activate(), deactivate();
  3. В зависимости от capabilities, указанных в таблице с описанием, нужны функции input_changed(), meta_changed(), menu(), trigger_menu();
  4. Максимум может быть одно диалоговое окно на расширение. Хак с удалением и пересозданием диалога заново ведет к вылетаниям VLC.

Вообще надо сказать, что механизм расширений довольно сырой, и VLC падает без предупреждения буквально от любого чиха. Вот некоторые моменты, которые я для себя отметил:
  • Чтобы обрабатывать периодические события вместо поллинга лучше подписаться на событие intf-event.
  • Обработчик колбэка должен быть «коротким», т.е. в нем не должно быть времязатратных операций. С учетом того, что параллелизм в и без того склонную к падениям систему я вносить не хотел, то пришлось изобретать небольшой хак: в начале хендлера отписываться от событий, а в конце подписываться вновь.
  • А вообще корутины (coroutines) работают.
  • Лучший способ иметь несколько разных диалогов, что я нашел, — это очищать текущий и наполнять его контролами в зависимости от задачи.

Работа с форматами Stardict и WordNet, а также экспорт в Anki


Описание форматов Stardict и WordNet привела Bienne в своей статье, поэтому повторяться не буду. Экспорт в Anki работает через csv-файл. Последовательность полей в нем захардкожена в соответствии со следующей моделью карточек (или, как это сейчас называется, Note Type):
Посмотреть скриншоты



Процесс импорта:


Эпилог


Расширение создавалось под собственные нужды, и его концепция менялась в процессе написания и использования. Отсюда следует немного хаотичный код и отпугивающий внешний вид. Тем не менее, я надеюсь, что кому-нибудь данные разработки покажутся интересными.

Upd


Теперь работает на Линуксе (проверено в Ubuntu 12.10 64bit; vlc 2.0.5).
Проголосовать:
+108
Сохранить: