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

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

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)












java

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

相關文章
相關標籤/搜索