1. pcm转wav
ffmpeg -f s16le -ar 16k -ac 1 -i input.pcm output.wav
-f format 可以用-formats查看支持的格式,s16le代表pcm16位有符号小端存储
-ar audio rate 采样率,单位是Hz,每秒的采样数
-ac audio channel数,一般默认是1
-i 输入
2. wav转pcm
ffmpeg -i input.wav -f s16le -ar 48000 -ac 1 -acodec pcm_s16le output.pcm
-acodec 编码器格式
3. wav重采样
ffmpeg -i input.wav -ar 48000 output.wav
4. 把两个单通道的wav合成一个双通道的wav
ffmpeg -i left.wav -i right.wav -filter_complex "[0]apad[FL];[FL][1]amerge[aout]" -map "[aout]" out.wav
滤镜查询地址 https://ffmpeg.org/ffmpeg-filters.html
-filter_complex 后面加一个滤镜
apad 静音填充 输入[0]静音填充输出为[FL]
amerge 两个或多个音频合并为一个多声道流 [FL][0]合成为[aout]
-map 映射输出到输出文件
5. 两个音频叠加
ffmpeg -i ${speechpath} -i ${noisepath} \
-filter_complex \
"amovie=${speechpath} [s];amovie=${noisepath} [n]; \
[s] adelay=${delay}ms [s1]; \
[n][s1]amix=inputs=2:duration=longest:dropout_transition=3:weights='${a} ${b}'" \
${outpath}
● amovie 相当于给输入重命名,否则用[0] [1]
● 分号用来把单个filter隔开,冒号分割参数
● adelay是将输入延迟
● amix用来合成
● 思路为通过三个随机数,即延迟和两个权重来进行随机控制,将语音随机延迟之后和噪声进行合成
6. 获取音频的长度,并转化为毫秒
duration=$(ffmpeg -i ${speechpath} 2>&1 \
| grep 'Duration' | cut -d ' ' -f 4 | sed s/,//)
ss=$(awk "BEGIN{print ${duration:0:2}*3600000+ \
${duration:3:2}*60000+ \
${duration:6:2}*1000+ \
${duration:9:2}*10}") #语音毫秒数
● 把ffmpeg的输出重定向,获取到Duration的行,使用cut命令用空格分开,得到第四列,把逗号删除掉
● 毫秒数直接用awk来计算
7. 干掉音频前后的静音部分
在处理正样本语音部分很有用
ffmpeg -i ${voicedir}/${filename} -filter_complex \
silenceremove=start_periods=1:start_duration=0.1:start_threshold=-50dB: \
stop_periods=-1:stop_duration=0.1:stop_threshold=-50dB \
${outdir}/${filename}
● start开头的一组参数是干掉音频开头小于-50dB且时长大于0.1s的静音
● stop开头的一组是干掉完开头之后,再干掉结尾小于-50dB且长度大于0.1s的静音
● stop只有在start设置了的情况下有效
8. 截取前后两部分并将后前填充0
ffmpeg -i input.wav -filter_complex "[0]atrim=0:1.05[l];[l]apad=whole_len=32000" out.wav
ffmpeg -i input.wav -filter_complex "0[atrim]=1.05:2[r];[r]adelay=1050" out.wav
● atrim 的单位是秒 支持小数
● adelay单位是ms
● apad的单位是采样数