1. 程式人生 > >用python實現語音識別

用python實現語音識別

讀取和繪製音訊資料

  實際的音訊訊號是複雜的連續波形,為了將其儲存成數字化形式,需要對音訊訊號進行取樣並將其轉換成數字,例如:語音通常以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