【class18】人工智能初步----語音識別(4)

【class17】

上節課,我們學習了:?????? ?語音端點檢測的相關概念,并通過代碼切分和保存了音頻。

本節課,我們將學習這些知識點:
1.?序列到序列模型
2.?循環神經網絡
3.?調用短語音識別接口

??????????????????????

知其然,知其所以然

在調用語音識別接口前,我們先來學習語音識別系統最核心的部分:強大的黑盒子——語音識別模型
通過學習黑盒子的內部,幫助我們進一步了解語音識別的前因后果。

強大的黑盒子

在一個典型的深度學習語音識別系統中,其模型由兩部分組成:
1.編碼器?????????????????????????????????????????????????????? 2.解碼器

??????????

編碼和譯碼的目的

1.為了對輸入數據進行分析并編寫成機器能夠處理的信息,就需要編碼。
2.為了將編碼器編寫的信息翻譯成人類理解的信息,就需要譯碼。
????????? 通俗的說,編碼器就是讓機器讀得懂,解碼器就是讓人讀的懂。

編碼器解碼器模型又叫做seq2seq模型——序列到序列模型。序列到序列也就是說,輸入和輸出都是序列。

序列到序列模型

定義

序列到序列模型(seq2seq )包括編碼器 (Encoder) 和解碼器 (Decoder) 兩部分。
seq2seq 是自然語言處理中的一種重要模型,可以用于語音識別、機器翻譯、對話系統以及自動文摘等。

隱喻

把這個過程想象成諜戰片里的情報截獲和翻譯,編碼器為敵方,解碼器為我方。我方情報員截獲了敵方編碼好的情報,為了讀懂情報,就需要進行解碼。

語音識別的輸入和輸出都是不定長序列,換句話說,就是每次輸入的語音和輸出的文字長度不定。比如,時長不一樣的語音,采樣后所得的數字序列是不一樣長的。
像語音識別這種輸入輸出都是不定長序列時,我們就使用seq2seq模型。

seq2seq模型由編碼器解碼器組成,而編碼器和解碼器都是利用了循環神經網絡 — RNN來實現的。基本思想就是利用兩個RNN,一個RNN作為編碼器,另一個RNN作為解碼器。

循環神經網絡

定義

循環神經網絡 (Recurrent Neural Network,RNN) 是一類用于處理序列數據的神經網絡。在近些年,人們利用RNN解決了各種各樣的問題:語音識別、語言模型、機器翻譯和圖像描述等。

對于序列數據來說,順序排列非常重要! 比如,這樣一句話「我要給手( )充電」。 我們就可以根據前后文字猜測,( )可能是機、表等單字。

???????????????????????

當話變成「電充( )手要我」時,( )里該填什么?是不是滿臉問號???顯然,針對有關于序列的問題,我們需要一個神經網絡來進行專門的處理。于是RNN出來了。

?????????????????????????????

在學習RNN結構之前,我們看其他網絡(如CNN)是如何處理數據的:每個網絡處理數據是單獨進行的。
每個數據通過隱含層(A)處理,都會得到一個對應的結果。

????????????????????????

如果待處理的數據之間(x1、x2、x3)有關聯順序,也就是為序列數據時:對于神經網絡來說,并沒有辦法知道數據之間的關聯。怎么讓網絡知道這些數據順序關聯,比如圖中的護膚順序,并能進一步分析呢?

科學家們腦袋一轉,不怕不怕,我們把前一個網絡的中間狀態作為后一個的輸入就好啦!這樣就能形成一個所有記憶循環分析的網絡,處理序列數據剛剛好!

RNN結構

循環神經網絡和卷積神經網絡一樣,它包含三個結構:
1.?輸入層????????????????? 2.?隱含層?????????????????????????? 3.?輸出層

為了更好理解,將RNN按照序列順序將其展開:
RNN 順序鏈式結構讓它看起來就像是為序列數據而生!(圖中的輸入x1-xt就可以是我們采樣所得的序列數據)

輸入層、輸出層比較容易理解。
在語音識別中,輸入層輸入的是語音,輸出層輸出的是識別結果
那么,隱含層呢?

