Python實現爲語音文件創建聲譜圖(包括窄帶聲譜和寬帶聲譜)

選題自(數字語音處理理論及應用)

Python實現畫語音文件的聲譜圖


參數選用:
窗函數:漢明窗
寬帶聲譜窗長:5ms
寬帶聲譜FFT長度:1024
窄帶聲譜窗長:50ms
窄帶聲譜FFT長度:1024
使用對數幅度
聲譜圖爲彩色

代碼部分

import matplotlib.pyplot as plt   #畫圖用
import librosa.core as lc   #計算stft使用
import numpy as np   #使用了其中的一些工具函數
import librosa.display   #畫聲譜圖用
from scipy.io import wavfile   #獲取wav文件的採樣率

path = "/Users/mine/Desktop/wavefiles/s5.wav"    
fs, y_ = wavfile.read(path)        #讀取文件的採樣率
fs = fs       
n_fft = 1024         #FFT長度
y, sr = librosa.load(path, sr=fs)

#獲取寬帶聲譜圖
mag = np.abs(lc.stft(y, n_fft=n_fft, hop_length=10, win_length=40, window='hamming'))        #進行短時傅里葉變換,並獲取幅度
D = librosa.amplitude_to_db(mag, ref=np.max)    #幅度轉換爲db單位
librosa.display.specshow(D, sr=fs, hop_length=10, x_axis='s', y_axis='linear')             #畫聲譜圖
plt.colorbar(format='%+2.0f dB')
plt.title('broadband spectrogram')
plt.savefig('broader.png')
plt.show()

#獲取窄帶聲譜圖
mag1 = np.abs(lc.stft(y, n_fft=n_fft, hop_length=100, win_length=400, window='hamming'))
mag1_log = 20*np.log(mag1)
D1 = librosa.amplitude_to_db(mag1, ref=np.max)
librosa.display.specshow(D1, sr=fs, hop_length=100, x_axis='s', y_axis='linear')
plt.colorbar(format='%+2.0f dB')
plt.title('narrowband spectrogram')
plt.savefig('narrowband.png')
plt.show()

結果以及分析

寬帶聲譜圖如下:
在這裏插入圖片描述
窄帶聲譜圖如下
在這裏插入圖片描述
結果分析:
聲譜圖也即是語音短時傅里葉變換的幅度畫出的2D圖,
寬帶聲譜圖參數:
FFT長度:1024
聲譜窗長:5ms(8k採樣率時設置爲40)
窗移:(8k採樣率時設置爲10)
窄帶聲譜圖參數:
FFT長度:1024
聲譜窗長:50ms(8k採樣率時設置爲400)
窗移:(8k採樣率時設置爲100)

在寬帶聲譜圖中,可以看出時間分辨率很好,頻率分辨率較低,不能很好反映聲音的紋理特性,反映了頻譜的時變特性,能很好分辨出共振峯的大致位置,但分辨不清諧波結構。
在窄帶聲譜圖中可以觀察到有清楚的諧波結構,而且頻率分辨率非常好,可以清楚地看到各音階出現的時刻,以及各時刻對應頻率處的能量強弱,但是時間上的分辨率不太理想,因爲頻率分辨率太過精細,因而不能很好體現出共振峯的大致位置,即反映不出基波的變化特性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章