参考
sox常见操作:https://www.cnblogs.com/zhuminghui/p/11971311.html
sox API:http://manpages.ubuntu.com/manpages/bionic/man1/sox.1.html
sox说明:http://sox.sourceforge.net/sox.html
wav头格式说明(.pdf):链接: https://pan.baidu.com/s/10J2kb0hJmgQMFv7fxqUrEA,提取码: 6sp3
sox使用
sox 安装
sudo apt-get install sox # ubuntu
sudo apt-get install sox # Linux
brew install sox # Mac 系统
查看信息 (soxi)
soxi a.wav
# or
sox a.wav -n stat
播放音频 (play)
play a.mp3
音频操作 (sox)
提取通道 (remix)
# 对a.mp3提取左右通道,保存文件为a
sox a.mp3 a_left.wav remix 1
sox a.mp3 a_right.wav remix 2
# 如一个文件有第三通道
sox a.mp3 a_thirdchannel.wav remix 3
改变音量 (-v)
sox -v 5 a.wav a_v5.wav
当不确定方法多少倍,即放大到最大倍数却不截波时:
# 以 sox foo.wav -n stat -v 命令返回的数字作为放大倍数,将最大化 foo.wav 的音量而不至于出现削波
sox foo.wav -n stat -v 2> vc
sox -v `cat vc` foo.wav foo-maxed.wav
改变采样率 (-r)
# 48000 变为 16000
sox a.wav -r 16000 a_16k.wav
pcm 转 wav (-t -c -e -b -r)
给pcm添加wav头,即将pcm转为wav,即将以二进制存储的文件按照一定格式解析,如通道数、比特率、采样率等
sox -t raw -c 3 -e signed-integer -b 16 -r 16000 a.pcm a.wav
注:pcm的编码格式可选择不同格式,根据官方说明16-bit encoding size的应该是signed-integer,具体可参考官方说明:http://manpages.ubuntu.com/manpages/bionic/man1/sox.1.html
加混响 (reverb)
sox a.wav a_reverb.wav reverb
# or 指定混响参数
sox song.wav song_reverb.wav reverb 50 50 90 50 30
混响参数依次为:
1)reverbrance,即余响的大小,如设置为50;
2)HF-damping,即高频阻尼,如设置为50;
3)room-scale,即房间大小,如设置为90,代表一个比较大的房间;
4)立体声深度,设置越大则代表立体声效果越明显,如设置为50;
5)pre-delay,即早反射声的时间,单位是毫秒,如设置为30毫秒。
执行完以上命令,读者听一下处理完的声音,会发现有一个比较明显的混响效果了。
录制音频 (rec)
rec newfile.wav # 录制
默认为以录音设备的参数进行录制,如可能是44100的采样率,通道数为2,可设置为我们想要的录制参数进行录制:
e.g., 通道数:1,采样率16000,时长:5分钟
rec -c 1 -r 16000 -b 16 -e signed-integer recording.wav trim 0 5:00
sox其它功能
mp3转换为wav
faad使用
faad安装
sudo apt-get install faad # ubuntu
faad:aac转wav
可将.aac文件转为 .wav文件(sox无法解析aac文件):
faad -o output.wav input.aac
ffmpeg 使用
ffmpeg主要处理视频(.avi, .mp4)
ref:http://ffmpeg.org/ffmpeg.html
https://blog.csdn.net/wenmingzheng/article/details/88373192
ffmpeg安装
sudo apt-get install ffmpeg
mp4 转 avi:
ffmpeg -i input.mp4 output.avi
wav 转 pcm
ref: https://blog.csdn.net/tang_chuanlin/article/details/94014439
ffmpeg -i input.wav -f s16be -ar 16000 -ac 1 -acodec pcm_s16be output.pcm
实际使用示例
1. input: .pcm,output: .wav(三个channels)
步骤:1)pcm-> wav, 2) remix 提取通道。 ps:使用了find和exec命令。
path=/tmp/record/
find $path -name *.pcm -exec sox -t raw -c 3 -e signed-integer -b 16 -r 16000 {} {}.wav \;
find $path -name *.pcm.wav -exec sox {} {}_TALK.wav remix 1 \;
find $path -name *.pcm.wav -exec sox {} {}_FF.wav remix 2 \;
find $path -name *.pcm.wav -exec sox {} {}_BF.wav remix 3 \;
find $path -name *.pcm.wav_*.wav > filelist.txt
2. input: .aac,output: .wav(右通道)
步骤:1)faad:aac-> wav, 2) sox:修改采样率到16k,3)sox remix :提取通道。
path=/tmp/20200819
# 预处理:删除文件名中空格
find $path -name '* *' -exec rename 's/ //g' {} \;
#faad: aac -> wav
find $path -name "*.aac" -exec faad {} -o {}.wav \;
# sox: change sample rate and derive 2rd channel
find $path -name "*.aac.wav" -exec sox {} -r 16k {}_16k.wav \;
find $path -name "*.aac.wav_16k.wav" -exec sox {} {}_right.wav remix 2 \;
# create filelist.txt
find $path -name "*.aac.wav_16k.wav_right.wav" > filelist_2.txt
# copy files to other folder
find $path -name "*.aac.wav_16k.wav_right.wav" -exec cp {} ./testdata/2{} \;
3. 连续循环录制音频,并将录制音频送入我们想要的处理程序
fileid=1
fileid_interval=1
while true
do
filename=recording_$fileid.wav
rec -c 1 -r 16000 -b 16 -e signed-integer $filename trim 0 5:00
sudo xxx.bin $filename
fileid=$(expr $fileid + $fileid_interval)
done
然后再sh xx.sh即可运行(xx.sh即该shell文件名)。xxx.bin即为我们想要送入的程序(需带文件路径)。文件名以累增1的方式生成。
ref:
加减乘除的运算法则可参考https://blog.csdn.net/CosmopolitanMe/article/details/87607489
linux下编写shell的while语句可参考https://www.cnblogs.com/ghostwu/p/9114660.html
4. 将所有wav文件音量增到最大(最大音量的0.707且不截波)
shell下的条件判断、字符串拼接、判断文件是否存在等参考:
https://blog.csdn.net/u010637291/article/details/106420453
path=/tmp/model/work/recordings
filelist=filelist.txt
fileid=1
fileid_interval=1
fileid_max=700
while [ $fileid -lt $fileid_max ] #true
do
filename=${path}/recording_$fileid.wav
filename_maxed=${filename}_our_maxed.wav
if [ -f $filename ];then
echo $filename_maxed >> $filelist
else
echo "文件不存在:"${filename}
fileid=$(expr $fileid + $fileid_interval)
continue
fi
sox $filename -n stat -v 2> vc
vol_max=$(cat vc)
vol_our=$(echo "$vol_max*0.707"|bc)
sox -v $vol_our $filename $filename_maxed
sudo ./test_c_main_20200903.bin $filename_maxed
fileid=$(expr $fileid + $fileid_interval)
done
5. Matlab中随机挑选wav文件,并使其音量增到最大,最后进行合并。
file_dir = '/tmp/wav_snr';
snr_dir = {'snr22', 'snr17', '/snr12', 'snr7', 'snr2'};
file_num = 200;
for snr_id = 1:length(snr_dir)
y_concat = [];
file_snr_dir = [file_dir, '/', snr_dir{snr_id}, '/xatx'];
filelist_wav = dir(fullfile(file_snr_dir,'*/*.wav'));
random_files_ids = randperm(size(filelist_wav, 1), file_num);
for rn_fl_id = 1:file_num
file_wav = filelist_wav(random_files_ids(rn_fl_id));
file_wav_name = [file_wav.folder, '/', file_wav.name];
file_wav_name_max = [file_wav_name, '_max.wav'];
%% matlab run sox !!!
system_command = ['sox ', file_wav_name, ' -n stat -v 2> vc'];
system(system_command);
system_command = ['sox -v `cat vc` ', file_wav_name, ' ', file_wav_name_max];
system(system_command);
%%%%%%%%
[y, fs] = audioread(file_wav_name_max);
y_concat = vertcat(y_concat, y);
system_command = ['rm -rf ', file_wav_name_max];
system(system_command);
end
audiowrite([file_dir, '/', snr_dir{snr_id}, '_xatx_concat200.wav'], y_concat, fs);
disp('concat successfully');
end
WAV头格式
文档:链接: https://pan.baidu.com/s/10J2kb0hJmgQMFv7fxqUrEA,提取码: 6sp3
了解wav格式的文件的编码格式,很重要。wav相对于pcm文件,相当于多了一个wav头。