Audio 如何使用ffmpeg缩短音频文件中的静音?
我试图用ffmpeg缩短录音中过多的沉默(缩短他们,而不是完全消除沉默)。我使用的当前代码:Audio 如何使用ffmpeg缩短音频文件中的静音?,audio,ffmpeg,sox,Audio,Ffmpeg,Sox,我试图用ffmpeg缩短录音中过多的沉默(缩短他们,而不是完全消除沉默)。我使用的当前代码: ffmpeg -hide_banner -i file_name.m4a -af silenceremove=0:0:0:-1:0.7:-30dB file_name_short.m4a 它不起作用。它检测到超过0.7秒的静音,并将其完全删除,这不是我想要的。有人知道如何截断静默,比如说,将静默时间从1秒缩短到0.5秒吗?ffmpeg的消音器移动命令的参数似乎只允许删除超过一定长度的所有静默。这意味
ffmpeg -hide_banner -i file_name.m4a -af silenceremove=0:0:0:-1:0.7:-30dB file_name_short.m4a
它不起作用。它检测到超过0.7秒的静音,并将其完全删除,这不是我想要的。有人知道如何截断静默,比如说,将静默时间从1秒缩短到0.5秒吗?ffmpeg的消音器移动命令的参数似乎只允许删除超过一定长度的所有静默。这意味着如果你通过了stop_duration=0.5,并且有一个2.2秒长的静默块,那么你将得到0.2秒的静默(2.2-0.5-0.5-0.5-0.5=0.2) 如果您不介意在.wav格式之间来回转换,可以使用我编写的这个Python脚本。它有很多选项,即使是Python,它也使用NumPy,因此它可以在不到一秒钟的时间内处理短文件,并且可以在大约5.7秒内处理2小时长的.wav,这是相当不错的。对于严重的速度,这可以在C++中改写。对于视频,可以使用OpenCV扩展解决方案 优点:
- 可自动确定阈值,攻击性可调
- 可以指定最大静默持续时间
- 可以指定最小非静默持续时间,以避免静默之间出现短暂的间歇
- 可以使用它检测静默时间(更快;1.7秒内处理2小时)
- 避免覆盖文件,除非被告知这样做
- 它将整个文件读入内存
- 它只适用于wave文件,不保留元数据。(有关解决方法,请参见下文)
- 它可以处理普通的WAVE标准,除非您没有安装SciPy,在这种情况下,它使用的是Python的WAVE模块,它只适用于16位PCM
ffmpeg-i myfile.m4a myfile.wav
python3 trim\u Silence.py--input=myfile.wav
ffmpeg-i result.wav-i myfile.m4a-map\u metadata 1 myfile\u trimmed.m4a
usage: trim_silence.py [-h] --input INPUT [--output OUTPUT] [--threshold THRESHOLD] [--silence-dur SILENCE_DUR] [--non-silence-dur NON_SILENCE_DUR]
[--mode MODE] [--auto-threshold] [--auto-aggressiveness AUTO_AGGRESSIVENESS] [--detect-only] [--verbose] [--show-silence] [--time-it]
[--overwrite]
optional arguments:
-h, --help show this help message and exit
--input INPUT (REQUIRED) name of input wav file (default: None)
--output OUTPUT name of output wave file (default: result.wav)
--threshold THRESHOLD
silence threshold - can be expressed in dB, e.g. --threshold=-25.5dB (default: -25dB)
--silence-dur SILENCE_DUR
maximum silence duration desired in output (default: 0.5)
--non-silence-dur NON_SILENCE_DUR
minimum non-silence duration between periods of silence of at least --silence-dur length (default: 0.1)
--mode MODE silence detection mode - can be 'any' or 'all' (default: all)
--auto-threshold automatically determine silence threshold (default: False)
--auto-aggressiveness AUTO_AGGRESSIVENESS
aggressiveness of the auto-threshold algorithm. Integer between [-20,20] (default: 3)
--detect-only don't trim, just detect periods of silence (default: False)
--verbose print general information to the screen (default: False)
--show-silence print locations of silence (always true if --detect-only is used) (default: False)
--time-it show steps and time to complete them (default: False)
--overwrite overwrite existing output file, if applicable (default: False)
trim_silence.py的内容:
将numpy导入为np
导入argparse
导入时间
导入系统
导入操作系统
def测试模式(模式):
mode=mode.lower()
有效的_模式=[“全部”、“任何”]
如果模式不在有效的_模式中:
引发异常(“模式{mode}无效-必须是{valid_modes}之一”)
返回模式
def testaggr(aggr):
尝试:
累计=最小值(20,最大值(-20,整数(累计)))
返回aggr
除:
引发异常(“自动攻击性“{aggr}”无效-请参阅用法”)
parser=argparse.ArgumentParser(格式化程序\u class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_参数(“--input”,type=str,help=“(必需)输入wav文件的名称”,必需=True)
parser.add_参数(“--output”,default=“result.wav”,type=str,help=“输出波形文件的名称”)
parser.add_参数(“--threshold”,default=“-25dB”,type=str,help=“沉默阈值-可以用dB表示,例如--threshold=-25.5dB”)
add_参数(“--silence dur”,默认值=0.5,type=float,help=“输出中所需的最大静默持续时间”)
parser.add_参数(“--non-silence-dur”,默认值=0.1,type=float,help=“至少为--silence-dur-length的沉默时段之间的最小非沉默持续时间”)
parser.add_参数(“--mode”,default=“all”,type=testmode,help=“静默检测模式-可以是'any'或'all')
parser.add_参数(“--auto threshold”,action=“store_true”,help=“automatically determinate silent threshold”)
parser.add_参数(“--auto-aggressive”,default=3,type=testaggr,help=“自动阈值算法的攻击性。介于[-20,20]之间的整数”)
parser.add_参数(“--detect only”,action=“store_true”,help=“不修剪,只检测静默期”)
parser.add_参数(“--verbose”,action=“store_true”,help=“将常规信息打印到屏幕上”)
parser.add_参数(“--show silence”,action=“store_true”,help=“打印静默位置(如果使用--detect only,则始终为true)”)
parser.add_参数(“--time it”,action=“store_true”,help=“show steps and time to complete”)
parser.add_参数(“--overwrite”,action=“store_true”,help=“overwrite existing output file,如果适用”)
args=parser.parse_args()
args.show_silence=args.show_silence或args.detect_only
如果不是args.detect_only而不是args.overwrite:
如果os.path.isfile(args.output):
打印(f“输出文件({args.Output})已存在。请使用--overwrite覆盖现有文件。”)
系统出口(1)
if(args.silence_dur<0):引发异常(“最大静默持续时间必须大于等于0.0”)
if(args.non_silence_dur<0):引发异常(“最小非静默持续时间必须大于等于0.0”)
尝试:
从scipy.io导入wavfile
使用_scipy=True
除:
if args.verbose:print(“使用'import scipy.io.wavfile'失败。改用'import wave'”)
输入波
使用_scipy=False
if args.verbose:print(f“输入:\n输入文件:{args.Input}\n输出文件:{args.Output}\n最大静默持续时间:{args.Silence\u dur}\n最小非静默持续时间:{args.Non_Silence\u dur}”)
从matplotlib导入pyplot作为plt
def绘图(x):
plt.图()
plt.绘图(x,'o')
plt.show()
通道(通道)的def阈值:
全球数据
nbins=100
max_len=min(1024*1024*100,data.shape[0])#限制到前100个MiB
如果len(数据形状)>1:
x=np.abs(数据[:max_len,ch]*1.0)
其他:
x=np.abs(数据[:最大长度]*1.0)
如果data.dtype==np.uint8:x-=127
历史,边缘=np。直方图(x,箱子=nbins,密度=真)
斜率=np.abs