本文目录导读:

- 使用 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控制输出质量 - 并行处理:对于大量文件,可以添加多线程支持
这些脚本都能自动完成频谱图提取,选择哪种取决于你的具体需求和使用环境。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播