Audio 如何使用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缩短录音中过多的沉默(缩短他们,而不是完全消除沉默)。我使用的当前代码:

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
在您的情况下的用法:

  • 将m4a转换为wav:
    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