循環神經網絡的隱含層前后順序相連,前后相互依賴,前一個的輸出為后一個的輸入。 這與語音的前一個字依賴后一個字或者前一句話依賴后一句話非常契合。

RNN VS? CNN

RNN 與CNN相比,RNN的特別之處在于:
1. 處理序列數據效果好
2. 允許控制輸入或輸出向量序列的長度
第1點我們已經學習了,接下來,我們通過兩個結構模型來理解第2點。

????????????????????????????

CNN
1->1?結構,固定長的輸入和輸出 (應用:比如圖像分類)
???????????????????????????????????? RNN
N->M?結構,不定長的序列輸入和序列輸出 (應用:比如語音識別)
seq2seq模型輸入輸出序列的長度是不固定的,對應的就是N->M結構

學習完seq2seq模型RNN的原理和概念之后,該如何實現語音識別呢?接下來,我們完成“調用接口實現語音識別”的第一步——單段音頻的語音識別

通過代碼調用短語音識別接口實現對單段音頻文件的語音識別
讓我們一起嘗試一下吧~

1. 首先,我們開始打開并讀取音頻。
使用?with...as?配合open()函數以rb 方式,打開路徑為filePath的音頻,并賦值給 fp;
使用read()函數讀取音頻,輸出結果為二進制的編碼數據

代碼示例:

調用短語音識別接口

代碼的作用

利用短語音識別接口,對一段音頻文件識別,返回值為字典類型。
第20行,
通過asr接口識別輸入的音頻wavsample,并將結果存儲在rejson變量中。

分析代碼:

語音識別客戶端

使用變量client,即創建好的語音識別客戶端,可對其調用。

短語音識別接口

對創建的AipSpeech客戶端,使用asr()函數調用短語音識別接口。
注意:該接口只能將60秒以下的音頻識別為文字,若音頻時長超過限制,可切分為多段音頻進行識別。

待識別語音

必選參數wavsample,語音內容的Buffer對象,文件格式支持pcm 或者 wav 或者 amr。

文件格式

必選參數,傳入字符串"wav"設置音頻文件格式為wav文件。

采樣率

必選參數,傳入參數16000聲明音頻文件的采樣率為16000Hz。常用的音頻采樣率有:8000Hz、16000Hz和32000Hz等。

可選參數

asr()函數中傳入可選參數{"dev_pid": 參數}設置待識別音頻的語音類型。
參數為1537表示可識別的語言:普通話(純中文識別)。
其余參數和解釋如下:

總結:

調用接口----使用asr()函數調用短語音識別接口。將待識別的音頻必選參數wavsample,"wav",16000傳入到該函數中。輸出調用接口返回的結果rejson。

?????????????????

從輸出結果可以看到,調用接口返回的是一個字典。 該字典包含多個參數:
corpus_no:語料庫碼????????????????? err_msg:錯誤碼描述???????????????????????? err_no:錯誤碼
result:識別結果??????????????????????? sn:語音數據唯一標識

成功返回

成功返回時rejson字典中的參數err_msg和err_no內容為:
1.?err_msg:錯誤碼描述,rejson["err_msg"]為"success."
2.?err_no:錯誤碼,rejson["err_no"]為0

成功返回時rejson字典中的參數result為列表結構:rejson["result"]中保存了單段音頻語音識別的文字信息。

獲取識別結果
查看輸出結果,我們從rejson字典中的鍵result就能得到識別結果。
調用接口返回的是一個復雜的字典結構,我們將它賦值給了變量rejson。
從字典rejson中取出參數"result"的值,可以用rejson["result"]
再從rejson["result"]中取出列表內的元素,可以用rejson["result"][0]

代碼示例:

# 獲取語音識別結果

# 從返回結果中提取出參數result中的唯一值并賦值給變量msg

msg = rejson["result"][0]

完善代碼:

    1. if-else語句判定
      使用if-else語句,若錯誤碼為0,則得到語音識別結果;否則給出"語音識別錯誤!"提示。
      以防出現語音識別無結果或者出現其他錯誤情況,而導致代碼報錯不能正常運行!

代碼:

# if—else語句判定

# 若錯誤碼為0,則得到語音識別結果

