在音频处理领域,音频数据的格式对后续的分析和处理至关重要。常见的音频格式包括16位整数和32位浮点数。本文将介绍如何正确处理这两种格式的音频数据,包括使用 scipy.io.wavfile
读取音频、使用 librosa
进行处理,以及使用 soundfile
(sf
)写入音频文件。
1. 16位整数音频

1.1 读取音频
16位整数音频通常以 int16
格式存储。使用 scipy.io.wavfile
读取音频文件时,返回的数据类型为 numpy.int16
。
python
import numpy as np
from scipy.io import wavfile
# 读取 WAV 文件
sample_rate, audio_data = wavfile.read('your_audio_file_16bit.wav')
# 打印数据类型和范围
print(f'Data type: {audio_data.dtype}')
print(f'Data range: {audio_data.min()} to {audio_data.max()}')
1.2 处理音频
在使用 librosa
处理音频数据之前,需要将16位整数数据转换为浮点数格式,并归一化到 [-1, 1] 的范围。
python
import librosa
# 如果数据是整数格式(例如 int16),则需要归一化
if audio_data.dtype == np.int16:
audio_data = audio_data.astype(np.float32) / 32768.0 # 归一化到 [-1, 1]
# 使用 librosa 进行处理
audio_data_processed = librosa.effects.preemphasis(audio_data)
1.3 写入音频
使用 soundfile
库将处理后的音频数据写入文件时,需要将浮点数数据转换回16位整数格式(如果需要)。
python
import soundfile as sf
# 将浮点数数据转换为 int16
audio_data_int16 = (audio_data_processed * 32768).astype(np.int16)
# 写入 WAV 文件
sf.write('output_16bit.wav', audio_data_int16, sample_rate)
2. 32位浮点音频

2.1 读取音频
32位浮点音频通常以 float32
格式存储。使用 scipy.io.wavfile
读取音频文件时,返回的数据类型为 numpy.float32
。
python
# 读取 WAV 文件
sample_rate, audio_data = wavfile.read('your_audio_file_32bit.wav')
# 打印数据类型和范围
print(f'Data type: {audio_data.dtype}')
print(f'Data range: {audio_data.min()} to {audio_data.max()}')
2.2 处理音频
32位浮点音频数据通常已经在 [-1, 1] 的范围内,因此可以直接使用 librosa
进行处理。
python
# 使用 librosa 进行处理
audio_data_processed = librosa.effects.preemphasis(audio_data)
2.3 写入音频
使用 soundfile
库将处理后的音频数据写入文件时,可以直接写入浮点数数据。
python
# 写入 WAV 文件
sf.write('output_32bit.wav', audio_data_processed, sample_rate)