# Report dei controlli: reel "La pubblicità sceglie chi la guarda" Video `reel-creativita.mp4`: 1080x1920, 30 fps, 41,1 s, H.264 + AAC 48 kHz, 12 MB. Data: 29/10/2026. ## Esito in breve | Controllo | Risultato | |---|---| | Tagli al loro posto nel video finito | 12 su 12, scarto massimo 28 ms (soglia 50 ms) | | Tagli non previsti dalla partitura | 0 | | Fermi (tratti senza movimento oltre 0,6 s) | 0 | | Fotogrammi controllati prima del render | 1234 su 1234, nessun problema (sovrapposizioni, zone sicure, tratti senza testo) | | Silenzi veri prima dei tagli importanti | musica sotto -120 dBFS nei 0,35 s prima di ogni taglio importante | | Loudness | -14,1 LUFS integrati, picco -1,8 dBFS | | Livelli | musica -9,3 dB sotto la voce; effetti da -9,3 a -1,3 dB sotto la voce (mediana -3,2), nessuno più forte | | Regole del brief (gancio, ritmo 1-9) | tutte rispettate (dettaglio sotto) | Non ho potuto ascoltare l'audio: voce, musica e mix sono verificati solo con misure (tempi, livelli, loudness). Prima della pubblicazione serve un ascolto, soprattutto per la naturalezza della voce sintetica. ## Come è stato fatto (tutto misurato, niente secondi scritti a mano) 1. **Voce** (`strumenti/voce.py`): Kokoro-82M, voce italiana maschile `im_nicola`, velocità 1,15, una frase alla volta. Correzioni di pronuncia sui fonemi: "È" aperta e accentata (espeak la leggeva "e"), "Mèta" come l'azienda. Le frasi sono posate in modo che le parole ancora cadano sul battito (pause scelte dentro un intervallo ammesso); dopo ogni taglio importante la griglia riparte dalla parola del taglio, come la musica. 2. **Tempi delle parole** (`parole.json`, 91 parole): faster-whisper `medium` su `voce.wav`, testo sempre del copione, allineamento lettera per lettera; attacchi e fini vicino alle pause misurati sull'energia del segnale (Whisper anticipava fino a 0,4 s gli attacchi dopo una pausa). Il piano delle frasi e la misura finale coincidono entro 10 ms. 3. **Musica** (`strumenti/musica.py`): brano originale sintetizzato, 120 BPM, La minore. Battute 0-3 solo accordi, 4-11 accordi con hi-hat e basso, 12-15 drop. Tracce separate vere (armonia, batteria, basso) dalla sintesi: demucs non serve. **Griglia** (`griglia.json`): librosa da sola sbaglia (117,5 BPM, battiti solo da 8 s perché il tappeto iniziale non ha percussioni); misurato il colpo di cassa del drop a 24,003 s e impostata la griglia a mano (`--bpm 120 --uno 24.0`). 4. **Partitura** (`partitura.json`, 31 voci, 86 eventi risolti): ogni evento è agganciato a una parola o a un battito (anche a sedicesimi e trentaduesimi). Sette segmenti di musica: lo stesso drop (battuta 12) apre il video, torna su "diverse" e riparte dopo l'ultima domanda. 5. **Animazione** (`grafica/`): HTML, `render(t)` legge ogni istante da `tempi.js`. Colori, font (Author, Open Sans) e logo dal sito bd-solutions.it. 6. **Mix** (`ritmo/mix.py`): voce sopra, musica con ducking sotto la voce, effetti calibrati picco contro picco (`strumenti/livelli.py`), loudnorm a -14 LUFS con correzione finale di guadagno. ## Regole del gancio - Testo leggibile dal fotogramma 0: "Smetti di scegliere il pubblico." è a piena opacità a t = 0, insieme al menu degli interessi. Niente logo e niente intro. - Primo movimento: il cursore si muove dal fotogramma 0, clic su "Deseleziona tutto" a 0,26 s, il primo interesse si spegne a 0,375 s, il diciottesimo a 1,438 s (uno ogni trentaduesimo, ognuno col suo clic). - Senza audio la scena si capisce: interessi spenti uno dopo l'altro, contatore da 47 a 0, interruttore "Advantage+" che si accende. ## Regole di ritmo (`strumenti/regole.py` su `cue.json`) ``` REGOLA 1 il video si apre sul drop (brano da 24,00 s), pieno fino a 3,50 s lo stesso pezzo (battuta 12) torna su 'diverse' a 28,00 s REGOLA 2 eventi visivi senza suono: nessuno; coppie di suoni a meno di 50 ms: nessuna REGOLA 3 la 9,01 s: 0,45 s di musica a zero | per 22,69 s: 0,45 s | diverse 28,00 s: 0,40 s e 29,70 s: 0,45 s | finale 35,56 s: 0,50 s REGOLA 4 il basso entra a 0,00 s (drop d'apertura), 9,20 s ('pubblicità', S2), 28,00 s ('diverse'), 35,56 s (drop finale); tra un ingresso e l'altro c'è solo il tappeto di accordi REGOLA 5 mutui 11,51 s, prima 15,01 s, titolare 19,51 s: taglio con colpo, scarto dal battito 0 ms; le persone arrivano dal battito (13,51 / 17,51 / 21,51 s), una ogni sedicesimo, ognuna col suo pop REGOLA 6 (ritmo/partitura.py R5) nessun suono sopra 0,35 di volume nei 120 ms prima di una parola che riparte dopo una pausa: i colpi dei tagli importanti dopo i silenzi sono "impact-soft" a 0,27 REGOLA 7 controllo dei fotogrammi: nessun tratto senza testo, nessun buco tra una scritta e l'altra REGOLA 8 'giuste?' finisce a 35,06 s, drop a 35,56 s (attesa 0,50 s); immagini sul battito a 35,56, 36,06, 36,56; logo a 37,06 s; la voce riparte con 'Prenota' a 37,31 s REGOLA 9 "Prenota una consulenza" compare una volta sola, da 37,31 s alla fine (un solo elemento nella pagina) ``` `ritmo/partitura.py` (regole R1-R6 del metodo): **tutto ok**. ## Controllo di ogni fotogramma prima del render (`ritmo/controlla-pagina.mjs`) Zona sicura usata: x 80-960, y 230-1480 (barra del profilo in alto, didascalia in basso, icone a destra). Blocchi controllati: titoli, card, righe, etichette, logo e pulsante; le persone (avatar) solo per la zona sicura, perché il loro raggrupparsi intorno all'annuncio è voluto. Esito: **nessun problema su 1234 fotogrammi**. Problemi trovati e corretti prima dell'esito pulito: avatar sparsi oltre il bordo sinistro e basso (S2), anello di persone oltre il bordo basso durante la rotazione (S2, S5), titolo oltre il margine nella spinta di camera prima del drop (S4). ## Controllo del video finito (`ritmo/controlla.py`) ``` TAGLI PREVISTI ok oggi 3.50s scarto 5 ms ok per 22.69s scarto 10 ms ok la 9.01s scarto 23 ms ok diverse 28.00s scarto 0 ms ok mutui 11.51s scarto 23 ms ok e 29.70s scarto 28 ms ok prima 15.01s scarto 23 ms ok finale 35.56s scarto 7 ms ok titolare 19.51s scarto 23 ms ok lampi#0 36.06s scarto 7 ms ok lampi#1 36.56s scarto 7 ms ok logo 37.06s scarto 7 ms TAGLI NON IN PARTITURA: 0 FERMI > 0.6s: 0 SILENZIO PRIMA DEI TAGLI IMPORTANTI (audio totale, dB rispetto alla media) la -166.3 | per -156.5 | diverse -0.4 | e -166.3 | finale -166.3 LOUDNESS -14.1 LUFS, picco -1.8 dBFS ESITO: ok ``` Su "diverse" l'audio totale non è a zero perché la voce sta dicendo "pubblicità": lì è a zero solo la musica (misurata sotto -120 dBFS sul bus della musica), apposta. Una pausa della voce prima di "diverse" avrebbe messo il colpo del drop su una parola che riparte dopo una pausa (regola 6). Lo scarto residuo di 23-28 ms su alcuni tagli è il quantizzare a 30 fps (un fotogramma dura 33 ms). ## Problemi trovati durante il lavoro e come sono stati risolti - Prima versione a 43,6 s: velocità della voce da 1,10 a 1,15, pause dei tagli importanti fisse, finale con tre immagini sul battito invece di quattro. Ora 41,1 s (voce fino a 39,40 s, poi 1,7 s su logo e chiamata all'azione). - Whisper con il copione come `initial_prompt` saltava i primi 30 s; senza silenzio in coda perdeva l'ultima frase. Corretti in `ritmo/tempi.py` (modifiche segnate nel file). - Primo render: "la" e "diverse" non si leggevano come tagli (trasformazione sul posto) e c'erano 9 tratti fermi. Aggiunti un lampo verde leggero sui tagli importanti e un movimento continuo (persone che orbitano, folla grigia in S3, card che fluttuano, spinta di camera prima del drop). In S4 le righe dei pubblici ora entrano sul taglio e le miniature uguali atterrano su "stessa". - Le rampe delle automazioni stavano dentro la finestra di silenzio: negli ultimi 40 ms la musica risaliva (su "È" il drop rientrava a -15,6 dB). Rampa di rientro separata da 3 ms (`rampa_fine`): silenzio vero fino al colpo. - Picco a -0,6 dBFS dopo la codifica AAC: limiter più basso nel mix, ora -1,8 dBFS. ## Da verificare a orecchio (Enrico) - Naturalezza della voce Kokoro: è una voce sintetica. Se serve più calore, si può sostituire `voce.wav` con una voce registrata o un TTS professionale e rilanciare `./monta.sh` (tempi, partitura e mix si ricalcolano da soli). - Musica sintetizzata da codice: originale e senza licenze, ma più semplice di un brano prodotto. Un brano CC0 si può usare al suo posto: serve separarlo in tracce (demucs) e indicare nella partitura la battuta del drop.