2016-03-18 25 views
12

Ho bisogno di dividere automaticamente il video di un discorso con parole, quindi ogni parola è un file video separato. Conosci qualche modo per farlo?Come dividere video o audio con parti silenziose

Il mio piano era rilevare parti silenziose e usarle come separatori di parole. Ma non ho trovato nessuno strumento per farlo e sembra che ffmpeg non sia lo strumento giusto per questo.

risposta

8

Si potrebbe usare prima ffmpeg per rilevare intervalli di silenzio, come questo

ffmpeg -i "input.mov" -af silencedetect=noise=-30dB:d=0.5 -f null - 2> vol.txt 

Questo produrrà l'output della console con letture che assomigliano a questo:

[silencedetect @ 00000000004b02c0] silence_start: -0.0306667 
[silencedetect @ 00000000004b02c0] silence_end: 1.42767 | silence_duration: 1.45833 
[silencedetect @ 00000000004b02c0] silence_start: 2.21583 
[silencedetect @ 00000000004b02c0] silence_end: 2.7585 | silence_duration: 0.542667 
[silencedetect @ 00000000004b02c0] silence_start: 3.1315 
[silencedetect @ 00000000004b02c0] silence_end: 5.21833 | silence_duration: 2.08683 
[silencedetect @ 00000000004b02c0] silence_start: 5.3895 
[silencedetect @ 00000000004b02c0] silence_end: 7.84883 | silence_duration: 2.45933 
[silencedetect @ 00000000004b02c0] silence_start: 8.05117 
[silencedetect @ 00000000004b02c0] silence_end: 10.0953 | silence_duration: 2.04417 
[silencedetect @ 00000000004b02c0] silence_start: 10.4798 
[silencedetect @ 00000000004b02c0] silence_end: 12.4387 | silence_duration: 1.95883 
[silencedetect @ 00000000004b02c0] silence_start: 12.6837 
[silencedetect @ 00000000004b02c0] silence_end: 14.5572 | silence_duration: 1.8735 
[silencedetect @ 00000000004b02c0] silence_start: 14.9843 
[silencedetect @ 00000000004b02c0] silence_end: 16.5165 | silence_duration: 1.53217 

È quindi generare comandi per dividere da ogni silenzio termina al prossimo silenzio inizia. Probabilmente si vorrà aggiungere alcuni manici di, diciamo, 250 ms, quindi

ffmpeg -ss <silence_end - 0.25> -t <next_silence_start - silence_end + 0.25> -i input.mov word-N.mov 

(ho saltato specificare i parametri audio/video)

ti consigliamo di scrivere uno script per raschiare il log della console e generare un file strutturato (forse CSV) con i timecode - una coppia su ogni riga: silence_end e il prossimo silenzio_start. E poi un altro script per generare i comandi con ogni coppia di numeri.

+2

Come oneliner: 'ffmpeg -i input.mkv -filter_complex" [0: a] silencedetect = n = -90dB: d = 0.3 [outa] "-map [outa] -f s16le -y/dev/null | & F = '- aq 70 -v warning' perl -ne 'INIT {$ ss = 0; $ Se = 0; } if (/ silence_start: (\ S +) /) {$ ss = $ 1; $ Ctr + = 1; printf "ffmpeg -nostdin -i input.mkv -ss% f -t% ​​f $ ENV {F} -y% 03d.mkv \ n", $ se, ($ ss- $ se), $ ctr; } if (/ silence_end: (\ S +) /) {$ se = $ 1; } END {printf "ffmpeg -nostdin -i input.mkv -ss% f $ ENV {F} -y% 03d.mkv \ n", $ se, $ ctr + 1; } '| bash -x' –

+1

Questo liner non funziona su mac. -bash: errore di sintassi vicino a token imprevisto '& ' –

+1

@JohnSmith, Mac ha una bash vecchia (pre-4) per impostazione predefinita. Sostituisci '| &' con '2> & 1 |'. –