Как и многих пользователей Хабра меня интересует вопрос, как можно повысить эффективность изучения иностранных языков. Один из наиболее часто рекомендуемых методов — смотреть фильмы на изучаемом языке. И, естественно, я им пользуюсь. Периодически меня посещают мысли о необходимости оптимизации этого подхода. Сначала я нашел себе проигрыватели, которые поддерживают одновременное отображение субтитров на двух языках: субтитры на изучаемом языке отображаются как обычно внизу экрана, а вверху отображаются субтитры на русском. Но этого мне показалось мало. Я пошел искать проигрыватель, который мог бы отображать не только текущие субтитры, но и "транскрипт" — последовательность, включающую как текущий фрагмент субтитров, так и соседние, что бы из них можно было сложить связанный более крупный фрагмент текста. Это может быть удобно если:

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

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

Похожая функциональность есть, например, на YouTube и на Корсэре.

Однако после некоторых изысканий я к своему удивлению обнаружил что этой фичи нет ни в одном Windows-проигрывателе. (UPDATE: этой фичи в стандартных проигрывателях нет в нужном мне виде, т.е. с параллельным отображением транскрипта на двух языках)

У меня как раз чесались руки попробовать что из себя представляет связка Cursor+o1. Так спонтанно родилось решение использовать такой проигрыватель в качестве объекта для экспериментов с этими инструментами. Сразу скажу, что навыков разработки у меня практически нет (если не считать минимальных фрагментарных представлений о разработке для веба).

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

В первом промпте я начал с общей постановки задачи о том что нужно реализовать проигрыватель видео на Питоне. Моя ошибка заключалась в том что я сразу же явно указал библиотеку tkvideoplayer, на основе которой предполагалось все реализовать. Мне казалось что максимум деталей в изначальной постановке задачи должен привести к наиболее эффективному решению. В результате мне некоторое время не удавалось даже просто воспроизводить видео со звуком. После множества попыток это исправить ИИ сам перешел на использование библиотеки python-vlc, после чего процесс "разработки" заметно ускорился.

На следующем шаге относительно быстро удалось сделать приложение "двухоконным": в одном окне осуществляется воспроизведение видео, другое окно - это панель управления воспроизведением и отображения транскрипта. Верстку элементов в окне управления я сначала пытался менять с помощью промптов, но потом все-таки начал это делать своими руками непосредственно в коде.

В итоге получилось примерно так:

Больше всего времени было потрачено на тщетные попытки формировать "транскрипт на основе субтитров" в режиме реального времени путем извлечения субтитров из видео непосредственно в процессе проигрывания. Только спустя некоторое время (и после исчерпания лимитов о1) до меня дошло, что, вероятно, это в принципе практически нерешаемая задача, т.к. извлечение субтитров из видео требует некоторых ресурсов и времени. В итоге пришлось делать костыль — сначала извлекать субтитры в отдельные файлы, а затем подгружать их в проигрыватель уже из srt-файлов.

Скрипт для извлечения субтитров получилось написать практически с первой попытки, но и тут не обошлось без подводных камней. Он хорошо отработал на первом фильме, но завис на втором. ИИ на мой вопрос по поводу зависания ничего внятного не ответил, предложил добавить в реализацию сбор диагностической информацией. Мне было лень заморачиваться с допиливанием диагностики, поэтому я включил мозги и догадался что возможной причиной зависания было то, что фильм содержал несколько субтитров на одном языке (например, две версии русских субтитров). Я попросил ИИ модифицировать скрипт с учетом этой особенности, в результате чего и на втором фильме все отработало нормально.

На последнем шаге я доделал разные мелочи для удобства (hot-keys, запоминание параметров фильма при закрытии и повторном открытии) — это потребовало минимум телодвижений.

В итоге поделка получилась довольно убогая и весьма глючная, но меня устраивает — пользуюсь пока ежедневно. Рад что заморочился. Надеюсь когда-нибудь найти в себе силы заняться доработкой.

В процессе я пользовался только Чатом Курсора. Соответственно, Композер и автокомплит не использовал. Ручных правок кода максимально избегал (за исключением вышеупомянутых небольших изменений верстки окна Controls). О существовании и особенностях Композера я узнал сильно позже, при следующем "подходе к снаряду" — интересная оказалась штука, но для данной задачи, видимо, неактуальная, т.к. тут все в одном файле.

Заключение

В целом с учетом всех вводных первый опыт использования Cursor+o1 и получившийся "продукт" меня, скорее, удовлетворили. Не знаю как получилось бы эту задачу решить с помощью VSCode+Copilot. Вероятно, получилось бы, но желания проверять у меня пока нет.

Что касается самого приложения, то наверно было бы интересно посмотреть как это работает в следующей конфигурации: видео воспроизводится на телевизоре, а интерфейс с транскриптами и кнопками управления воспроизведением работает на планшете, который пользователь держит в руках. Но ввиду отсутствия телевизора и планшета лично я пока не планирую практических шагов в эту сторону. Могу только осторожно предположить, что целесообразно будет это делать как веб-приложение, а не как Python-скрипт.

