`librosa.display.specshow` 是一個非常方便的函數,用于繪制音頻信號的各種頻譜圖,包括Mel頻譜圖、STFT頻譜圖等。它不僅能夠繪制頻譜圖,還能自動設置軸標簽和刻度,使得生成的圖像更加直觀和易于理解。
### 函數簽名
```python
librosa.display.specshow(data, x_coords=None, y_coords=None, x_axis=None, y_axis=None, sr=22050, hop_length=512, fmin=0, fmax=None, bins_per_octave=12, key='C:maj', ax=None, **kwargs)
```
### 參數說明
- **`data`**:二維數組,表示頻譜數據。例如,`librosa.feature.melspectrogram` 或 `librosa.stft` 的輸出。
- **`x_coords`**:一維數組,表示x軸的坐標。如果提供,`x_axis` 參數將被忽略。
- **`y_coords`**:一維數組,表示y軸的坐標。如果提供,`y_axis` 參數將被忽略。
- **`x_axis`**:字符串,指定x軸的類型。常見值包括:
? - `'time'`:時間軸(默認值)。
? - `'s'`:秒。
? - `'ms'`:毫秒。
? - `'lag'`:延遲軸。
? - `'lag_s'`:延遲軸(秒)。
? - `'lag_ms'`:延遲軸(毫秒)。
? - `'cqt_note'`:基于CQT的音符軸。
? - `'cqt_hz'`:基于CQT的頻率軸。
? - `'chroma'`:音階軸。
? - `'tonnetz'`:Tonnetz軸。
? - `'off'`:關閉x軸標簽。
- **`y_axis`**:字符串,指定y軸的類型。常見值包括:
? - `'linear'`:線性頻率軸(默認值)。
? - `'log'`:對數頻率軸。
? - `'mel'`:Mel頻率軸。
? - `'cqt_note'`:基于CQT的音符軸。
? - `'cqt_hz'`:基于CQT的頻率軸。
? - `'chroma'`:音階軸。
? - `'off'`:關閉y軸標簽。
- **`sr`**:采樣率,默認值為22050 Hz。
- **`hop_length`**:幀移,默認值為512。
- **`fmin`**:最小頻率,默認值為0 Hz。
- **`fmax`**:最大頻率,默認值為`None`,表示采樣率的一半(Nyquist頻率)。
- **`bins_per_octave`**:每八度的二進制數量,默認值為12。
- **`key`**:鍵名,默認值為`'C:maj'`。
- **`ax`**:`matplotlib`的軸對象,默認值為`None`。如果提供,將在指定的軸上繪制圖像。
- **`**kwargs`**:其他關鍵字參數,將傳遞給`matplotlib.pyplot.imshow`。
### 返回值
- 返回一個`matplotlib.image.AxesImage`對象,表示繪制的圖像。
### 示例代碼
以下是一個完整的示例,展示如何使用`librosa.display.specshow`繪制Mel頻譜圖:
```python
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
# 加載音頻文件
y, sr = librosa.load('example.wav', sr=16000)
# 計算Mel頻譜
mel = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
log_mel = librosa.power_to_db(mel, ref=np.max)
# 繪制Mel頻譜圖
plt.figure(figsize=(10, 4))
librosa.display.specshow(log_mel, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(label='Log Mel Spectrogram (dB)')
plt.xlabel('Time')
plt.ylabel('Mel Frequency')
plt.title('Mel Spectrogram')
plt.tight_layout()
plt.show()
```
### 詳細解釋
1. **加載音頻文件**
? ?```python
? ?y, sr = librosa.load('example.wav', sr=16000)
? ?```
? ?- 使用`librosa.load`加載音頻文件,`sr`表示采樣率。
2. **計算Mel頻譜**
? ?```python
? ?mel = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
? ?log_mel = librosa.power_to_db(mel, ref=np.max)
? ?```
? ?- 使用`librosa.feature.melspectrogram`計算Mel頻譜。
? ?- 使用`librosa.power_to_db`將Mel頻譜轉換為對數尺度。
3. **繪制頻譜圖**
? ?```python
? ?plt.figure(figsize=(10, 4))
? ?librosa.display.specshow(log_mel, sr=sr, x_axis='time', y_axis='mel')
? ?```
? ?- 創建一個`matplotlib`圖形。
? ?- 使用`librosa.display.specshow`繪制頻譜圖。`x_axis='time'`表示x軸為時間軸,`y_axis='mel'`表示y軸為Mel頻率軸。
4. **添加顏色條和標簽**
? ?```python
? ?plt.colorbar(label='Log Mel Spectrogram (dB)')
? ?plt.xlabel('Time')
? ?plt.ylabel('Mel Frequency')
? ?plt.title('Mel Spectrogram')
? ?```
? ?- 添加顏色條,表示頻譜的對數幅度。
? ?- 設置x軸和y軸的標簽。
? ?- 設置圖形的標題。
5. **調整布局并顯示**
? ?```python
? ?plt.tight_layout()
? ?plt.show()
? ?```
? ?- 使用`plt.tight_layout()`調整布局,避免標簽和顏色條的重疊。
? ?- 使用`plt.show()`顯示圖形。
### 保存圖像
如果需要將圖像保存到文件中,可以使用`plt.savefig`:
```python
plt.savefig('mel_spectrogram.png')
plt.close()
```
### 總結
`librosa.display.specshow` 是一個非常強大的工具,用于繪制音頻信號的各種頻譜圖。它不僅能夠自動處理軸標簽和刻度,還能通過參數靈活配置。通過結合`matplotlib`的功能,可以生成高質量的頻譜圖,適用于數據分析和可視化。
錯誤的代碼,注釋部分,? ?第一個參數需要的是? librosa.load 讀取后的二維數組
而不是 經過處理后的數據,頻譜數據
# 生成Mel頻譜 mel = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=Config.n_mels,n_fft=2048, hop_length=512, power=2 ) log_mel = librosa.power_to_db(mel, ref=np.max)
def save_mel_as_image(filepath, output_dir, denoise=False):mel = audio_to_mel(filepath, denoise)"""將梅爾頻譜圖保存為PNG圖片"""plt.figure(figsize=(10, 4))# librosa提供的功能來自動處理對數轉換和軸標簽# 這里不需要 ,第一個參數是原始數據,# librosa.display.specshow(mel, sr=Config.sr, x_axis='time', y_axis='mel')plt.colorbar(format='%+2.0f dB')plt.tight_layout()plt.savefig(output_dir)plt.close()
`librosa.feature.melspectrogram` 是一個用于計算Mel頻譜圖的函數。Mel頻譜圖是一種將音頻信號的頻譜表示在Mel頻率尺度上的方法,廣泛應用于音頻處理和機器學習任務中。Mel頻率尺度是一種非線性頻率尺度,更接近人類聽覺系統的感知特性。
### 函數簽名
```python
librosa.feature.melspectrogram(
? ? y=None,
? ? sr=22050,
? ? S=None,
? ? n_fft=2048,
? ? hop_length=512,
? ? win_length=None,
? ? window='hann',
? ? center=True,
? ? pad_mode='constant',
? ? power=2.0,
? ? n_mels=128,
? ? fmin=0.0,
? ? fmax=None,
? ? htk=False,
? ? norm='slaney',
? ? dtype=np.float32
)
```
### 參數說明
#### 輸入參數
- **`y`**:音頻時間序列。如果提供了`S`,則`y`可以為`None`。
- **`sr`**:采樣率,默認值為22050 Hz。
- **`S`**:頻譜圖(STFT)。如果提供了`S`,則`y`可以為`None`。`S`應該是通過`librosa.stft`計算得到的頻譜圖。
- **`n_fft`**:FFT窗口大小,默認值為2048。
- **`hop_length`**:幀移,默認值為512。
- **`win_length`**:窗口長度,默認值為`n_fft`。
- **`window`**:窗口函數,默認值為`'hann'`。
- **`center`**:是否將音頻時間序列居中,默認值為`True`。
- **`pad_mode`**:填充模式,默認值為`'constant'`。
- **`power`**:功率,默認值為2.0。表示頻譜圖的功率,通常為2(能量譜)或1(幅度譜)。
#### Mel濾波器參數
- **`n_mels`**:Mel頻帶的數量,默認值為128。
- **`fmin`**:最小頻率,默認值為0.0 Hz。
- **`fmax`**:最大頻率,默認值為`None`,表示采樣率的一半(Nyquist頻率)。
- **`htk`**:是否使用HTK算法計算Mel濾波器,默認值為`False`。
- **`norm`**:歸一化方式,默認值為`'slaney'`。可以設置為`None`或`'slaney'`。
- **`dtype`**:數據類型,默認值為`np.float32`。
### 返回值
- 返回一個二維數組,表示Mel頻譜圖。其形狀為`(n_mels, t)`,其中`t`是時間軸的長度。
### 示例代碼
以下是一個完整的示例,展示如何使用`librosa.feature.melspectrogram`計算Mel頻譜圖并繪制:
```python
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np
# 加載音頻文件
y, sr = librosa.load('example.wav', sr=16000)
# 計算Mel頻譜圖
mel = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
# 將Mel頻譜圖轉換為對數尺度
log_mel = librosa.power_to_db(mel, ref=np.max)
# 繪制Mel頻譜圖
plt.figure(figsize=(10, 4))
librosa.display.specshow(log_mel, sr=sr, x_axis='time', y_axis='mel')
plt.colorbar(label='Log Mel Spectrogram (dB)')
plt.xlabel('Time')
plt.ylabel('Mel Frequency')
plt.title('Mel Spectrogram')
plt.tight_layout()
plt.show()
```
### 詳細解釋
1. **加載音頻文件**
? ?```python
? ?y, sr = librosa.load('example.wav', sr=16000)
? ?```
? ?- 使用`librosa.load`加載音頻文件,`sr`表示采樣率。
2. **計算Mel頻譜圖**
? ?```python
? ?mel = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
? ?```
? ?- 使用`librosa.feature.melspectrogram`計算Mel頻譜圖。`n_mels=128`表示生成128個Mel頻帶。
3. **轉換為對數尺度**
? ?```python
? ?log_mel = librosa.power_to_db(mel, ref=np.max)
? ?```
? ?- 使用`librosa.power_to_db`將Mel頻譜圖轉換為對數尺度。`ref=np.max`表示以頻譜圖的最大值為參考值。
4. **繪制頻譜圖**
? ?```python
? ?plt.figure(figsize=(10, 4))
? ?librosa.display.specshow(log_mel, sr=sr, x_axis='time', y_axis='mel')
? ?```
? ?- 創建一個`matplotlib`圖形。
? ?- 使用`librosa.display.specshow`繪制頻譜圖。`x_axis='time'`表示x軸為時間軸,`y_axis='mel'`表示y軸為Mel頻率軸。
5. **添加顏色條和標簽**
? ?```python
? ?plt.colorbar(label='Log Mel Spectrogram (dB)')
? ?plt.xlabel('Time')
? ?plt.ylabel('Mel Frequency')
? ?plt.title('Mel Spectrogram')
? ?```
? ?- 添加顏色條,表示頻譜的對數幅度。
? ?- 設置x軸和y軸的標簽。
? ?- 設置圖形的標題。
6. **調整布局并顯示**
? ?```python
? ?plt.tight_layout()
? ?plt.show()
? ?```
? ?- 使用`plt.tight_layout()`調整布局,避免標簽和顏色條的重疊。
? ?- 使用`plt.show()`顯示圖形。
### 保存圖像
如果需要將圖像保存到文件中,可以使用`plt.savefig`:
```python
plt.savefig('mel_spectrogram.png')
plt.close()
```
### 總結
`librosa.feature.melspectrogram` 是一個非常強大的函數,用于計算Mel頻譜圖。它通過Mel頻率尺度將音頻信號的頻譜表示得更加符合人類聽覺系統的感知特性。通過結合`librosa.power_to_db`和`librosa.display.specshow`,可以生成高質量的Mel頻譜圖,適用于音頻分析和機器學習任務。