天天看点

Sox音频处理简介SoX 音频处理简介

SoX 音频处理简介

SoX(即 Sound eXchange)是一个音频处理工具,支持跨平台(Windows,Linux,MacOS 等)命令行的实用程序,可以将各种格式的音频文件转换为需要的其他格式。SoX 还可以对输入的音频文件应用各种效果,也支持在大多数平台上播放和录制音频文件。此外Sox支持自写API插件使用。

简介

SoX 支持读取和写入常见格式的音频文件,并在此过程中选择性的加入一些声音效果。

它可以组合多个输入源及合成音效,在许多系统上也可以作为音频播放器或多轨录音机使用。

SoX 工具在大部分 Linux 系统上可以直接通过软件包管理器安装,命令如下:

sudo apt-get install sox

Mac 系统上则可以使用安装命令如下:

brew install sox

安装成功后,使用命令:

play [infile_path]

即可播放音频,但注意sox支持的音频格式有限。

soxi [infile_path]

即可查看音频文件信息。

SoX 工具的所有功能都可以通过一个简单的 sox 命令及相应的选项实现。但它同时提供了 play 命令用于播放音频文件,rec 命令用于录制音频,以及 soxi 命令用于获取音频的文件头中包含的信息。终端使用sox命令可创建音频效果器链。

sox可使用的场景包括但不限于:

1.更改声道

2.更改音量

3.截取音频

4.拼接音频

5.合成音频

6.静音效果

7.混合音频

8.改变播放速度

一.基本使用

1.1 获取音频信息

soxi 或 sox --i 命令可以通过分析音频文件的文件头,获取其元数据(如通道数、采样率、编码等)。

soxi C_120.wav

Sox音频处理简介SoX 音频处理简介

soxi可支持所有命令如下:

$ soxi
Usage: soxi [-V[level]] [-T] [-t|-r|-c|-s|-d|-D|-b|-B|-p|-e|-a] infile1 ...

-t  Show detected file-type
-r  Show sample-rate
-c  Show number of channels
-s  Show number of samples (0 if unavailable)
-d  Show duration in hours, minutes and seconds (0 if unavailable)
-D  Show duration in seconds (0 if unavailable)
-b  Show number of bits per sample (0 if not applicable)
-B  Show the bitrate averaged over the whole file (0 if unavailable)
-p  Show estimated sample precision in bits
-e  Show the name of the audio encoding
-a  Show file comments (annotations) if available
           

1.2 播放与录制

play 和 rec 命令提供了最基本的播放和录制功能。

播放:$ play xxx.wav

录制:$ rec xxx.wav

其中 -d 选项用于指定播放或录制时使用的音频设备,不指定时则表示使用默认设备。

使用play命令时注意sox支持的音频格式有限;

trim 效果可以从音频文件中裁剪提取指定的片段到输出文件。

代表截取10s~15s的音频数据。

二 . 音频效果器使用

2.1 使用方法

音频效果器渲染流文件实时播放(以phase效果器为例):

play xxx.wav phaser 0.8 0.74 3 0.4 0.5 -t
           

不同效果器参数详情参考官方文档。

音频效果器渲染后输出新的音频文件:

sox in_file.wav out_file.wav phaser 0.8 0.74 3 0.4 0.5 -t
           

sox支持不同音频效果器叠加;

2.2 滤波器类

sox支持滤波器类音频效果器如下:

allpass: RBJ all-pass biquad IIR filter

bandpass: RBJ band-pass biquad IIR filter

bandreject: RBJ band-reject biquad IIR filter

band: SPKit resonator band-pass IIR filter

bass: Tone control: RBJ shelving biquad IIR filter

equalizer: RBJ peaking equalisation biquad IIR filter

firfit+: FFT convolution FIR filter using given freq. response (W.I.P.)

highpass: High-pass filter: Single pole or RBJ biquad IIR

hilbert: Hilbert transform filter (90 degrees phase shift)

lowpass: Low-pass filter: single pole or RBJ biquad IIR

