web-dev-qa-db-fra.com

Comment diviser la vidéo ou l'audio en parties silencieuses

J'ai besoin de diviser automatiquement la vidéo d'un discours par des mots, donc chaque mot est un fichier vidéo distinct. Connaissez-vous des moyens de procéder?

Mon plan était de détecter les parties silencieuses et de les utiliser comme séparateurs de mots. Mais je n'ai trouvé aucun outil pour le faire et il semble que ffmpeg ne soit pas le bon outil pour cela.

24
TermiT

Vous pouvez d'abord utiliser ffmpeg pour détecter les intervalles de silence, comme ceci

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

Cela produira une sortie console avec des lectures qui ressemblent à ceci:

[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

Vous générez ensuite des commandes pour séparer de chaque fin de silence au début de silence suivant. Vous voudrez probablement ajouter quelques poignées de, disons, 250 ms, donc l'audio aura une durée de 250 ms * 2 de plus.

ffmpeg -ss <silence_end - 0.25> -t <next_silence_start - silence_end + 2 * 0.25> -i input.mov Word-N.mov

(J'ai omis de spécifier les paramètres audio/vidéo)

Vous voudrez écrire un script pour gratter le journal de la console et générer un fichier structuré (peut-être CSV) avec les codes temporels - une paire sur chaque ligne: silence_end et le prochain silence_start. Et puis un autre script pour générer les commandes avec chaque paire de nombres.

31
Gyan