偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

使用Python和Keras創(chuàng)建簡單語音識別引擎

開發(fā) 后端 語音識別
語音識別是機器或程序識別口語中的單詞和短語并將其轉(zhuǎn)換為機器可讀格式的能力。通常,這些算法的簡單實現(xiàn)有一個有限的詞匯表,它可能只識別單詞/短語。但是,更復(fù)雜的算法(例如Cloud Speech-to-Text和Amazon Transcribe)具有廣泛的詞匯量,并包含方言、噪音和俚語。

 語音識別是機器或程序識別口語中的單詞和短語并將其轉(zhuǎn)換為機器可讀格式的能力。通常,這些算法的簡單實現(xiàn)有一個有限的詞匯表,它可能只識別單詞/短語。但是,更復(fù)雜的算法(例如Cloud Speech-to-Text和Amazon Transcribe)具有廣泛的詞匯量,并包含方言、噪音和俚語。

[[317333]]

在本文中,我將演示:

  • 語音轉(zhuǎn)文字的工作原理
  • 如何處理要轉(zhuǎn)錄的音頻
  • 使用Keras解決問題的深度學(xué)習(xí)模型
  • 一種評估此模型的方法
  • 將預(yù)測模型集成到項目中的腳本

簡介

語音只是由我們的聲帶引起的空氣周圍振動而產(chǎn)生的一系列聲波。這些聲波由麥克風(fēng)記錄,然后轉(zhuǎn)換為電信號。然后使用高級信號處理技術(shù)處理信號,分離音節(jié)和單詞。得益于深度學(xué)習(xí)方面令人難以置信的新進展,計算機也可以從經(jīng)驗中學(xué)習(xí)理解語音。

語音識別通過聲學(xué)和語言建模使用算法來工作。聲學(xué)建模表示語音和音頻信號的語言單元之間的關(guān)系;語言建模將聲音與單詞序列進行匹配,以幫助區(qū)分聽起來相似的單詞。通常,基于循環(huán)層的深度學(xué)習(xí)模型用于識別語音中的時間模式,以提高系統(tǒng)內(nèi)的準確性。也可以使用其他方法,例如隱馬爾可夫模型(第一個語音識別算法是使用這種方法)。在本文中,我將僅討論聲學(xué)模型。

信號處理

有多種方法可以將音頻波轉(zhuǎn)換為算法可以處理的元素,其中一種方法(在本教程中將使用的一種方法)是在等距的點上記錄聲波的高度:

 

使用Python和Keras創(chuàng)建簡單語音識別引擎

 

我們每秒讀取數(shù)千次,并記錄一個代表當時聲波高度的數(shù)字。這是一個未壓縮的.wav音頻文件。“ CD質(zhì)量”音頻以44.1 kHz(每秒44,100個讀數(shù))采樣。但是對于語音識別而言,16khz(每秒16,000個樣本)的采樣率足以覆蓋人類語音的頻率范圍。

用這種方法,音頻是通過一個數(shù)字向量來表示的,其中每個數(shù)字以1/16000秒的間隔表示聲波的振幅。這個過程類似于圖像預(yù)處理,如下例所示:

 

使用Python和Keras創(chuàng)建簡單語音識別引擎

 

多虧尼奎斯特定理(1933年— 弗拉基米爾·科特爾尼科夫(Vladimir Kotelnikov)),我們知道,只要采樣速度至少是我們要記錄的最高頻率的兩倍,我們就可以使用數(shù)學(xué)方法從間隔采樣中完美重建原始聲波。

Python庫

