如何用FFmpeg给WAV音频首尾添加静音以扩展时长?
给现有音频首尾添加指定时长静音
要为a.wav首尾各添加1.945秒静音,直接用FFmpeg的concat滤镜结合anullsrc生成静音即可,无需单独生成中间文件:
1. 匹配原音频参数
静音的采样率、通道数必须和原音频一致,执行以下命令获取参数:
ffprobe -v error -select_streams a:0 -show_entries stream=sample_rate,channels -of csv=p=0 a.wav
输出类似44100,1,代表44100Hz采样率、单通道。
2. 执行拼接命令
把获取到的参数代入,以44100Hz单通道为例:
ffmpeg -i a.wav -f lavfi -i "anullsrc=channel_layout=mono:sample_rate=44100:d=1.945" -filter_complex "[1:a][0:a][1:a]concat=n=3:v=0:a=1" extended_a.wav
[1:a]是生成的静音段,[0:a]是原音频,concat=n=3按「静音→原音频→静音」顺序拼接- 最终输出时长为
1.945+9.432+1.945=13.322秒,和目标13.321秒的误差是浮点计算导致,可忽略。
结合srt/vtt字幕生成TTS完整语音
FFmpeg本身不具备TTS生成能力,但可以配合外部TTS工具(如eSpeak、自定义AI模型)生成的音频片段,按照字幕时间轴拼接成完整音频,流程如下:
1. 解析字幕时间轴
从srt/vtt中提取每个字幕的开始时间、结束时间、文本内容,计算出:
- 开头静音时长(从0到第一个字幕的开始时间)
- 每个字幕的时长(结束时间-开始时间)
- 字幕间的间隔静音时长(下一个字幕开始时间-上一个字幕结束时间)
- 结尾静音时长(可选)
2. 生成并调整TTS片段
用TTS工具将每个字幕文本转为音频,若TTS时长和字幕时长不匹配,用FFmpeg调整:
- 变速(范围0.5-2.0,超范围可叠加多个
atempo):ffmpeg -i clip1.wav -filter:a "atempo=1.2" adjusted_clip1.wav - 补静音(比如给片段补0.3秒静音):
ffmpeg -i clip1.wav -f lavfi -i "anullsrc=channel_layout=mono:sample_rate=44100:d=0.3" -filter_complex "[0:a][1:a]concat=n=2:v=0:a=1" adjusted_clip1.wav
3. 拼接所有片段
如果片段不多,直接用concat滤镜拼接:
ffmpeg -f lavfi -i "anullsrc=channel_layout=mono:sample_rate=44100:d=1" -i adjusted_clip1.wav -f lavfi -i "anullsrc=channel_layout=mono:sample_rate=44100:d=1.5" -i adjusted_clip2.wav -filter_complex "[0:a][1:a][2:a][3:a]concat=n=4:v=0:a=1" full_tts_audio.wav
片段较多的话,用文件列表更方便:
- 创建
audio_list.txt:
file 'silence_start.wav' file 'adjusted_clip1.wav' file 'silence_gap.wav' file 'adjusted_clip2.wav' file 'silence_end.wav'
- 执行拼接:
ffmpeg -f concat -safe 0 -i audio_list.txt -c copy full_tts_audio.wav
内容的提问来源于stack exchange,提问作者Furkan Gözükara
相关产品推荐
相关产品推荐

