2016-03-18 13 views
12

Potrzebuję automatycznie podzielić wideo wypowiedzi na słowa, więc każde słowo jest oddzielnym plikiem wideo. Czy znasz jakieś sposoby, aby to zrobić?Jak podzielić wideo lub audio na ciche części?

Mój plan polegał na wykryciu cichych części i wykorzystaniu ich jako separatorów słów. Ale nie znalazłem żadnego narzędzia, aby to zrobić i wygląda na to, że ffmpeg nie jest odpowiednim narzędziem do tego.

Odpowiedz

8

Można najpierw użyć ffmpeg do wykrywania przerw ciszy, jak to

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

To będzie produkować wyjścia konsoli z odczytów, które wyglądają tak:

[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 

Następnie generuje polecenia, aby podzielić z każda cisza kończy się kolejnym rozpoczęciem ciszy. Prawdopodobnie będzie chciał dodać jakieś uchwyty, powiedzmy, 250 ms, więc

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

(I odpuściliśmy określający parametry audio/wideo)

będziemy chcieli napisać skrypt do skrobania dziennik konsoli i wygenerować plik strukturyzowany (może CSV) z kodami czasowymi - jedna para w każdej linii: silence_end i next silence_start. A następnie kolejny skrypt do generowania poleceń z każdą parą liczb.

+2

Jako 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 ostrzeżenie "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

Ten jeden linijek nie działa na Macu. -bash: błąd składni w pobliżu nieoczekiwanego tokenu '& ' –

+1

@JohnSmith, Mac ma domyślnie stare bash (pre-4). Zamień '| &' na '2> i 1 |'. –

Powiązane problemy