Комментарии (8)


  1. ru1z
    11.10.2024 13:49

    этой фичи нет ни в одном Windows-проигрывателе

    Проигрывателей тысячи, тем более для win. Так как нет скриншота, то непонятно о чем речь, но навскидку potplayer → браузер субтитров? Заодно там и двойные субтитры и хоткеи и много другого.

    пплр и браузер субтитров (справа)


    1. AlexanderAnisimov Автор
      11.10.2024 13:49

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


      1. ru1z
        11.10.2024 13:49

        Да, два одновременно наверное не поддерживает. Но вообще с двумя субтитрами программа будет похожа на типичный редактор субтитров, вроде subtitleeidt, где и вид программы можно настроить довольно гибко и субтитры менять по желанию пятки и форму аудиосигнала.

        пример с видом перевод-оригинал-видео

        Но это конечно не для изучения языка программы.


  1. AndreyDmitriev
    11.10.2024 13:49

    Как программист начинает изучать новый разговорный язык? Правильно, сначала он пишет программу-помощник для изучения этого самого языка.

    Я начал учить французский в конце прошлого месяца (с абсолютного нуля), обложился учебниками с кучей аудиоматериалов, но довольно скоро мне стало не очень удобно ставить это дело на паузу и мотать туда сюда в плеере (французский не очень прост в плане произношения). Короче слепил такую вот программку, чтобы в неё можно было загрузить текстовый файл и аудио (в виде wav файла), затем для каждой фразы определить начало и конец (руками, тут только хардкор, никакого ИИ), сохранить это дело и проигрывать любую фразу сколько нужно раз, пока она не проникнет в мозг, вот так это на данный момент выглядит:

    Цифры справа от текста - позиция и длительность, курсоры начала и конца можно интерактивно двигать и сохранять. А, ещё я сделал замедленное произношение (во французском бывает слова склеиваются в группы, я ни фига на нормальной скорости не разбираю, а замедленно в полтора два раза — чуть легче). Это кстати, оказалось непросто, чтобы сохранять высоту тона, я уже приготовился идти и разбираться с Фурье и вокодером, но потом просто воспользовался Rubber Band библиотекой (там есть утилита командной строки, которой можно wav скормить) и стало норм, велосипед изобретать не пришлось.

    Написано на LabVIEW (мне так проще). Выкладывать пока не буду, там сыро и спагетти, кроме того мне ещё надо прикрутить юникод, чтобы и фонетическую транскрипцию IPA шрифтом и русский перевод сразу видеть (это в LabVIEW мягко говоря нетривиально, но возможно). Материалы разложены в два уровня — "Учебник" и "Урок", чтобы проще навигироваться было (я пользуюсь тремя учебниками плюс то, что преподаватель даёт). По сути это папки, в каждой просто лежит текстовый файлик, wav файл и опционально png картинка, которая справа показывается (ну там скриншот учебника или сайта). Пока идёт "пристрелка", я подгоняю инструмент под учебный процесс в виде полезной прокрастинации между занятиями.

    А до фильмов на французском мне ещё ох как далеко.


    1. AlexanderAnisimov Автор
      11.10.2024 13:49

      При живом workaudiobook я бы точно поленился бы так заморачиваться.

      Автоматическое разбиение на фразы с помощью ИИ - это интересная головоломка. Можно подумать.

      Для изучения с нуля рекомендую прочесть Умина и найти подходящий лингафонный курс - это скорее всего будет лондонский на трэкере. Мне очень нравился Assimil в качестве уминского лингафонного курса, но для первого месяца это ту мач.


      1. AndreyDmitriev
        11.10.2024 13:49

        Спасибо за советы! В LabVIEW вообще всё это ну очень просто — там готовые кирпичики чтобы загрузить wav файл и график тоже, любой LabVIEW программист набросает такое часа этак за три. И хорошая мысль с workaudiobook, переделаю-ка я это на srt для совместимости, как-то я эту программу пропустил, там есть пара неплохих моментов, да. А "лондонский" лингафонный курс — это английский, надо полагать, равно как и Assimil? Есть ли хороший французский?


        1. AlexanderAnisimov Автор
          11.10.2024 13:49

          Я про французский. В поиске что-то типа "Лингафонные курсы лондонского лингафонного института" и "Лондонский лингафонный институт". Но я не уверен что сохранилась раздача которую я скачивал.


    1. AlexanderAnisimov Автор
      11.10.2024 13:49

      проигрывать любую фразу сколько нужно раз, пока она не проникнет в мозг,

      По поводу многократного повторения с последующим проникновением в мозг, была когда-то лет десять назад такая классная приблуда в интернете (не помню как называлась): в нее можно было текстом ввести какую-нибудь фразу, а она искала эту фразу по огромной базе субтитров, находила соответствующие отрывки фильмов и сериалов и тут же показывала небольшой клип, в котором сплошным потоком воспроизводились короткие (3-4 сек.) фрагменты этих фильмов с этой фразой. Выглядело - фантастически! Разные персонажи, разными голосами, в разных контекстах - это все в виде коротких отрывков с моментальным переключением.

      Жаль что некому откопать эту стюардессу.

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