用python實現語音識別
阿新 • • 發佈:2018-12-06
讀取和繪製音訊資料
實際的音訊訊號是複雜的連續波形,為了將其儲存成數字化形式,需要對音訊訊號進行取樣並將其轉換成數字,例如:語音通常以44100Hz的頻率進行取樣,這就意味著每秒鐘訊號被分解成44100份,然後這些抽樣被儲存。換句話說,每隔$\frac{1}{44100}Hz$就會儲存一次,如果取樣率高,那麼媒體播放音訊時會感覺訊號是連續的。
import numpy as np import matplotlib.pyplot as plt from scipy.io import wavfile # 讀取音訊檔案 sampling_freq, audio = wavfile.read('input_read.wav') # 列印引數 print('Shape:', audio.shape) # Shape: (132300,) 說明有132300個值 print('資料型別:', audio.dtype) # 資料型別: int16 print('持續時間:', round(audio.shape[0] / float(sampling_freq), 3), 'seconds') # 持續時間: 3.0 seconds audio = audio / np.max(audio) # 歸一化 audio = audio[:30] # 提取音訊的前30個值# 建立時間軸 x_values = np.arange(0, len(audio), 1) / float(sampling_freq) x_values *= 1000 # 將單位轉化為秒 # 畫出聲音訊號圖形 plt.plot(x_values, audio, color='blue') plt.xlabel('Time (ms)') plt.ylabel('Amplitude') plt.title('Audio signal') plt.show()
將音訊訊號轉換為頻域
音訊訊號是不同頻率、增幅和相位的正弦波的複雜混合。一個音訊訊號的本質由其頻率內容決定,
import numpy as np from scipy.io import wavfile import matplotlib.pyplot as plt sampling_freq, audio = wavfile.read('input_freq.wav') # 讀取檔案 audio = audio / np.max(audio) # 歸一化,標準化 len_audio = len(audio) # 3251 # 應用傅立葉變換 transformed_signal = np.fft.fft(audio) print(transformed_signal) # [-0.04022912+0.j -0.04068997-0.00052721j -0.03933007-0.00448355j # ... -0.03947908+0.00298096j -0.03933007+0.00448355j -0.04068997+0.00052721j] half_length = int(np.ceil((len_audio + 1) / 2.0)) # np.ceil向上取整(向大的方向取整) transformed_signal = abs(transformed_signal[0:half_length]) print(transformed_signal) # [0.04022912 0.04069339 0.0395848 ... 0.08001755 0.09203427 0.12889393] transformed_signal /= float(len_audio) transformed_signal **= 2 # 提取轉換訊號的長度 len_ts = len(transformed_signal) # 1626 # 將部分訊號乘以2 if len_audio % 2: # 奇數 transformed_signal[1:len_ts] *= 2 else: # 偶數 transformed_signal[1:len_ts-1] *= 2 # 獲取功率訊號 power = 10 * np.log10(transformed_signal) # 建立時間軸 x_values = np.arange(0, half_length, 1) * (sampling_freq / len_audio) / 1000.0 # 繪製語音訊號的 plt.figure() plt.plot(x_values, power, color='blue') plt.xlabel('Freq (in kHz)') plt.ylabel('Power (in dB)') plt.show()
自定義引數生成音訊訊號
合成音樂
提取頻域特徵
將訊號轉換為頻域之後,還需要將其轉換為有用的形式,梅爾頻率倒譜系數(MFCC),MFCC首先計算訊號的功率譜,然後用濾波器組和離散餘弦變換的組合來提取特徵。
參考文獻:
《python機器學習經典案例》美Prateek Joshi著
傅立葉變換的介紹:http://www.thefouriertransform.com/
各種音階及其對應的頻率 http://pages.mtu.edu/~suits/notefreqs.html