if rejson["err_no"] == 0:

??? # 獲取語音識別結果

??? # 從返回結果中提取出參數result中的唯一值并賦值給變量msg

??? msg = rejson["result"][0]

# 否則給出"語音識別錯誤!"提示

else:

msg = "語音識別錯誤!"

    1. 語音識別函數

將調用接口實現語音識別封裝為函數,方便后面的調用。
最后通過參數wavsample調用函數,并輸出結果。

修改后的代碼:

# 定義語音識別函數audio2text()

def audio2text(wav):

??? # 調用短語音識別接口把結果賦值給rejson變量

??? rejson = client.asr(wav,"wav",16000,{"dev_pid": 1537})

??? # if—else語句判定

??? # 若錯誤碼為0,則得到語音識別結果

??? if rejson["err_no"] == 0:

??????? # 獲取語音識別結果

??????? # 從返回結果中提取出參數result中的唯一值并賦值給變量msg

??????? msg = rejson["result"][0]

??? # 否則給出"語音識別錯誤!"提示

??? else:

??????? msg = "語音識別錯誤!"

??? # 返回語音識別結果msg

return msg

調用短語音識別接口實現了單個音頻的語音識別。接下來我們對上節課獲得的音頻片段做批量處理,批量讀取音頻文件,實現多段音頻文件的批量識別
我們先完成第一步——批量讀取音頻

代碼復習
批量處理之前,復習一下前面課程從視頻中獲取音頻文件,并切分和保存為wav文件的完整代碼。

"""獲取音頻文件"""

from moviepy.editor import VideoFileClip

video = VideoFileClip("/Users/yequ/大話西游.mp4")

audio = video.audio

audio.write_audiofile("/Users/yequ/大話西游.wav")

"""音頻文件參數設置"""

from pydub import AudioSegment

sound = AudioSegment.from_wav("/Users/yequ/大話西游.wav")

sound = sound.set_frame_rate(16000)

sound = sound.set_channels(1)

"""切分音頻"""

from pydub.silence import split_on_silence

min_silence_len = 500

silence_thresh = -50

pieces = split_on_silence(sound,min_silence_len,silence_thresh)

"""導出音頻片段"""

count = 0

for i in pieces:

??? path = "/Users/yequ/音頻片段"+str(count)+".wav"

??? i.export(path,format = "wav")

count += 1

step1.批量讀取音頻
將文件讀取部分代碼封裝為函數:定義文件讀取函數read_file(),傳入參數文件地址filePath,返回音頻對象wavsample。
再通過for循環批量讀取切分完的音頻文件,共12個音頻文件,循環范圍為0-11,即range(count)

代碼:

# 定義文件讀取函數read_file(),傳入參數文件地址filePath

def read_file(filePath):

??? # 使用 with...as 配合open函數以rb 方式,打開路徑為filePath的音頻

??? with open(filePath,"rb") as fp:

??????? # 使用read()函數讀取音頻賦值給wavsample

??????? wavsample = fp.read()

??????? # 返回音頻對象

??????? return wavsample

# 通過for循環批量讀取切分完的音頻文件

for i in range(count):##

??? wavsample = read_file("/Users/yequ/音頻片段"+str(i)+".wav")

??? # 輸出查看wavsample結果

print(wavsample)

step2批量讀取完音頻之后:
我們將實現“多段音頻文件的批量識別”的第二步——批量調用接口識別音頻

批量調用接口識別音頻:在for循環結果的循環體內,調用語音識別函數audio2text(),獲取語音識別結果,并輸出識別結果,實現批量調用接口識別音頻。

代碼:

# 通過for循環調用批量讀取切分完的音頻文件

for i in range(count):

??? # 調用文件讀取函數read_file(),讀取所有音頻片段文件

??? wavsample = read_file("/Users/yequ/音頻片段"+str(i)+".wav")

??? # 調用語音識別函數audio2text(),獲取語音識別結果

??? text = audio2text(wavsample)

??? # 輸出查看text

print(text)

代碼整理

將今日學習的代碼分為三個部分:
part1. 讀取文件函數
part2. 語音識別函數
part3. 調用函數批量識別音頻

