audio video ffmpeg media video-processing

Cómo dividir video o audio por partes silenciosas



ffmpeg media (1)

Necesito dividir automáticamente el video de un discurso por palabras, por lo que cada palabra es un archivo de video separado. ¿Conoces alguna forma de hacer esto?

Mi plan era detectar partes silenciosas y usarlas como separadores de palabras. Pero no encontré ninguna herramienta para hacer esto y parece que ffmpeg no es la herramienta adecuada para eso.


Primero podrías usar ffmpeg para detectar intervalos de silencio, como este

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

Esto producirá una salida de consola con lecturas que se ven así:

[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

A continuación, genera comandos para dividir desde cada final de silencio hasta el siguiente inicio de silencio. Es probable que desee agregar algunos controladores de, por ejemplo, 250 ms, por lo que el audio tendrá una duración de 250 ms * 2 más.

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

(He saltado la especificación de los parámetros de audio / video)

Querrá escribir un script para raspar el registro de la consola y generar un archivo estructurado (tal vez CSV) con los códigos de tiempo, un par en cada línea: silence_end y el siguiente silence_start. Y luego otro script para generar los comandos con cada par de números.