You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求实现指定流程的44.1kHz/16位单声道音频特征提取

Python实现音频特征提取方案

依赖安装

pip install librosa numpy

完整代码实现

import numpy as np
import librosa

def process_audio(input_path):
    # 1. 加载单声道44.1kHz WAV文件
    # 自动将16位整数样本转换为[-1, 1]范围的浮点数
    y, sr = librosa.load(input_path, sr=44100, mono=True)
    
    # 2. 归一化处理(确保振幅严格落在[-1, 1]区间)
    y_normalized = librosa.util.normalize(y)
    
    # 3. 开头填充0.25秒静音
    silence_samples = int(0.25 * sr)
    y_padded = np.concatenate([np.zeros(silence_samples), y_normalized])
    
    # 4. 计算对数功率谱
    n_fft = 2048  # 指定窗口大小
    hop_length = int(sr / 100)  # 100Hz帧率对应步长
    # 计算短时傅里叶变换
    stft = librosa.stft(y_padded, n_fft=n_fft, hop_length=hop_length, window='hann')
    # 转换为功率谱(幅度平方)
    power_spec = np.abs(stft) ** 2
    # 对数转换,添加小值避免log(0)报错
    log_power_spec = np.log10(power_spec + 1e-10)
    
    # 5. 创建对数刻度三角滤波器组
    # 覆盖20Hz-20000Hz,生成84个三角滤波器(每八度12个)
    mel_filters = librosa.filters.mel(
        sr=sr,
        n_fft=n_fft,
        fmin=20,
        fmax=20000,
        n_mels=84
    )
    
    # 6. 滤波得到最终特征
    final_features = np.dot(mel_filters, power_spec)
    # 再次对数转换,匹配听觉特性
    final_log_features = np.log10(final_features + 1e-10)
    
    return final_log_features, sr

# 示例调用
if __name__ == "__main__":
    features, sr = process_audio("input.wav")
    # 保存特征到本地
    np.save("audio_features.npy", features)
    print(f"处理完成,特征形状:{features.shape}")
    print(f"帧率:100Hz,频率bin数量:84")

关键步骤说明

  • 归一化:librosa.util.normalize统一音频振幅范围,消除不同输入的音量差异。
  • 静音填充:计算0.25秒对应的样本数(11025),在音频头部拼接全零数组,避免起始点检测出现在文件最前端。
  • STFT参数:窗口大小2048,步长441(44100/100),确保每10ms输出一帧特征,符合100Hz帧率要求。
  • 三角滤波器组:librosa.filters.mel生成的滤波器为三角形状,基于mel尺度(近似对数频率刻度),刚好满足每八度12个滤波器的要求(84个bin对应7个八度,完整覆盖20Hz-20000Hz)。
  • 对数转换:添加1e-10避免数值错误,同时将功率谱转换为对数刻度,贴合人耳听觉感知规律。

输出验证

  • 特征形状为(84, N),其中N为总帧数,计算公式为N = (len(y_padded) - n_fft) // hop_length + 1,完全匹配100Hz帧率。
  • 可通过以下代码可视化特征:
import matplotlib.pyplot as plt
librosa.display.specshow(final_log_features, sr=sr, hop_length=hop_length, x_axis='time', y_axis='mel', fmin=20, fmax=20000)
plt.colorbar(format='%+2.0f dB')
plt.title('Log Mel Spectrogram')
plt.show()

内容的提问来源于stack exchange,提问作者Rolando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 12:50:50