本節課,我們學習了語音識別模型的結構和原理,同時調用創建好的AipSpeech客戶端實現了語音轉文字功能。
下節課,我們將學習視頻文件字幕格式,并通過代碼生成標準格式字幕文件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18533.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數組單調棧-901. 股票價格跨度、leetcode

單調棧作為一種數據結構在求解類遞增、遞減方面的題目中有較為廣泛的應用,在以往的leetcode中所見到的相關單調棧的題目均為單一元素,今天刷到901題目時,想到了將數組元素作為單調棧中元素的方法進行求解。 題目鏈接及描述 901. 股票價格跨…

【c++leetcode】69. Sqrt(x)

問題入口 二分搜索 最困難的是能否意識到用二分搜索法解題。 算術平方根的區間在[1, x] 。代碼如下&#xff1a; class Solution { public:int mySqrt(int x) {if (x 1 || x 0){return x;}int64_t start 1;int64_t end x;while (start < x){int64_t mid start (en…

開源模型應用落地-Gradio正確集成Fastapi-助力模型交互-實踐篇(二)

一、前言 Gradio提供了直觀的用戶界面,當與Fastapi結合后,用戶可以通過界面輕松地與模型進行交互,上傳數據、獲取推理結果等,使得交互性增強,提升了用戶體驗。 在開源大語言模型遍地開花的時代,正確的使用Gradio和Fastapi,通過兩者的集成,使得模型的部署和使用過程更加…

以果決其行,只為文化的傳承

從他們每一個人的身上&#xff0c;我們看到傳神的東西&#xff0c;就是他們都能用結果&#xff0c;去指引自己前進的方向&#xff0c;這正是我要解讀倪海廈老師的原因&#xff0c;看倪海廈2012年已經去世&#xff0c;到現在已經十幾年時間了&#xff0c;但是我們看現在自學中醫…

【Pandas】深入解析`pd.to_sql()`函數

【Pandas】深入解析pd.to_sql()函數 &#x1f308; 歡迎蒞臨我的個人主頁&#x1f448;這里是我深耕Python編程、機器學習和自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;并樂于分享知識與經驗的小天地&#xff01;&#x1f387; &#x1f393; 博主簡介&#xff1…

2024年第六屆中青杯數學建模競賽淺析

獲取比賽資料&#xff0c;請關注gzh“小何數模”&#xff01; 本次中青杯數學建模的賽題已正式出爐&#xff0c;無論是賽題難度還是認可度&#xff0c;該比賽都是僅次于數模國賽的獨一檔&#xff0c;可以用于國賽前的練手訓練。考慮到大家解題實屬不易&#xff0c;為了幫助大家…

JavaSE:StringBuilder和StringBuffer類

1、引言 在上一篇文章中&#xff0c;我們理解了字符串的常用方法&#xff0c;細心的同學大概已經發現&#xff0c;不管是將字符串中的字符轉變為大寫或小寫&#xff0c;或是完成字符串的替換&#xff0c;又或是去除空白字符等等&#xff0c;只要涉及到字符串的修改&#xff0c…

【PB案例學習筆記】-10 進度條使用

寫在前面 這是PB案例學習筆記系列文章的第10篇&#xff0c;該系列文章適合具有一定PB基礎的讀者。 通過一個個由淺入深的編程實戰案例學習&#xff0c;提高編程技巧&#xff0c;以保證小伙伴們能應付公司的各種開發需求。 文章中設計到的源碼&#xff0c;小凡都上傳到了gite…

Java用反射reflect來實例化對象: class.getDeclaredConstructor().newInstance()

Java用反射reflect來實例化對象: class.getDeclaredConstructor().newInstance() 從java9開始, class.newInstance()已過時, 被加上Deprecated強烈反對注解 SuppressWarnings("removal")CallerSensitiveDeprecated(since"9")public T newInstance()throws …

防止自動化攻擊的最佳實踐

防止自動化攻擊的最佳實踐 在當今的網絡安全環境中&#xff0c;保護用戶賬戶免受自動化攻擊已成為每個網站和應用程序的重要任務。攻擊者可以利用多種不同類型的自動化攻擊來嘗試破壞用戶賬戶。本文將詳細介紹常見的攻擊類型及其防御機制&#xff0c;幫助您更好地保護用戶賬戶…

