日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于深度学习的中文语音识别系统框架(pluse)

發(fā)布時(shí)間:2025/3/15 windows 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于深度学习的中文语音识别系统框架(pluse) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

  • 聲學(xué)模型
    • GRU-CTC
    • DFCNN
    • DFSMN
  • 語言模型
    • n-gram
    • CBHG
  • 數(shù)據(jù)集

本文搭建一個(gè)完整的中文語音識(shí)別系統(tǒng),包括聲學(xué)模型和語言模型,能夠?qū)⑤斎氲囊纛l信號(hào)識(shí)別為漢字。

聲學(xué)模型使用了應(yīng)用較為廣泛的遞歸循環(huán)網(wǎng)絡(luò)中的GRU-CTC的組合,除此之外還引入了科大訊飛提出的DFCNN深度全序列卷積神經(jīng)網(wǎng)絡(luò),也將引入阿里的架構(gòu)DFSMN。

語言模型有傳統(tǒng)n-gram模型和基于深度神經(jīng)網(wǎng)絡(luò)的CBHG網(wǎng)絡(luò)結(jié)構(gòu),該結(jié)構(gòu)是谷歌用于TTS任務(wù)中的tacotron系統(tǒng),本文中將該系統(tǒng)部分結(jié)構(gòu)移植過來用于搭建拼音序列生成漢字序列系統(tǒng)。

數(shù)據(jù)集采用了目前能找到的所有中文免費(fèi)數(shù)據(jù),包括:thchs-30、aishell、primewords、st-cmd四個(gè)數(shù)據(jù)集,訓(xùn)練集總計(jì)大約450個(gè)小時(shí)。

該項(xiàng)目地址在:https://github.com/audier/my_ch_speech_recognition寫的時(shí)候可能有些亂,后續(xù)會(huì)整理。

聲學(xué)模型

聲學(xué)模型目前開源了部分示例模型,更大模型將在確認(rèn)識(shí)別結(jié)果后更新。

GRU-CTC

我們使用 GRU-CTC的方法搭建了第一個(gè)聲學(xué)模型,在gru_ctc_am.py中,利用循環(huán)神經(jīng)網(wǎng)絡(luò)可以利用語音上下文相關(guān)的信息,得到更加準(zhǔn)確地信息,而GUR又能選擇性的保留需要的信息。該模型使用python/keras進(jìn)行搭建,本文系統(tǒng)都基于python搭建。
網(wǎng)絡(luò)結(jié)構(gòu)如下:
該結(jié)構(gòu)沒有真正使用,只是一個(gè)基本框架,類似于helloworld,用于作為示例。

def creatModel():input_data = Input(name='the_input', shape=(500, 26))layer_h1 = Dense(512, activation="relu", use_bias=True, kernel_initializer='he_normal')(input_data)layer_h1 = Dropout(0.2)(layer_h1)layer_h2 = Dense(512, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h1)layer_h2 = Dropout(0.2)(layer_h2)layer_h3 = Dense(512, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h2)layer_h4_1 = GRU(512, return_sequences=True, kernel_initializer='he_normal', dropout=0.3)(layer_h3)layer_h4_2 = GRU(512, return_sequences=True, go_backwards=True, kernel_initializer='he_normal', dropout=0.3)(layer_h3)layer_h4 = add([layer_h4_1, layer_h4_2])layer_h5 = Dense(512, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h4)layer_h5 = Dropout(0.2)(layer_h5)layer_h6 = Dense(512, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h5)layer_h6 = Dropout(0.2)(layer_h6)layer_h7 = Dense(512, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h6)layer_h7 = Dropout(0.2)(layer_h7)layer_h8 = Dense(1177, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h7)output = Activation('softmax', name='Activation0')(layer_h8)model_data = Model(inputs=input_data, outputs=output)#ctc層labels = Input(name='the_labels', shape=[50], dtype='float32')input_length = Input(name='input_length', shape=[1], dtype='int64')label_length = Input(name='label_length', shape=[1], dtype='int64')loss_out = Lambda(ctc_lambda, output_shape=(1,), name='ctc')([labels, output, input_length, label_length])model = Model(inputs=[input_data, labels, input_length, label_length], outputs=loss_out)model.summary()ada_d = Adadelta(lr=0.01, rho=0.95, epsilon=1e-06)model=multi_gpu_model(model,gpus=2)model.compile(loss={'ctc': lambda y_true, output: output}, optimizer=ada_d)#test_func = K.function([input_data], [output])print("model compiled successful!")return model, model_data

