Una situazione che capita più spesso di quanto si pensi: abbiamo due ore di una trasmissione radiofonica catturate in streaming e, per altra via, un’ora della stessa trasmissione. Per lavorare sulle due tracce serve sapere in che istante della registrazione completa comincia l’estratto.
Perché non basta «confrontare i campioni»
L’idea ingenua è sovrapporre le due forme d’onda e cercare il punto di massima somiglianza. Su due ore di audio, però, il calcolo vuole molta memoria, e cade al primo cambio di codifica: un file MP3 e uno AAC della stessa trasmissione non hanno campioni uguali.
Il metodo che usiamo
Il comando casoweb trova-offset, nel nostro repository casoweb-tools, procede in due passi.
- Impronta grossolana. Ogni 20 millisecondi misura quanta energia c’è in 24 bande di frequenza. Confrontando l’impronta di un campione dell’estratto con quella della registrazione si trova il candidato, e l’impronta è insensibile a volumi e compressioni diverse.
- Raffinamento. Intorno al candidato si confronta la forma d’onda vera, portando la precisione dai 20 millisecondi a una frazione di millisecondo.
Per non fidarsi di un solo punto, prende tre campioni di 30 secondi dell’estratto (al 10%, al 50% e al 90%): se danno lo stesso istante, la corrispondenza è sicura; se divergono, l’estratto ha dei tagli o una velocità diversa, e lo strumento lo dice.
Come si usa
casoweb trova-offset estratto.mp3 registrazione_completa.mp3 casoweb trova-offset estratto.mp3 registrazione_completa.mp3 --cerca-da 3600 --json
L’uscita dà l’istante di inizio e di fine, i secondi e il fotogramma corrispondente (--fps, 25 di default), utile per allineare le due tracce su una timeline di Shotcut. Con --json il risultato si legge da uno script.
Una prova
Per controllare il metodo abbiamo costruito un caso con la risposta nota: due ore di audio di prova (rumore e un tono, con il volume che varia) salvate in AAC, e un estratto preso a partire da 3777,77 secondi, abbassato di 6 dB e ricodificato in MP3. Due formati diversi e due volumi diversi, come succede con le registrazioni vere. Il risultato:
L'estratto comincia a 01:02:57.770 (3777.770 s, fotogramma 94444 a 25 fps) e finisce a 02:00:00.021. Somiglianza 0.881, scarto tra i campioni 0.0 s.
L’istante trovato coincide con quello noto. Su un portatile del 2010 (Intel Core i3 M 370) tutto il lavoro, compresa la decodifica delle due ore in AAC e dei 57 minuti in MP3, ha richiesto 1 minuto e 18 secondi, con un picco di memoria di 670 MB circa.
È una prova su un segnale sintetico: su una trasmissione vera, con parlato, musica e jingle, non l’abbiamo ancora misurato.
Limiti
- Brani o jingle ripetuti possono dare più candidati equivalenti: lo strumento avvisa, e con
--cerca-dae--cerca-finosi restringe la ricerca. - Se l’estratto ha tagli o una velocità leggermente diversa, i tre campioni non concordano: l’istante trovato vale solo vicino ai punti dove concordano.
- Una somiglianza bassa fa sospettare che l’estratto non appartenga alla registrazione.
Il codice è in casoweb-tools, con la documentazione di trova-offset.
Il lavoro è stato svolto con l'aiuto di Claude, l'assistente di Anthropic, che ha contribuito alla scelta degli strumenti, alla scrittura degli script e alle verifiche sui risultati.
