当前位置:主页 > 查看内容

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

发布时间:2021-07-08 00:00| 位朋友查看

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

经过上文音频知识一的数模转换介绍,我们了解,模拟信号转换为数字信号就称为数模转换,需要进行的步骤:采样,量化,编码。其中编码部分音频裸就是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
wget https://codeload.github.com/kn007/silk-v3-decoder/zip/master

编译

cd silk-v3-decoder-master
cd silk
make

(3) 使用

#  权限
sudo chmod +x converter.sh

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

sh converter.sh ./input ./output wav

单个silk文件转wav

sh converter.sh 2.slik wav

pcm转wav

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

pcm转wav代码:

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,是一个有损图像的压缩格式),从而达到了压缩成小得多的文件大小。

def conv_mp32wav(flac_path,save_path):
    sound = AudioSegment.from_mp3(flac_path)
    sound.export(save_path, format="wav")

flac转wav

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

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

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

#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)

本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