DFCNN

由于兩個(gè)原因在使用GRU作為語音識(shí)別的時(shí)候我們會(huì)遇到問題。一方面是我們常常使用雙向循環(huán)神經(jīng)網(wǎng)絡(luò)才能取得更好的識(shí)別效果,這樣會(huì)影響解碼實(shí)時(shí)性。另一方面隨著網(wǎng)絡(luò)結(jié)構(gòu)復(fù)雜性增加,雙向GRU的參數(shù)是相同節(jié)點(diǎn)數(shù)全連接層的6倍,這樣會(huì)導(dǎo)致訓(xùn)練速度非常緩慢。
科大訊飛提出了一種使用深度卷積神經(jīng)網(wǎng)絡(luò)來對(duì)時(shí)頻圖進(jìn)行識(shí)別的方法,就是DFCNN,利用CNN參數(shù)共享機(jī)制,可以將參數(shù)數(shù)量下降一個(gè)級(jí)別,且深層次的卷積和池化層能夠充分考慮語音信號(hào)的上下文信息,且可以在較短的時(shí)間內(nèi)就可以得到識(shí)別結(jié)果,具有較好的實(shí)時(shí)性。
該模型在cnn_witch_fbank.py和cnn_ctc_am.py中,實(shí)驗(yàn)中是所有網(wǎng)絡(luò)結(jié)果最好的模型,目前能夠取得較好的泛化能力,聲學(xué)模型識(shí)別率能夠達(dá)到90%以上,其網(wǎng)絡(luò)結(jié)構(gòu)如下:

def creatModel():input_data = Input(name='the_input', shape=(800, 200, 1))# 800,200,32layer_h1 = Conv2D(32, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(input_data)layer_h1 = BatchNormalization(mode=0,axis=-1)(layer_h1)layer_h2 = Conv2D(32, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h1)layer_h2 = BatchNormalization(axis=-1)(layer_h2)layer_h3 = MaxPooling2D(pool_size=(2,2), strides=None, padding="valid")(layer_h2)# 400,100,64layer_h4 = Conv2D(64, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h3)layer_h4 = BatchNormalization(axis=-1)(layer_h4)layer_h5 = Conv2D(64, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h4)layer_h5 = BatchNormalization(axis=-1)(layer_h5)layer_h5 = MaxPooling2D(pool_size=(2,2), strides=None, padding="valid")(layer_h5)# 200,50,128layer_h6 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h5)layer_h6 = BatchNormalization(axis=-1)(layer_h6)layer_h7 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h6)layer_h7 = BatchNormalization(axis=-1)(layer_h7)layer_h7 = MaxPooling2D(pool_size=(2,2), strides=None, padding="valid")(layer_h7)# 100,25,128layer_h8 = Conv2D(128, (1,1), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h7)layer_h8 = BatchNormalization(axis=-1)(layer_h8)layer_h9 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h8)layer_h9 = BatchNormalization(axis=-1)(layer_h9)# 100,25,128layer_h10 = Conv2D(128, (1,1), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h9)layer_h10 = BatchNormalization(axis=-1)(layer_h10)layer_h11 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h10)layer_h11 = BatchNormalization(axis=-1)(layer_h11)# Reshape層layer_h12 = Reshape((100, 3200))(layer_h11) # 全連接層layer_h13 = Dense(256, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h12)layer_h13 = BatchNormalization(axis=1)(layer_h13)layer_h14 = Dense(1177, use_bias=True, kernel_initializer='he_normal')(layer_h13)output = Activation('softmax', name='Activation0')(layer_h14)model_data = Model(inputs=input_data, outputs=output)# ctc層labels = Input(name='the_labels', shape=[50], dtype='float32')input_length = Input(name='input_length', shape=[1], dtype='int64')label_length = Input(name='label_length', shape=[1], dtype='int64')loss_out = Lambda(ctc_lambda, output_shape=(1,), name='ctc')([labels, output, input_length, label_length])model = Model(inputs=[input_data, labels, input_length, label_length], outputs=loss_out)model.summary()ada_d = Adadelta(lr=0.01, rho=0.95, epsilon=1e-06)#model=multi_gpu_model(model,gpus=2)model.compile(loss={'ctc': lambda y_true, output: output}, optimizer=ada_d)#test_func = K.function([input_data], [output])print("model compiled successful!")return model, model_data

