Condensant multimèdia per a l'aprenentatge d'idiomes amb shuku

He creat shuku per condensar pel·lícules i sèries conservant només els diàlegs:

Per què?

Com més temps passes immers en un idioma, més ràpid l’adquireixes.

Escolto podcasts en japonès mentre faig exercici o surto a caminar. Com a principiant, la comprensió és difícil. Sense context, només puc entendre paraules individuals i frases curtes.

Una manera d’augmentar massivament el context és repetir contingut. Escoltar la pista d’àudio d’una pel·lícula que has vist abans et permet entendre més que la primera vegada. Saps el que està passant i com acabarà tot!

La idea és veure una pel·lícula o un episodi d’una sèrie, i després escoltar la versió condensada per augmentar la comprensió.

Com es veu a dalt, algunes pel·lícules tenen més silenci que d’altres. Si algú vol fer servir Blade Runner 2049 per aprendre anglès, en lloc d’escoltar les 2 hores i 43 minuts complets, pot fer servir shuku per obtenir la versió només amb diàlegs en 55 minuts. Molt més eficient!

Com?

Els arxius de subtítols contenen tota la informació que necessitem: totes les frases de la pel·lícula amb el seu temps d’inici i fi. Un fragment de Blade Runner 2049:

78
00:14:46,094 --> 00:14:49,184
Do you feel that there's a part of you
that's missing? Interlinked.

79
00:14:49,348 --> 00:14:51,768
-Within cells interlinked.
-Within cells interlinked.

shuku fa servir aquests temps per condensar el contingut. Un resum del procés:

  1. S’executa shuku amb un arxiu de vídeo com Blade.Runner.2049.2017.2160p.UHD.BluRay.TrueHD.7.1.HDR.x265.mkv
  2. Si està habilitat, busca subtítols coincidents (si no, fa servir els interns)
  3. Filtra els subtítols no desitjats (veure més avall)
  4. Crea una llista de segments de veu (temps d’inici/fi dels subtítols)
  5. Extreu els segments a un directori temporal
  6. Uneix els segments en un arxiu d’àudio amb metadades i un nom net: Blade Runner 2049 (2017) (condensed).mp3

Com es veu?

Aquí tens un clip de Blade Runner 2049. L’àudio prové de la versió condensada:

INFO

Per defecte, shuku afegeix mig segon al principi i final de cada línia per evitar talls bruscos.

Com pots veure, els fragments de diàleg són gairebé idèntics, excepte que hi ha menys silenci a la versió condensada. La principal diferència és que ens saltem la lluita i el viatge.

Origen de la idea

No he inventat jo la idea de «multimèdia condensada»; existeixen almenys dos programes que poden fer això: impd (per a GNU+Linux) i condenser (per a Windows).

Vaig crear shuku perquè ni impd ni condenser funcionaven a macOS. El meu primer enfocament va ser crear un fork de condenser per reemplaçar les parts específiques de Windows. Ràpidament em vaig adonar que volia implementar més canvis.

Així que em vaig proposar crear el millor condensador, amb suport multiplataforma, 100% de cobertura de codi i àmplia personalització.

El repositori de shuku inclou una taula comparant les tres eines.

Reptes

Fuzzy matching

Donat un arxiu de vídeo Blade Runner 2049.mkv, shuku pot emparellar-lo amb el seu arxiu de subtítols Blade Runner 2049 (1080p).srt, fins i tot si els noms no coincideixen al 100%.

Per aconseguir-ho, shuku neteja tant el nom de l’arxiu d’entrada com tots els subtítols potencials. Per exemple:

  • Old_Movie_1950_Remastered_2023.mp4old movie remastered 1950 2023
  • Movie.Without.Year.1080p.BluRay.x264-GROUP.mkvmovie without year bluray
  • TV.Show.S01E01.2021.720p.WEB-DL.x264.srttv show s01e01 web-dl 2021

El nom net del vídeo (input) es compara amb tots els noms nets dels arxius de subtítols.

Per trobar la coincidència més propera, la meva primera idea va ser fer servir la distància de Hamming. Funcionava, però era massa sensible a petits canvis (com l’ordre de les paraules).

Vaig provar múltiples enfocaments i vaig trobar la millor precisió amb SequenceMatcher de Python. Aquesta funció es basa en l’algoritme de Ratcliff i Obershelp anomenat Gestalt pattern matching.

Amb la funció de neteja, el comparador de seqüències i un llindar de match ajustable, el fuzzy matching no falla.

No totes les línies de subtítols contenen diàleg

Una línia de subtítols podria ser [so de passes]. No necessitem incloure-la a l’àudio condensat.

Vaig afegir una opció de configuració que per defecte omet els subtítols tancats en claudàtors o notes musicals (♪ o ♬). Això últim és útil per descartar els openings i endings de sèries.

Seguiment de l’àudio

shuku pot generar arxius LRC que coincideixen amb l’àudio condensat. Aquests són arxius amb text sincronitzat utilitzats per a lletres de cançons.

En afegir l’àudio i els subtítols condensats a una app dissenyada per seguir lletres de cançons, com Just Player (iOS), puc consultar els subtítols mentre escolto:

Ara puc consultar l’escriptura de paraules que sonen familiars però no acabo d’entendre; super útil per als kanji!

Detalls tècnics

El meu enfocament va ser fer shuku mantenible, fàcil d’instal·lar, fàcil d’usar i fàcil de contribuir-hi.

Python pot facilitar les contribucions i em permet aprofitar pysubs2, una fantàstica biblioteca per treballar amb subtítols.

FFmpeg és l’única dependència de shuku. A través del binding python-ffmpeg, FFmpeg gestiona tot el processament de mitjans: extracció i unió de segments, conversió d’àudio…

Em vaig centrar en crear codi net i una bona experiència d’usuari:

  • Els type hints a tot el codi detecten problemes potencials d’hora.
  • Configuració fàcil amb TOML. Aquí està la meva configuració.
  • Logging amb nivells personalitzats. Ajuda els usuaris (i a mi!) a entendre què està passant.
  • 100% de cobertura de codi per a fiabilitat i mantenibilitat.
  • CI/CD automatitzats i publicació de (binaris + PyPI) per a totes les plataformes amb atestacions.

Així és com es fa servir shuku:


Si estàs aprenent un idioma per immersió, segur que trobaràs shuku útil. Fes una ullada al repositori de GitHub per començar〜