sinc: Sinc-windowed low/high-pass/band-pass/reject FIR

treble: Tone control: RBJ shelving biquad IIR filter

2.3 合成效果器

sox支持合成类音频音效如下:

chorus: Make a single instrument sound like many

delay: Delay one or more channels

echo: Add an echo

echos: Add a sequence of echos

flanger: Stereo flanger

overdrive: Non-linear distortion

phaser: Phase shifter

repeat: Loop the audio a number of times

reverb: Add reverberation

reverse: Reverse the audio (to search for Satanic messages 😉

tremolo: Sinusoidal volume modulation

2.4 音量效果器

sox支持音量类效果如下:

compand: Signal level compression/expansion/limiting

contrast: Phase contrast volume enhancement

dcshift: Apply or remove DC offset

fade: Apply a fade-in and/or fade-out to the audio

gain: Apply gain or attenuation; normalise/equalise/balance/headroom

loudness: Gain control with ISO 226 loudness compensation

mcompand: Multi-band compression/expansion/limiting

norm: Normalise to 0dB (or other)

vol: Adjust audio volume

2.5 剪辑效果器

sox提供音频编辑效果,主要是添加、删除一类的功能,如下:

pad: Pad (usually) the ends of the audio with silence

silence: Remove portions of silence from the audio

splice: Perform the equivalent of a cross-faded tape splice

trim: Cuts portions out of the audio

vad: Voice activity detector

2.6 混音效果器

sox提供混音类效果器如下:

channels: Auto mix or duplicate to change number of channels

divide+: Divide sample values by those in the 1st channel (W.I.P.)

remix: Produce arbitrarily mixed output channels

swap: Swap stereo channels

2.7 节奏和音高效果器

sox提供节奏和音高修正功能,如下:

bend: Bend pitch at given times without changing tempo

pitch: Adjust pitch (= key) without changing tempo

speed: Adjust pitch & tempo together

stretch: Adjust tempo without changing pitch (simple alg.)

tempo: Adjust tempo without changing pitch (WSOLA alg.)

2.8 主线路效果器

sox还支持信噪比提升,采样率更改。

dither: Add dither noise to increase quantisation SNR

rate: Change audio sampling rate

2.9 特殊效果器

sox提供了一些特殊效果器玩法:

deemph: ISO 908 CD de-emphasis (shelving) IIR filter

earwax: Process CD audio to best effect for headphone use

noisered: Filter out noise from the audio

oops: Out Of Phase Stereo (or

Karaoke

) effect

riaa: RIAA vinyl playback equalisation

2.10 其他

这里我关注比较多的是sox提供的降噪功能。

noiseprof: Produce a DFT profile of the audio (use with noisered)

spectrogram: graph signal level vs. frequency & time (needs

libpng

)

stat: Enumerate audio peak & RMS levels, approx. freq., etc.

stats: Multichannel aware

stat

ladspa: Apply LADSPA plug-in effects e.g. CMT (Computer Music Toolkit)

synth: Synthesise/modulate audio tones or noise signals

newfile: Create a new output file when an effects chain ends.

restart: Restart 1st effects chain when multiple chains exist

biquad: 2nd-order IIR filter using externally provided coefficients

downsample: Reduce sample rate by discarding samples

fir: FFT convolution FIR filter using externally provided coefficients

upsample: Increase sample rate by zero stuffing

三.API的使用

sox支持自主创建API,使用流程如下:

在使用SOX库之前,须初始化整个库的全局参数,如下:

退出SOX则需要调用如下代码:

如果没有调用sox_quit方法,那么不可以再一次调用sox_init,否则会Crash。

第二步初始化输入文件,代码如下:

sox_format_t* in;
const char* in_path = "/your_file_path/input.wav";
in = sox_open_read(in_path,NULL,NULL,NULL);
           

初始化输出文件,代码如下:

sox_format_t* out;
const char* out_path = "/your_save_path/output.wav";
out = sox_open_write(out_path,&in->signal,NULL,NULL,NULL,NULL);
           

sox使用类似责任链设计模式的方式设计整个系统,所以使用时需要先构造一下效果器链,然后将使用的效果器一个一个加到这个效果链中。先来构造这个效果器链,代码如下:

sox_effects_chain_t* chain;
chain = sox_create_chain(&in->encoding , &out->encoding);
           

先来构建一下输入数据的效果器:

sox_effect_t* inputEffect;
inputEffect = sox_create_cffect(sox_find_effect("input"));
           

上述代码构造了一个输入数据的效果器,接下来吧参数添加进效果器,代码如下:

char* args[10];
args[0] = (char*)in;
sox_effect_options(inputEffect,1,args) //参数:效果器,参数个数,具体参数
           

目前已经给inputEffect效果器配置好了需要的参数,然后要将这个效果器增加到效果器链中,并将这个效果器释放掉,代码如下:

sox_add_effect(chain,inputEffect,&in->signal,&in->signal);
free(inputEffect);
           

接下来在加入一个增加音量的效果器,添加代码如下:

sox_effect_t*  volumeEffect;
volumeEffect = sox_create_cffect(sox_find_effect("vol"));
args[0] = "20db";
sox_effect_options(volumeEffect,1,args) ;
sox_add_effect(chain,volumeEffect,&in->signal,&in->signal);
free(volumeEffect);
           

接下来添加一个输出数据的效果器,代码如下:

sox_effect_t*  outputEffect;
outputEffect = sox_create_cffect(sox_find_effect("output"));
args[0] = (char*)out;
sox_effect_options(outputEffect,1,args) ;
sox_add_effect(chain,outputEffect,&in->signal,&in->signal);
free(outputEffect);
           

完整效果器链:

input.wav—>inputEffect---->volumeEffect----->outputEffect---->output.wav

接下来运行起效果器:

处理完后就要销毁这个效果器链了:

sox_delete_effects_chain(chain);
sox_close(out);
sox_close(in);
sox_quit();
           

至此分析完所有的代码,官方给出的API使用完整代码如下:

#include "sox.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

int main(int argc, char * argv[])
{
  static sox_format_t * in, * out; 
  sox_effects_chain_t * chain;
  sox_effect_t * e;
  char * args[10];
  
  assert(argc == 3);
  assert(sox_init() == SOX_SUCCESS);
  assert((in = sox_open_read(argv[1], NULL, NULL, NULL)));
  
   * file characteristics */
  assert((out = sox_open_write(argv[2], &in->signal, NULL, NULL, NULL, NULL)));

  /* Create an effects chain */
  chain = sox_create_effects_chain(&in->encoding, &out->encoding);
  e = sox_create_effect(sox_find_effect("input"));
  args[0] = (char *)in, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
  assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
  free(e);

  /* Create the `vol' effect */
  e = sox_create_effect(sox_find_effect("vol"));
  args[0] = "3dB", assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
  assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
  free(e);

  /* Create the `flanger' effect */
  e = sox_create_effect(sox_find_effect("flanger"));
  assert(sox_effect_options(e, 0, NULL) == SOX_SUCCESS);
  assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
  free(e);

  /* data to an audio file */
  e = sox_create_effect(sox_find_effect("output"));
  args[0] = (char *)out, assert(sox_effect_options(e, 1, args) == SOX_SUCCESS);
  assert(sox_add_effect(chain, e, &in->signal, &in->signal) == SOX_SUCCESS);
  free(e);

  sox_flow_effects(chain, NULL, NULL);

  /* All done; tidy up: */
  sox_delete_effects_chain(chain);
  sox_close(out);
  sox_close(in);
  sox_quit();
  return 0;
}
           

自用时候可以去掉一些assert函数。

总结

sox整体给我感觉侧重音频效果器实现,因此在使用过程中经常和ffmpeg一起配合使用。sox实现音频效果器快速。sox在bash栏中可快速处理音频效果,并且支持了自己设计API使用。

更多的信息参考sox官网。

继续阅读