DFSMN

而前饋記憶神經(jīng)網(wǎng)絡(luò)也也解決了雙向GRU的參數(shù)過多和實(shí)時(shí)性較差的缺點(diǎn),它利用一個(gè)記憶模塊,包含了上下幾幀信息,能夠得到不輸于雙向GRU-CTC的識(shí)別結(jié)果,阿里最新的開源系統(tǒng)就是基于DFSMN的聲學(xué)模型,只不過在kaldi的框架上實(shí)現(xiàn)的。我們將考慮使用DFSMN+CTC的結(jié)構(gòu)在python上實(shí)現(xiàn)。該網(wǎng)絡(luò)后續(xù)將實(shí)現(xiàn)。
結(jié)構(gòu)如下:

語言模型

n-gram

n元語法是一個(gè)非常經(jīng)典的語言模型,這里不過多介紹啦。

CBHG

該想法來自于一個(gè)大神搞輸入法的項(xiàng)目,下面部分也引用此處:搜喵出入法
他是利用該模型建立一個(gè)按鍵到漢字的作用,本文對(duì)其結(jié)構(gòu)和數(shù)據(jù)處理部分稍作改動(dòng),作為語言模型。

拼音輸入的本質(zhì)上就是一個(gè)序列到序列的模型:輸入拼音序列,輸出漢字序列。所以天然適合用在諸如機(jī)器翻譯的seq2seq模型上。

模型初始輸入是一個(gè)隨機(jī)采樣的拼音字母的character embedding,經(jīng)過一個(gè)CBHG的模型,輸出是五千個(gè)漢字對(duì)應(yīng)的label。
這里使用的CBHG模塊是state-of-art的seq2seq模型,用在Google的機(jī)器翻譯和語音合成中,該模型放在language_model/CBHG.py中,結(jié)構(gòu)如下:
圖片來自 Tacotron: Towards End-to-End Speech Synthesis

關(guān)于該模型值得注意的幾點(diǎn):

1.模型先使用一系列的一維卷積網(wǎng)絡(luò),有一系列的filter,filter_size從1到K,形成一個(gè)Conv1D Bank。這樣的作用相當(dāng)于使用了一系列的unigrams, bigrams直到K-grams,盡可能多的拿到輸入序列從local到context的完整信息。其實(shí)這樣的模型,與之前我們提到過的IDCNN(Iterated Dilated Convolutionary Nerual Network)有異曲同工之妙。而IDCNN相比較起來有更少的參數(shù),不知道如果把CBHG的Conv1D Bank換成IDCNN是怎樣的效果。

2.模型在最終的BiGRU之前加入了多層的Highway Layers,用來提取更高層次的特征。Highway Layers可以理解為加入了本來不相鄰層之間的“高速公路”,可以讓梯度更好地向前流動(dòng);同時(shí)又加入一個(gè)類似LSTM中門的機(jī)制,自動(dòng)學(xué)習(xí)這些高速公路的開關(guān)和流量。Highway Networks和Residual Networks、Dense Networks都是想拉近深度網(wǎng)絡(luò)中本來相隔很遠(yuǎn)的層與層之間的距離,使很深的網(wǎng)絡(luò)也可以比較容易地學(xué)習(xí)。

3.模型中還使用了Batch Normalization(繼ReLU之后大家公認(rèn)的DL訓(xùn)練技巧),Residual Connection(減少梯度的傳播距離),Stride=1的Max-pooling(保證Conv的局部不變性和時(shí)間維度的粒度)以及一個(gè)時(shí)髦的BiGRU。Tacotron: Towards End-to-End Speech Synthesis這篇文章發(fā)表在2017年4月,最潮的DL技術(shù)用到了很多。

