如何将WAV文件读取为shape=(12,)的np.ndarray?
实现指导:将WAV文件转为shape=(12,)的numpy数组
问题分析
你当前读取的WAV文件是双声道音频,输出的data形状为(N, 2)(N为音频采样点数,远大于12),需要先处理声道,再将数据转换为12维的一维数组。
步骤1:将多声道转为单声道
首先把双声道音频转为单声道,可选两种方式:
- 取其中一个声道
- 对双声道数据求均值
代码示例:
from scipy.io.wavfile import read import numpy as np samplerate, data = read("./music/audio1.wav") # 方式1:取第一个声道 mono_data = data[:, 0] # 方式2:对双声道取均值 # mono_data = np.mean(data, axis=1)
步骤2:提取12维音频特征(推荐方案)
直接截取原始音频的12个采样点没有实际音频语义,推荐提取12维梅尔频率倒谱系数(MFCC),这是音频任务中常用的固定维度特征,刚好符合shape=(12,)的要求。需要使用librosa库(未安装的话执行pip install librosa)。
完整代码:
import librosa import numpy as np # 读取音频,自动转为单声道并指定采样率 y, sr = librosa.load("./music/audio1.wav", sr=44100, mono=True) # 提取12维MFCC特征,对时间轴取均值得到单条12维特征 mfcc_features = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=12) X = np.mean(mfcc_features, axis=1) print(X.shape) # 输出 (12,)
步骤3:单纯满足形状要求的备选方案
如果仅需要满足形状要求、不需要音频语义,可以直接对单声道数据进行截断或均匀采样:
# 取前12个采样点 X = mono_data[:12].flatten() # 或者从整个音频中均匀采样12个点 X = np.linspace(mono_data[0], mono_data[-1], 12) print(X.shape) # 输出 (12,)
内容的提问来源于stack exchange,提问作者tyfreed
相关产品推荐
相关产品推荐

