本文目录导读:

- 使用 Python + Librosa + Matplotlib
- 使用 FFmpeg 命令行实现
- 使用 SoX(Sound eXchange)
- 完整的 Python 自动化脚本
- 高级功能脚本
- 安装所需依赖
- 使用建议
是的,有一些实用脚本和工具可以自动从音频中提取频谱图,以下是几种常见的方法:
使用 Python + Librosa + Matplotlib
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
def extract_spectrogram(audio_file, output_image):
# 加载音频文件
y, sr = librosa.load(audio_file)
# 计算频谱图
D = librosa.amplitude_to_db(np.abs(librosa.stft(y)), ref=np.max)
# 绘制频谱图
plt.figure(figsize=(12, 8))
librosa.display.specshow(D, sr=sr, x_axis='time', y_axis='hz')
plt.colorbar(format='%+2.0f dB')
plt.title('Spectrogram')
plt.tight_layout()
# 保存图像
plt.savefig(output_image)
plt.close()
# 使用示例
extract_spectrogram('audio.wav', 'spectrogram.png')
使用 FFmpeg 命令行实现
# 生成频谱图 ffmpeg -i input.mp3 -lavfi showspectrumpic=s=1920x1080:mode=separate:color=rainbow output.png # 或者生成动态频谱视频 ffmpeg -i input.mp3 -filter_complex "showspectrum=color=rainbow:s=1280x720:mode=separate" -an output.mp4
使用 SoX(Sound eXchange)
# 生成频谱图 sox input.wav -n spectrogram -o output.png
完整的 Python 自动化脚本
import os
import glob
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm
def batch_extract_spectrograms(input_dir, output_dir, audio_format='*.wav'):
# 创建输出目录
os.makedirs(output_dir, exist_ok=True)
# 获取所有音频文件
audio_files = glob.glob(os.path.join(input_dir, audio_format))
for audio_file in tqdm(audio_files, desc="Extracting spectrograms"):
# 生成输出文件名
basename = os.path.splitext(os.path.basename(audio_file))[0]
output_path = os.path.join(output_dir, f"{basename}_spectrogram.png")
try:
# 加载音频
y, sr = librosa.load(audio_file, sr=None)
# 计算梅尔频谱图
mel_spec = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max)
# 绘制图像
plt.figure(figsize=(10, 4))
librosa.display.specshow(mel_spec_db, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(format='%+2.0f dB')
plt.title(f'Spectrogram - {basename}')
plt.tight_layout()
# 保存
plt.savefig(output_path, dpi=150, bbox_inches='tight')
plt.close()
except Exception as e:
print(f"Error processing {audio_file}: {e}")
# 使用示例
batch_extract_spectrograms('audio_input/', 'spectrograms_output/')
高级功能脚本
import soundfile as sf
import scipy.signal
from PIL import Image
def advanced_spectrogram(audio_file, output_path,
window_size=2048,
hop_length=512,
freq_range=None):
# 读取音频
y, sr = sf.read(audio_file)
# 如果是立体声,转为单声道
if len(y.shape) > 1:
y = np.mean(y, axis=1)
# 计算短时傅里叶变换
f, t, Zxx = scipy.signal.stft(y, sr,
nperseg=window_size,
noverlap=window_size - hop_length)
# 转换为分贝
Zxx_db = 20 * np.log10(np.abs(Zxx) + 1e-10)
# 频率范围限制
if freq_range:
freq_mask = (f >= freq_range[0]) & (f <= freq_range[1])
f = f[freq_mask]
Zxx_db = Zxx_db[freq_mask, :]
# 创建图像
plt.figure(figsize=(12, 6))
plt.pcolormesh(t, f, Zxx_db, shading='gouraud', cmap='viridis')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.title(f'Spectrogram - {os.path.basename(audio_file)}')
plt.colorbar(label='Intensity [dB]')
plt.tight_layout()
plt.savefig(output_path, dpi=200)
plt.close()
# 使用示例
advanced_spectrogram('speech.wav', 'advanced_spectrogram.png',
freq_range=(20, 8000))
安装所需依赖
# Python 包 pip install librosa matplotlib numpy scipy soundfile tqdm # 系统工具(根据操作系统) # Ubuntu/Debian: sudo apt-get install ffmpeg sox # macOS: brew install ffmpeg sox # Windows: 下载安装包或使用 Chocolatey choco install ffmpeg sox
使用建议
- 批量处理:使用第4个脚本处理大量音频文件
- 参数调整:根据需求调整
window_size、hop_length、freq_range等参数 - 图像优化:调整
dpi、figure size控制输出质量 - 并行处理:对于大量文件,可以添加多线程支持
这些脚本都能自动完成频谱图提取,选择哪种取决于你的具体需求和使用环境。