【音频处理】之Ubuntu sox / faad / ffmpeg 使用

1 篇文章 0 订阅
1 篇文章 0 订阅

参考

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毫秒。

执行完以上命令,读者听一下处理完的声音,会发现有一个比较明显的混响效果了。

ref:http://www.music-video.cn/2017/12/19/%E7%AC%AC8%E7%AB%A0-%E9%9F%B3%E9%A2%91%E6%95%88%E6%9E%9C%E5%99%A8%E7%9A%84%E4%BB%8B%E7%BB%8D%E4%B8%8E%E5%AE%9E%E8%B7%B5%E6%A0%B7%E7%AB%A0/

录制音频 (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头。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值