天天看点

【音频处理】之Ubuntu sox / faad / ffmpeg 使用参考sox使用faad使用ffmpeg 使用实际使用示例WAV头格式

文章目录

  • 参考
  • sox使用
    • sox 安装
    • 查看信息 (soxi)
    • 播放音频 (play)
    • 音频操作 (sox)
      • 提取通道 (remix)
      • 改变音量 (-v)
      • 改变采样率 (-r)
      • pcm 转 wav (-t -c -e -b -r)
      • 加混响 (reverb)
    • 录制音频 (rec)
    • sox其它功能
  • faad使用
    • faad安装
    • faad:aac转wav
  • ffmpeg 使用
    • ffmpeg安装
    • mp4 转 avi:
    • wav 转 pcm
  • 实际使用示例
    • 1. input: .pcm,output: .wav(三个channels)
    • 2. input: .aac,output: .wav(右通道)
    • 3. 连续循环录制音频,并将录制音频送入我们想要的处理程序
    • 4. 将所有wav文件音量增到最大(最大音量的0.707且不截波)
    • 5. Matlab中随机挑选wav文件,并使其音量增到最大,最后进行合并。
  • WAV头格式

参考

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)

默认为以录音设备的参数进行录制,如可能是44100的采样率,通道数为2,可设置为我们想要的录制参数进行录制:

e.g., 通道数:1,采样率16000,时长:5分钟

sox其它功能

mp3转换为wav

faad使用

faad安装

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
           
【音频处理】之Ubuntu sox / faad / ffmpeg 使用参考sox使用faad使用ffmpeg 使用实际使用示例WAV头格式

实际使用示例

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头。

【音频处理】之Ubuntu sox / faad / ffmpeg 使用参考sox使用faad使用ffmpeg 使用实际使用示例WAV头格式