实用脚本能自动提取音频中的频谱图?

wen 实用脚本 1

本文目录导读:

实用脚本能自动提取音频中的频谱图?

  1. 使用 Python + Librosa + Matplotlib
  2. 使用 FFmpeg 命令行实现
  3. 使用 SoX(Sound eXchange)
  4. 完整的 Python 自动化脚本
  5. 高级功能脚本
  6. 安装所需依赖
  7. 使用建议

是的,有一些实用脚本和工具可以自动从音频中提取频谱图,以下是几种常见的方法:

使用 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

使用建议

  1. 批量处理:使用第4个脚本处理大量音频文件
  2. 参数调整:根据需求调整 window_sizehop_lengthfreq_range 等参数
  3. 图像优化:调整 dpifigure size 控制输出质量
  4. 并行处理:对于大量文件,可以添加多线程支持

这些脚本都能自动完成频谱图提取,选择哪种取决于你的具体需求和使用环境。

抱歉,评论功能暂时关闭!