如何通过静音部分分割视频或音频

Ter*_*miT 20 media audio video ffmpeg video-processing

我需要通过单词自动分割语音视频,因此每个单词都是一个单独的视频文件.你知道怎么做的吗?

我的计划是检测静音部分并将它们用作单词分隔符.但我没有找到任何工具来做到这一点,看起来像ffmpeg不是正确的工具.

Gya*_*yan 25

您可以先使用ffmpeg来检测静音间隔,就像这样

ffmpeg -i "input.mov" -af silencedetect=noise=-30dB:d=0.5 -f null - 2> vol.txt
Run Code Online (Sandbox Code Playgroud)

这将生成控制台输出,其读数如下所示:

[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
Run Code Online (Sandbox Code Playgroud)

然后生成命令以从每个静默结束分割到下一个静默开始.您可能想要添加一些句柄,比如250毫秒,因此音频的持续时间将为250毫秒*2.

ffmpeg -ss <silence_end - 0.25> -t <next_silence_start - silence_end + 2 * 0.25> -i input.mov word-N.mov
Run Code Online (Sandbox Code Playgroud)

(我跳过了指定音频/视频参数)

您需要编写一个脚本来抓取控制台日志并生成带有时间码的结构化(可能是CSV)文件 - 每行一对:silence_end和下一个silence_start.然后是另一个用每对数字生成命令的脚本.

  • 作为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` (5认同)
  • @ JohnSmith,Mac默认情况下具有旧的(pre-4)bash。将`|&`替换为`2&gt;&1 |`。 (3认同)
  • @giacecco 要跳过重新编码,请将 `-c copy` 添加到最后一个 ffmpeg 命令行。其他效果需要更复杂的脚本。也许有一天我会实施它并作为答案发布...... (2认同)
  • 如何调整噪声参数,`noise=-30dB:d=0.5`?我尝试了不同的值,但我没有得到 `silent_start` 和 `silent_end` 对,也就是说,有时会丢失一个。 (2认同)
  • @维。回答这个问题似乎可以赚 100 分 /sf/ask/3854044491/ -zero 请看一下。 (2认同)