音频知识(四)--格式转换

2021-07-05 20:24:25 浏览数 (1)

经过上文音频知识一的数模转换介绍,我们了解,模拟信号转换为数字信号就称为数模转换,需要进行的步骤:采样,量化,编码。其中编码部分音频裸就是pcm数据,而编码时如果通过不同的算法,就被保存为不同的格式,比如wav,mp3等等。

在我们后续的AI算法中,通常会统一音频文件的采样率,文件格式等,方便模型训练。因为wav是最常见的一种格式,所以今天主要介绍各种格式转换为wav的方法。

WAV:是微软公司专门为Windows开发的一种标准数字音频文件。wav是一种无损的音频文件格式,WAV符合 PIFF(Resource Interchange File Format)规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有支持ACM规范的编码都可以为WAV的音频流进行编码。

silk转wav

SILK是一个Skype Limited开发的音频压缩格式和音频编解码器。已被扩展为互联网标准Opus的编解码器。

silk的优势主要是压缩率高,便于网络传输,在实时通信服务中非常实用,可以有效降低带宽负载,减少延迟。

silk转wav的步骤:

  1. 安装ffmpeg

pip install ffmpeg

  1. 安装silk-v3-decoder
代码语言:javascript复制
wget https://codeload.github.com/kn007/silk-v3-decoder/zip/master

编译

代码语言:javascript复制
cd silk-v3-decoder-master
cd silk
make

(3) 使用

代码语言:javascript复制
#  权限
sudo chmod  x converter.sh

input文件夹内的silk文件转wav到output文件夹

代码语言:javascript复制
sh converter.sh ./input ./output wav

单个silk文件转wav

代码语言:javascript复制
sh converter.sh 2.slik wav

pcm转wav

PCM:PCM信号是未经过任何编码和压缩处理的数据。

pcm转wav代码:

代码语言:javascript复制
def conv_pcm2wav(pcm_path,save_path):
    with open(pcm_path, 'rb') as pcmfile:
         pcmdata = pcmfile.read()
     with wave.open(save_path, 'wb') as wavfile:
         #nchannels, sampwidth, framerate, nframes
         wavfile.setparams((1, 2, _sample_rate, 0, 'NONE', 'NONE'))
         wavfile.writeframes(pcmdata)

mp3转wav

MP3是一个数据压缩格式。它舍弃脉冲编码调制(PCM)音频数据中,对人类听觉不重要的数据(类似于JPEG,是一个有损图像的压缩格式),从而达到了压缩成小得多的文件大小。

代码语言:javascript复制
def conv_mp32wav(flac_path,save_path):
    sound = AudioSegment.from_mp3(flac_path)
    sound.export(save_path, format="wav")

flac转wav

FLAC与MP3相仿,但是是无损压缩的,也就是说音频以FLAC方式压缩不会丢失任何信息.

代码语言:javascript复制
def conv_flac2wav(flac_path,save_path):
    flac_data, sr = sf.read(flac_path, dtype='int16')
    print("conv_flac2wav", flac_data.shape, sr)
    if len(flac_data.shape) > 1:
        flac_data = np.max(flac_data, axis=1)
    if sr != _sample_rate:
        flac_data = resampy.resample(flac_data, sr, _sample_rate)
        wavfile.write(save_path, _sample_rate, flac_data)

wav转wav

这里主要是为了统一采样率。

代码语言:javascript复制
#resample
def conv_wav2wav(wav_path,save_path):
    wf = wave.open(wav_path, 'rb')
    params = wf.getparams()
    nchannels, sampwidth, framerate, nframes = params:4
    print("conv_wav2wav",nchannels, sampwidth, framerate, nframes)
    data = wf.readframes(nframes)
    data = np.fromstring(data, dtype=np.int16)
    if nchannels > 1:
        data = np.reshape(data, -1, nchannels)
        data = np.max(data, axis=1)
    if framerate!=_sample_rate:
    data = resampy.resample(data, framerate, _sample_rate)
 print("resample",framerate, _sample_rate)
 wavfile.write(save_path, _sample_rate, data)

0 人点赞