項(xiàng)目基于深度學(xué)習(xí)的中文語音識(shí)別系統(tǒng)中l(wèi)anguage_model/文件夾中已經(jīng)默認(rèn)放置了例子語料,可以通過直接運(yùn)行CBHG.py進(jìn)行數(shù)據(jù)預(yù)處理、模型訓(xùn)練、和模型測(cè)試,下面是我用項(xiàng)目中的默認(rèn)數(shù)據(jù)在12G GPU上訓(xùn)練了大概小半天的模型識(shí)別結(jié)果,如果利用網(wǎng)絡(luò)爬蟲增加數(shù)據(jù)集,將會(huì)有更好的泛化結(jié)果。

請(qǐng)輸入測(cè)試拼音:ta1 mei2 you3 duo1 shao3 hao2 yan2 zhuang4 yu3 dan4 ta1 que4 ba3 ai4 qin1 ren2 ai4 jia1 ting2 ai4 zu3 guo2 ai4 jun1 dui4 wan2 mei3 de tong3 yi1 le qi3 lai2 她沒有多少豪言壯語但她卻把愛親人愛家庭愛祖國(guó)愛軍隊(duì)完美地統(tǒng)一了起來請(qǐng)輸入測(cè)試拼音:chu2 cai2 zheng4 bo1 gei3 liang3 qian1 san1 bai3 wan4 yuan2 jiao4 yu4 zi1 jin1 wai4 hai2 bo1 chu1 zhuan1 kuan3 si4 qian1 wu3 bai3 qi1 shi2 wan4 yuan2 xin1 jian4 zhong1 xiao3 xue2 除財(cái)政撥給兩千三百萬元教太資金外還撥出專款四千五百七十萬元新建中小學(xué)請(qǐng)輸入測(cè)試拼音:ke3 shi4 chang2 chang2 you3 ren2 gao4 su4 yao2 xian1 sheng1 shuo1 kan4 jian4 er4 xiao3 jie3 zai4 ka1 fei1 guan3 li3 he2 wang2 jun4 ye4 wo4 zhe shou3 yi1 zuo4 zuo4 shang4 ji3 ge4 zhong1 tou2 可是常常有人告訴姚先生說看見二小姐在咖啡館里和王俊業(yè)握著族一坐坐上幾個(gè)鐘頭

數(shù)據(jù)集

數(shù)據(jù)集采用了目前我能找到的所有中文免費(fèi)數(shù)據(jù),包括:thchs-30、aishell、primewords、st-cmd四個(gè)數(shù)據(jù)集,訓(xùn)練集總計(jì)大約450個(gè)小時(shí),在實(shí)驗(yàn)過程中,使用thchs-30+aishell+st-cmd數(shù)據(jù)集對(duì)DFCNN聲學(xué)模型進(jìn)行訓(xùn)練,以64batch_size訓(xùn)練。

  • 數(shù)據(jù)集
    • 共計(jì)約430小時(shí),相關(guān)鏈接:http://www.openslr.org/resources.php
    • st-cmd、primewords、Aishell、thchs30四個(gè)數(shù)據(jù)集,整理為相同格式,放于some_expriment\data_process\datalist中。包含了解壓后數(shù)據(jù)的路徑,以及訓(xùn)練所需的數(shù)據(jù)標(biāo)注格式,其中prime數(shù)據(jù)沒有區(qū)分訓(xùn)練集等,為我手工區(qū)分。各個(gè)數(shù)據(jù)集的數(shù)量(句)如下:

      Nametraindevtest
      aishell120098143267176
      primewords4078350465073
      thchs-30100008932495
      st-cmd100006002000

這是目前能找到的所有開源中文語料,如果還有希望大神能夠留言提示。

轉(zhuǎn)載請(qǐng)注明出處:https://www.cnblogs.com/sunhongwen/p/9613674.html

轉(zhuǎn)載于:https://www.cnblogs.com/sunhongwen/p/9613674.html

總結(jié)

以上是生活随笔為你收集整理的基于深度学习的中文语音识别系统框架(pluse)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。