经过上文音频知识一的数模转换介绍,我们了解,模拟信号转换为数字信号就称为数模转换,需要进行的步骤:采样,量化,编码。其中编码部分音频裸就是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的步骤:
- 安装ffmpeg
pip install ffmpeg
- 安装silk-v3-decoder
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)