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

如何绘制两个WAV文件的频谱子图?颜色条设置与图幅调整

解决WAV频谱图并排展示的两个问题

一、先修正原代码的核心错误

你当前代码里有个关键问题:两个子图用的是同一个S_dB(仅对应最后加载的音频),导致两张图显示完全一样。需要分别处理两个音频的梅尔频谱:

# 处理无说话音频
y_no_speak, sr = librosa.load(FILE_NO_SPEAKING)
mel_spec_no_speak = librosa.feature.melspectrogram(y=y_no_speak, sr=sr)
S_dB_no_speak = librosa.power_to_db(mel_spec_no_speak, ref=np.max)

# 处理有说话音频
y_speak, sr = librosa.load(FILE_SPEAKING)
mel_spec_speak = librosa.feature.melspectrogram(y=y_speak, sr=sr)
S_dB_speak = librosa.power_to_db(mel_spec_speak, ref=np.max)

二、放大绘图整体尺寸

创建子图时,通过figsize参数直接设置画布宽高(数值越大,图的尺寸越大):

# 示例:宽16,高6的画布,1行2列子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))

三、配置颜色条

有两种实用方案可选:

方案1:每个子图单独配颜色条

分别为两个子图绑定颜色条,需要传入specshow返回的图像对象:

# 绘制无说话频谱图并加颜色条
img_no_speak = librosa.display.specshow(S_dB_no_speak, 
                                        x_axis='time',
                                        y_axis='mel', 
                                        sr=sr,
                                        fmax=8000, 
                                        ax=ax1)
fig.colorbar(img_no_speak, ax=ax1, format='%+2.0f dB')

# 绘制有说话频谱图并加颜色条
img_speak = librosa.display.specshow(S_dB_speak, 
                                     x_axis='time',
                                     y_axis='mel', 
                                     sr=sr,
                                     fmax=8000, 
                                     ax=ax2)
fig.colorbar(img_speak, ax=ax2, format='%+2.0f dB')

方案2:共享一个颜色条(更适合对比)

如果两个音频的分贝范围一致,共享颜色条能让对比更直观,把颜色条放在两个子图右侧:

# 绘制两个频谱图
img_no_speak = librosa.display.specshow(S_dB_no_speak, 
                                        x_axis='time',
                                        y_axis='mel', 
                                        sr=sr,
                                        fmax=8000, 
                                        ax=ax1)
img_speak = librosa.display.specshow(S_dB_speak, 
                                     x_axis='time',
                                     y_axis='mel', 
                                     sr=sr,
                                     fmax=8000, 
                                     ax=ax2)

# 绑定到两个子图,共享颜色条
fig.colorbar(img_speak, ax=[ax1, ax2], format='%+2.0f dB')

完整修正后的代码

import librosa
import librosa.display
import numpy as np
import matplotlib.pyplot as plt

# 替换为你的实际文件路径
FILE_NO_SPEAKING = "no_speaking.wav"
FILE_SPEAKING = "speaking.wav"

# 加载并处理音频
y_no_speak, sr = librosa.load(FILE_NO_SPEAKING)
mel_spec_no_speak = librosa.feature.melspectrogram(y=y_no_speak, sr=sr)
S_dB_no_speak = librosa.power_to_db(mel_spec_no_speak, ref=np.max)

y_speak, sr = librosa.load(FILE_SPEAKING)
mel_spec_speak = librosa.feature.melspectrogram(y=y_speak, sr=sr)
S_dB_speak = librosa.power_to_db(mel_spec_speak, ref=np.max)

# 创建指定尺寸的画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))

# 绘制第一个子图
img_no_speak = librosa.display.specshow(S_dB_no_speak, 
                                        x_axis='time',
                                        y_axis='mel', 
                                        sr=sr,
                                        fmax=8000, 
                                        ax=ax1)
fig.colorbar(img_no_speak, ax=ax1, format='%+2.0f dB')
ax1.set(title='No Speak')

# 绘制第二个子图
img_speak = librosa.display.specshow(S_dB_speak, 
                                     x_axis='time',
                                     y_axis='mel', 
                                     sr=sr,
                                     fmax=8000, 
                                     ax=ax2)
fig.colorbar(img_speak, ax=ax2, format='%+2.0f dB')
ax2.set(title='Speak')

# 调整布局避免标签重叠
plt.tight_layout()
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:27:13