為了完成這個任務(wù),我使用Anaconda環(huán)境(Python 3.7)和以下Python庫:

  • ipython (v 7.10.2)
  • keras (v 2.2.4)
  • librosa (v 0.7.2)
  • scipy (v 1.1.0)
  • sklearn (v 0.20.1)
  • sounddevice (v 0.3.14)
  • tensorflow (v 1.13.1)
  • tensorflow-gpu (v 1.13.1)
  • numpy (v 1.17.2)

 

  1. from tensorflow.compat.v1 import ConfigProto 
  2. from tensorflow.compat.v1 import Session 
  3. import os 
  4. import librosa 
  5. import IPython.display as ipd 
  6. import matplotlib.pyplot as plt 
  7. import numpy as np 
  8. from scipy.io import wavfile 
  9. import warnings 
  10.  
  11. config = ConfigProto() 
  12. config.gpu_options.allow_growth = True 
  13. sess = Session(config=config) 
  14.  
  15. warnings.filterwarnings("ignore"

1.數(shù)據(jù)集

我們在實驗中使用TensorFlow提供的語音指令數(shù)據(jù)集。它包括由成千上萬不同的人發(fā)出的由30個短單詞組成的65000個一秒鐘長的話語。我們將建立一個語音識別系統(tǒng),它可以理解簡單的語音命令。您可以從此處下載數(shù)據(jù)集(https://www.kaggle.com/c/tensorflow-speech-recognition-challenge)。

2.預(yù)處理音頻波

在使用的數(shù)據(jù)集中,一些記錄的持續(xù)時間少于1秒,并且采樣率太高。因此,讓我們閱讀聲波并使用下面的預(yù)處理步驟來解決這個問題。這是我們要執(zhí)行的兩個步驟:

  • 重采樣
  • 刪除少于1秒的短命令

讓我們在下面的Python代碼片段中定義這些預(yù)處理步驟:

 

  1. train_audio_path = './train/audio/' 
  2.  
  3. all_wave = [] 
  4. all_label = [] 
  5. for label in labels: 
  6.     print(label) 
  7.     waves = [f for f in os.listdir(train_audio_path + '/'+ label) if f.endswith('.wav')] 
  8.     for wav in waves: 
  9.         samples, sample_rate = librosa.load(train_audio_path + '/' + label + '/' + wav, sr = 16000) 
  10.         samples = librosa.resample(samples, sample_rate, 8000) 
  11.         if(len(samples)== 8000) :  
  12.             all_wave.append(samples) 
  13.             all_label.append(label) 

由上可知,信號的采樣率為16000 hz。我們把它重采樣到8000赫茲,因為大多數(shù)語音相關(guān)的頻率都在8000赫茲。

第二步是處理我們的標簽,這里我們將輸出標簽轉(zhuǎn)換為整數(shù)編碼,將整數(shù)編碼標簽轉(zhuǎn)換為one-hot 向量,因為這是一個多目標問題:

 

  1. from sklearn.preprocessing import LabelEncoder 
  2. from keras.utils import np_utils 
  3.  
  4. label_enconder = LabelEncoder() 
  5. y = label_enconder.fit_transform(all_label) 
  6. classes = list(label_enconder.classes_) 
  7. y = np_utils.to_categorical(y, num_classes=len(labels)) 

預(yù)處理步驟的最后一步是將2D數(shù)組reshape為3D,因為conv1d的輸入必須是3D數(shù)組:

 

  1. all_wave = np.array(all_wave).reshape(-1,8000,1) 

3.創(chuàng)建訓(xùn)練和驗證集

為了執(zhí)行我們的深度學(xué)習(xí)模型,我們將需要生成兩個集合(訓(xùn)練和驗證)。對于此實驗,我使用80%的數(shù)據(jù)訓(xùn)練模型,并在其余20%的數(shù)據(jù)上進行驗證:

 

  1. from sklearn.model_selection import train_test_split 
  2. x_train, x_valid, y_train, y_valid = train_test_split(np.array(all_wave),np.array(y),stratify=y,test_size = 0.2,random_state=777,shuffle=True

4.機器學(xué)習(xí)模型架構(gòu)

我使用Conv1d和GRU層來建模用于語音識別的網(wǎng)絡(luò)。Conv1d是一個僅在一維上進行卷積的卷積神經(jīng)網(wǎng)絡(luò),而GRU的目標是解決標準循環(huán)神經(jīng)網(wǎng)絡(luò)的梯度消失問題。GRU也可以看作是LSTM的一個變體,因為兩者的設(shè)計相似,在某些情況下,可以產(chǎn)生同樣優(yōu)秀的結(jié)果。

該模型基于deepspeech h2和Wav2letter++ algoritms這兩種著名的語音識別方法。下面的代碼演示了使用Keras提出的模型:

 

  1. from keras.layers import Bidirectional, BatchNormalization, CuDNNGRU, TimeDistributed 
  2. from keras.layers import Dense, Dropout, Flatten, Conv1D, Input, MaxPooling1D 
  3. from keras.models import Model 
  4. from keras.callbacks import EarlyStopping, ModelCheckpoint 
  5. from keras import backend as K 
  6. K.clear_session() 
  7.  
  8. inputs = Input(shape=(8000,1)) 
  9. x = BatchNormalization(axis=-1, momentum=0.99, epsilon=1e-3, center=True, scale=True)(inputs) 
  10. #First Conv1D layer 
  11. x = Conv1D(8,13, padding='valid', activation='relu', strides=1)(x) 
  12. x = MaxPooling1D(3)(x) 
  13. x = Dropout(0.3)(x) 
  14. #Second Conv1D layer 
  15. x = Conv1D(16, 11, padding='valid', activation='relu', strides=1)(x) 
  16. x = MaxPooling1D(3)(x) 
  17. x = Dropout(0.3)(x) 
  18. #Third Conv1D layer 
  19. x = Conv1D(32, 9, padding='valid', activation='relu', strides=1)(x) 
  20. x = MaxPooling1D(3)(x) 
  21. x = Dropout(0.3)(x) 
  22. x = BatchNormalization(axis=-1, momentum=0.99, epsilon=1e-3, center=True, scale=True)(x) 
  23. x = Bidirectional(CuDNNGRU(128, return_sequences=True), merge_mode='sum')(x) 
  24. x = Bidirectional(CuDNNGRU(128, return_sequences=True), merge_mode='sum')(x) 
  25. x = Bidirectional(CuDNNGRU(128, return_sequences=False), merge_mode='sum')(x) 
  26. x = BatchNormalization(axis=-1, momentum=0.99, epsilon=1e-3, center=True, scale=True)(x) 
  27. #Flatten layer 
  28. # x = Flatten()(x) 
  29. #Dense Layer 1 
  30. x = Dense(256, activation='relu')(x) 
  31. outputs = Dense(len(labels), activation="softmax")(x) 
  32. model = Model(inputs, outputs) 
  33. model.summary() 

 

使用Python和Keras創(chuàng)建簡單語音識別引擎

 

 

注意:如果僅使用CPU來訓(xùn)練此模型,請用GRU替換CuDNNGRU層。

下一步是將損失函數(shù)定義為分類交叉熵,因為它是一個多類分類問題:

 

  1. model.compile(loss='categorical_crossentropy',optimizer='nadam',metrics=['accuracy']) 

Early stopping和模型檢查點是回調(diào),以在適當?shù)臅r間停止訓(xùn)練神經(jīng)網(wǎng)絡(luò)并在每個epoch后保存最佳模型:

 

  1. early_stop = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=10, min_delta=0.0001)  
  2. checkpoint = ModelCheckpoint('speech2text_model.hdf5', monitor='val_acc', verbose=1, save_best_only=True, mode='max'

讓我們在32的batch size上訓(xùn)練機器學(xué)習(xí)模型,并評估保留集上的性能:

 

  1. hist = model.fit( 
  2.     x=x_train,  
  3.     y=y_train, 
  4.     epochs=100,  
  5.     callbacks=[early_stop, checkpoint],  
  6.     batch_size=32,  
  7.     validation_data=(x_valid,y_valid) 

該命令的輸出為:

 

使用Python和Keras創(chuàng)建簡單語音識別引擎

 

5.可視化

我將依靠可視化來了解機器學(xué)習(xí)模型在一段時間內(nèi)的性能:

 

  1. from matplotlib import pyplot 
  2. pyplot.plot(hist.history['loss'], label='train'
  3. pyplot.plot(hist.history['val_loss'], label='test'
  4. pyplot.legend() 
  5. pyplot.show() 

 

使用Python和Keras創(chuàng)建簡單語音識別引擎

 

 

6.預(yù)測

在這一步中,我們將加載最佳的權(quán)重,并定義識別音頻和將其轉(zhuǎn)換為文本的函數(shù):

 

  1. from keras.models import load_model 
  2. model = load_model('speech2text_model.hdf5'
  3.  
  4. def s2t_predict(audio, shape_num=8000): 
  5.     prob=model.predict(audio.reshape(1,shape_num,1)) 
  6.     index=np.argmax(prob[0]) 
  7.     return classes[index

對驗證數(shù)據(jù)進行預(yù)測:

 

  1. import random 
  2. index=random.randint(0,len(x_valid)-1) 
  3. samples=x_valid[index].ravel() 
  4. print("Audio:",classes[np.argmax(y_valid[index])]) 
  5. ipd.Audio(samples, rate=8000) 

這是一個提示用戶錄制語音命令的腳本。可以錄制自己的語音命令,并在機器學(xué)習(xí)模型上測試:

 

  1. import sounddevice as sd 
  2. import soundfile as sf 
  3.  
  4. samplerate = 16000   
  5. duration = 1 # seconds 
  6. filename = 'yes.wav' 
  7. print("start"
  8. mydata = sd.rec(int(samplerate * duration), samplerate=samplerate, 
  9.     channels=1, blocking=True
  10. print("end"
  11. sd.wait() 
  12. sf.write(filename, mydata, samplerate) 

最后,我們創(chuàng)建一個腳本來讀取保存的語音命令并將其轉(zhuǎn)換為文本:

 

  1. #reading the voice commands 
  2. test, test_rate = librosa.load('./test/left.wav', sr = 16000) 
  3. test_sample = librosa.resample(test, test_rate, 4351) 
  4. print(test_sample.shape) 
  5. ipd.Audio(test_sample,rate=8000) 
  6.  
  7. #converting voice commands to text 
  8. s2t_predict(test_sample) 

最后

語音識別技術(shù)已經(jīng)成為我們?nèi)粘I畹囊徊糠郑壳叭跃窒抻谙鄬唵蔚拿?。隨著技術(shù)的進步,研究人員將能夠創(chuàng)造出更多能夠理解會話語音的智能系統(tǒng)。

 

責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2024-01-08 19:30:15

AI開源語音識別

2021-12-08 14:06:19

Python語音識別開發(fā)

2011-05-09 00:00:03

蘋果iOS

2017-04-26 09:30:53

卷積神經(jīng)網(wǎng)絡(luò)實戰(zhàn)

2023-05-14 22:35:24

TensorFlowKeras深度學(xué)習(xí)

2017-03-20 10:14:03

語音識別匹配算法模型

2017-03-16 16:57:56

2011-09-08 16:24:25

Win 7語音識別

2023-01-30 17:14:40

人工智能語音識別

2021-11-08 22:59:04

機器學(xué)習(xí)

2022-02-17 17:19:31

鴻蒙語音識別語音播報

2023-01-29 14:29:59

Python識別車牌

2019-11-20 12:30:21

Python編程語言語音識別

2025-04-01 09:31:34

PyTorch自動語音識別ASR系統(tǒng)

2011-05-31 16:38:47

Android 實現(xiàn)語音

2016-02-17 10:39:18

語音識別語音合成語音交互

2022-06-29 09:00:00

前端圖像分類模型SQL

2025-06-27 05:00:00

AI語音詐騙AI語音識別人工智能

2009-08-21 15:28:23

C#英文

2022-10-08 08:36:02

UbuntuLinux語音識別
點贊
收藏

51CTO技術(shù)棧公眾號