是否有Python代码可将MP3文件转换为含[秒数][频率]列的DataFrame?
MP3每秒频率计算Python实现
前置依赖安装
- 安装Python依赖包:
pip install pydub numpy pandas - 安装FFmpeg解码器:用于读取MP3文件,各系统可搜索对应安装教程配置,完成后即可正常调用。
完整代码
from pydub import AudioSegment import numpy as np import pandas as pd def get_second_frequency(mp3_path): # 读取MP3文件,转单声道简化计算 audio = AudioSegment.from_mp3(mp3_path).set_channels(1) sample_rate = audio.frame_rate # 取整计算总秒数 total_seconds = int(audio.duration_seconds) result = [] for sec in range(total_seconds): # 截取当前秒对应的音频片段 start_ms = sec * 1000 end_ms = (sec + 1) * 1000 current_segment = audio[start_ms:end_ms] # 音频转numpy数组格式 samples = np.array(current_segment.get_array_of_samples()) # FFT计算频率 fft_values = np.fft.fft(samples) fft_frequencies = np.fft.fftfreq(len(samples), 1/sample_rate) # 筛选正频率区间,取幅值最高的主频率 positive_mask = fft_frequencies > 0 positive_freqs = fft_frequencies[positive_mask] positive_amplitude = np.abs(fft_values[positive_mask]) dominant_freq = positive_freqs[np.argmax(positive_amplitude)] # 存入结果列表 result.append({"秒数": sec + 1, "频率": round(dominant_freq, 2)}) # 转换为DataFrame返回 return pd.DataFrame(result) # 调用示例 if __name__ == "__main__": # 替换为你的MP3文件路径 freq_df = get_second_frequency("test.mp3") print(freq_df) # 可直接导出为CSV文件 # freq_df.to_csv("每秒频率结果.csv", index=False)
补充说明
- 代码默认输出每秒的主频率(幅值最高的频率点),如果需要其他频率统计规则,可修改FFT计算部分的逻辑
- 转单声道是为了简化计算,若需要处理多声道音频,删除
set_channels(1)的调用后分别计算各声道频率即可
内容的提问来源于stack exchange,提问作者Ali Alamri
相关产品推荐
相关产品推荐