C# ManualResetEvent的用法

在C#中&#xff0c;ManualResetEvent類是一個同步基元&#xff0c;用于控制多個線程的執行順序。下面是一些ManualResetEvent類的常見用法&#xff1a; 等待一個事件的發生&#xff1a;可以使用ManualResetEvent的WaitOne方法來等待事件的發生。當事件被觸發時&#xff0c;Wait…

adb 連接機頂盒命令

抓機頂盒日志的方法&#xff0c;使用此命令進行抓日志&#xff0c;個別無法抓日志的盒子可以使用此方法 1、安卓9.0版本查詢命令 ps -ef |grep com.cm.webos.iptv 2、安卓4.4版本查詢命令 ps |grep com.cm.webos.iptv 3、查詢順序&#xff1a;首先進入shell下進行操作 adb she…

C++青少年簡明教程:for循環語句

C青少年簡明教程&#xff1a;for循環語句 C的for循環語句是一種迭代控制語句&#xff0c;用于重復執行一段代碼。 語法格式&#xff1a; for(表達式1&#xff1b;表達式2&#xff1b;表達式3) 循環體 for循環語句執行流程圖&#xff1a; 不太好理解&#xff0c;請看下圖&am…

VSCode配置Lua5.4安裝

參考&#xff1a;VSCode 配置 Lua 開發環境(清晰明了)_lua vscode-CSDN博客 1.下載 Lua Binaries Download (sourceforge.net) 2.配置環境變量 解壓放到某文件夾&#xff1a; 環境變量&#xff1a; 3.VSCode安裝插件 4.配置 5.測試

Python | Leetcode Python題解之第116題填充每個節點的下一個右側節點指針

題目&#xff1a; 題解&#xff1a; class Solution:def connect(self, root: Node) -> Node:if not root:return root# 從根節點開始leftmost rootwhile leftmost.left:# 遍歷這一層節點組織成的鏈表&#xff0c;為下一層的節點更新 next 指針head leftmostwhile head:#…

快解析動態域名解析,實現外網訪問內網數據庫

今天跟大家分享一下如何借助快解析動態域名解析&#xff0c;在兩種特定網絡環境下&#xff0c;實現外網訪問內網mysql數據庫。 第1種網絡環境&#xff1a;路由器分配的是動態公網IP&#xff0c;且有路由器登錄管理權限。如何實現外網訪問內網mysql數據庫&#xff1f; 針對這種…

繼承與Object

一.繼承 Java語言的繼承&#xff1a;單繼承 1.類和類之間的關系 (1)組合關系 公司和員工&#xff0c;學校和學生 (2)繼承關系 學生和人 二.Object類 public class Object {private static native void registerNatives();static {registerNatives();} 1.finalize() 對象…

FPGA時鐘:驅動數字邏輯的核心

一、引言 在FPGA&#xff08;現場可編程門陣列&#xff09;設計中&#xff0c;時鐘信號是不可或缺的關鍵要素。時鐘信號作為時序邏輯的心跳&#xff0c;推動著FPGA內部各個存儲單元的數據流轉。無論是實現復雜的邏輯運算還是處理高速數據流&#xff0c;都需要精確的時鐘信號來保…

Vanna使用ollama分析本地MySQL數據庫

上一章節中已經實現了vanna的本地運行&#xff0c;但是大模型和數據庫都還是遠程的&#xff0c;因為也就沒辦法去訓練&#xff0c;這節一起來實現vanna分析本地mysql數據庫&#xff0c;因為要使用本地大模型&#xff0c;所以開始之前需要給本地安裝好大模型&#xff0c;我這里用…

WPF/C#:理解與實現WPF中的MVVM模式

MVVM模式的介紹 MVVM&#xff08;Model-View-ViewModel&#xff09;是一種設計模式&#xff0c;特別適用于WPF&#xff08;Windows Presentation Foundation&#xff09;等XAML-based的應用程序開發。MVVM模式主要包含三個部分&#xff1a;Model&#xff08;模型&#xff09;、…