基于Python創(chuàng)建語音識(shí)別控制系統(tǒng)
下面附上參考文章,這篇文章是通過識(shí)別出來的文字來打開瀏覽器中的默認(rèn)網(wǎng)站。python通過調(diào)用百度api實(shí)現(xiàn)語音識(shí)別
題目很簡單,利用語音識(shí)別識(shí)別說出來的文字,根據(jù)文字的內(nèi)容來控制圖形移動(dòng),例如說向上,識(shí)別出文字后,畫布上的圖形就會(huì)向上移動(dòng)。本文使用的是百度識(shí)別API(因?yàn)槊赓M(fèi)),自己做的流程圖:
不多說,直接開始程序設(shè)計(jì),首先登錄百度云,創(chuàng)建應(yīng)用
注意這里的API Key和Secret Key,要用自己的才能生效
百度語音識(shí)別有對(duì)應(yīng)的文檔,具體調(diào)用方法說的很清晰,如果想學(xué)習(xí)一下可以查看REST API文檔
文檔寫的很詳細(xì),本文只說明用到的方法,語音識(shí)別使用方法為組裝URL獲取token,然后處理本地音頻以JSON格式發(fā)送到百度語音識(shí)別服務(wù)器,獲得返回結(jié)果。
百度語音識(shí)別支持pcm、wav等多種格式,百度服務(wù)端會(huì)將非pcm格式轉(zhuǎn)成pcm格式,因此使用wav、amr格式會(huì)有額外的轉(zhuǎn)換耗時(shí)。保存為pcm格式可以識(shí)別,只是windows自帶播放器識(shí)別不了pcm格式的,所以改用wav格式,同時(shí)要引用wave庫,功能為可讀、寫wav類型的音頻文件。采樣率使用了pcm采樣率16000固定值,編碼為16bit位深的單聲道。
錄音函數(shù)中使用了PyAudio庫,是Python下的一個(gè)音頻處理模塊,用于將音頻流輸送到計(jì)算機(jī)聲卡上。在當(dāng)前文件夾打開一個(gè)新的音頻進(jìn)行錄音并存放錄音數(shù)據(jù)。本地錄音:
def save_wave_file(filepath, data): wf = wave.open(filepath, 'wb') wf.setnchannels(channels) wf.setsampwidth(sampwidth) wf.setframerate(framerate) wf.writeframes(b''.join(data)) wf.close() # 錄音 def my_record(): pa = PyAudio() # 打開一個(gè)新的音頻stream stream = pa.open(format=paInt16, channels=channels, rate=framerate, input=True, frames_per_buffer=num_samples) my_buf = [] # 存放錄音數(shù)據(jù) t = time.time() print('正在錄音...') while time.time() < t + 5: # 設(shè)置錄音時(shí)間(秒) # 循環(huán)read,每次read 2000frames string_audio_data = stream.read(num_samples) my_buf.append(string_audio_data) print('錄音結(jié)束.') save_wave_file(FILEPATH, my_buf) stream.close()
然后是獲取token,根據(jù)創(chuàng)建應(yīng)用得到的APIKey和SecreKey(這里要使用自己的)來組裝URL獲取token。在語音識(shí)別函數(shù)中調(diào)用獲取的token和已經(jīng)錄制好的音頻數(shù)據(jù),按照要求的格式來寫進(jìn)JSON參數(shù)進(jìn)行上傳音頻。
百度語音要求對(duì)本地語音二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼,使用base64庫來進(jìn)行編碼。創(chuàng)建識(shí)別請(qǐng)求使用的是POST方式來進(jìn)行提交,在識(shí)別函數(shù)中寫入百度語音提供的短語音識(shí)別請(qǐng)求地址。識(shí)別結(jié)果會(huì)立刻返回,采用JSON格式進(jìn)行封裝,識(shí)別結(jié)果放在 JSON 的 “result” 字段中,統(tǒng)一采用 utf-8 方式編碼。
# 組裝url獲取token base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" APIKey = "*****************" SecretKey = "********************" HOST = base_url % (APIKey, SecretKey) def getToken(host): res = requests.post(host) r = res.json()['access_token'] return r # 傳入語音二進(jìn)制數(shù)據(jù),token # dev_pid為百度語音識(shí)別提供的幾種語言選擇,默認(rèn)1537為有標(biāo)點(diǎn)普通話 def speech2text(speech_data, token, dev_pid=1537): FORMAT = 'wav' RATE = '16000' CHANNEL = 1 CUID = '*******' SPEECH = base64.b64encode(speech_data).decode('utf-8') data = { 'format': FORMAT, 'rate': RATE, 'channel': CHANNEL, 'cuid': CUID, 'len': len(speech_data), 'speech': SPEECH, 'token': token, 'dev_pid': dev_pid } url = 'https://vop.baidu.com/server_api' # 短語音識(shí)別請(qǐng)求地址 headers = {'Content-Type': 'application/json'} print('正在識(shí)別...') r = requests.post(url, json=data, headers=headers) Result = r.json() if 'result' in Result: return Result['result'][0] else: return Result
最后我們編寫控制移動(dòng)函數(shù),首先我們要知道如何來把控制圖形移動(dòng)來呈現(xiàn)出來。本項(xiàng)目中我們使用的是tkinter模塊,Tkinter是一個(gè)python模塊,是一個(gè)調(diào)用Tcl/Tk的接口,它是一個(gè)跨平臺(tái)的腳本圖形界面接口。是一個(gè)比較流行的python圖形編程接口。最大的特點(diǎn)是跨平臺(tái),缺點(diǎn)是性能不太好,執(zhí)行速度慢。
我們利用tkinter中的canvas來設(shè)置一個(gè)畫布,并創(chuàng)建一個(gè)事件ID為1的矩形,把矩形放在畫布中顯示。在畫布中添加Button按鈕,回調(diào)中寫入對(duì)應(yīng)的函數(shù),點(diǎn)擊觸發(fā)錄制音頻和語音識(shí)別。為了使代碼更加簡潔,我們把移動(dòng)函數(shù)放在語音識(shí)別函數(shù)中調(diào)用,返回識(shí)別結(jié)果后對(duì)結(jié)果做出判斷,最后使圖形進(jìn)行移動(dòng)。
def move(result): print(result) if "向上" in result: canvas.move(1, 0, -30) # 移動(dòng)的是 ID為1的事物【move(2,0,-5)則移動(dòng)ID為2的事物】,使得橫坐標(biāo)加0,縱坐標(biāo)減30 elif "向下" in result: canvas.move(1, 0, 30) elif "向左" in result: canvas.move(1, -30, 0) elif "向右" in result: canvas.move(1, 30, 0) tk = Tk() tk.title("語音識(shí)別控制圖形移動(dòng)") Button(tk, text="開始錄音", command=AI.my_record).pack() Button(tk, text="開始識(shí)別", command=speech2text).pack() canvas = Canvas(tk, width=500, height=500) # 設(shè)置畫布 canvas.pack() # 顯示畫布 r = canvas.create_rectangle(180, 180, 220, 220, fill="red") # 事件ID為1 mainloop()
個(gè)人習(xí)慣,我把語音識(shí)別和圖形控制寫在了兩個(gè)文件里,這就導(dǎo)致main.py文件中沒有辦法使用AI.py文件函數(shù)中的返回值,因?yàn)槲覀兪褂玫膖kinter模塊是不斷循壞的,通過mainloop()才能結(jié)束循環(huán),這樣不斷循壞就調(diào)用不了返回值,使用的方法是在main.py中重新構(gòu)建一樣函數(shù)來調(diào)用AI.py文件中的函數(shù),并聲明全局變量,把AI.py文件中的返回值放在main.py文件的全局變量中,這樣就得到了返回值,再將函數(shù)寫到Button回調(diào)中就實(shí)現(xiàn)了對(duì)應(yīng)的功能。
其實(shí)代碼寫的十分麻煩,寫在一個(gè)文件里會(huì)簡單些,我畫了兩個(gè)文件的調(diào)用關(guān)系:
完整demo如下
AI.py
import wave # 可讀、寫wav類型的音頻文件。 import requests # 基于urllib,采?Apache2 Licensed開源協(xié)議的 HTTP 庫。在本項(xiàng)目中用于傳遞headers和POST請(qǐng)求 import time import base64 # 百度語音要求對(duì)本地語音二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼 from pyaudio import PyAudio, paInt16 # 音頻處理模塊,用于將音頻流輸送到計(jì)算機(jī)聲卡上 framerate = 16000 # 采樣率 num_samples = 2000 # 采樣點(diǎn) channels = 1 # 聲道 sampwidth = 2 # 采樣寬度2bytes FILEPATH = 'speech.wav' # 組裝url獲取token base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" APIKey = "8bv3inF5roWBtEXYpZViCs39" SecretKey = "HLXYiLGCpeOD6ddF1m6BvwcDZVOYtwwD" HOST = base_url % (APIKey, SecretKey) def getToken(host): res = requests.post(host) r = res.json()['access_token'] return r def save_wave_file(filepath, data): wf = wave.open(filepath, 'wb') wf.setnchannels(channels) wf.setsampwidth(sampwidth) wf.setframerate(framerate) wf.writeframes(b''.join(data)) wf.close() # 錄音 def my_record(): pa = PyAudio() # 打開一個(gè)新的音頻stream stream = pa.open(format=paInt16, channels=channels, rate=framerate, input=True, frames_per_buffer=num_samples) my_buf = [] # 存放錄音數(shù)據(jù) t = time.time() print('正在錄音...') while time.time() < t + 5: # 設(shè)置錄音時(shí)間(秒) # 循環(huán)read,每次read 2000frames string_audio_data = stream.read(num_samples) my_buf.append(string_audio_data) print('錄音結(jié)束.') save_wave_file(FILEPATH, my_buf) stream.close() def get_audio(file): with open(file, 'rb') as f: data = f.read() return data # 傳入語音二進(jìn)制數(shù)據(jù),token # dev_pid為百度語音識(shí)別提供的幾種語言選擇,默認(rèn)1537為有標(biāo)點(diǎn)普通話 def speech2text(speech_data, token, dev_pid=1537): FORMAT = 'wav' RATE = '16000' CHANNEL = 1 CUID = '*******' SPEECH = base64.b64encode(speech_data).decode('utf-8') data = { 'format': FORMAT, 'rate': RATE, 'channel': CHANNEL, 'cuid': CUID, 'len': len(speech_data), 'speech': SPEECH, 'token': token, 'dev_pid': dev_pid } url = 'https://vop.baidu.com/server_api' # 短語音識(shí)別請(qǐng)求地址 headers = {'Content-Type': 'application/json'} print('正在識(shí)別...') r = requests.post(url, json=data, headers=headers) Result = r.json() if 'result' in Result: return Result['result'][0] else: return Result
main.py
import AI from tkinter import * # 導(dǎo)入tkinter模塊的所有內(nèi)容 token = None speech = None result = None def getToken(): temptoken = AI.getToken(AI.HOST) return temptoken def speech2text(): global token if token is None: token = getToken() speech = AI.get_audio(AI.FILEPATH) result = AI.speech2text(speech, token, dev_pid=1537) print(result) move(result) def move(result): print(result) if "向上" in result: canvas.move(1, 0, -30) # 移動(dòng)的是 ID為1的事物【move(2,0,-5)則移動(dòng)ID為2的事物】,使得橫坐標(biāo)加0,縱坐標(biāo)減30 elif "向下" in result: canvas.move(1, 0, 30) elif "向左" in result: canvas.move(1, -30, 0) elif "向右" in result: canvas.move(1, 30, 0) tk = Tk() tk.title("語音識(shí)別控制圖形移動(dòng)") Button(tk, text="開始錄音", command=AI.my_record).pack() Button(tk, text="開始識(shí)別", command=speech2text).pack() canvas = Canvas(tk, width=500, height=500) # 設(shè)置畫布 canvas.pack() # 顯示畫布 r = canvas.create_rectangle(180, 180, 220, 220, fill="red") # 事件ID為1 mainloop()
文件關(guān)系
錄制的音頻會(huì)自動(dòng)保存在當(dāng)前文件夾下,就是speech文件
測(cè)試結(jié)果,運(yùn)行
點(diǎn)擊開始錄音
點(diǎn)擊開始識(shí)別
然后可以看到圖形往右移動(dòng)
經(jīng)測(cè)試,大吼效果更佳?
到此這篇關(guān)于基于Python創(chuàng)建語音識(shí)別控制系統(tǒng)的文章就介紹到這了,更多相關(guān)Python 語音識(shí)別控制系統(tǒng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python實(shí)現(xiàn)語音識(shí)別和語音合成功能
- python之語音識(shí)別speech模塊
- python3實(shí)現(xiàn)語音轉(zhuǎn)文字(語音識(shí)別)和文字轉(zhuǎn)語音(語音合成)
- python語音識(shí)別的轉(zhuǎn)換方法
- 基于Python實(shí)現(xiàn)語音識(shí)別和語音轉(zhuǎn)文字
- python語音識(shí)別whisper的使用
- Linux下利用python實(shí)現(xiàn)語音識(shí)別詳細(xì)教程
- 基于Python實(shí)現(xiàn)語音識(shí)別功能
- Python實(shí)現(xiàn)語音識(shí)別vosk的示例代碼
相關(guān)文章
Python實(shí)現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫
這篇文章主要介紹了Python實(shí)現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫,要將圖片轉(zhuǎn)換為字符圖其實(shí)很簡單,我們首先將圖片轉(zhuǎn)換為灰度圖像,這樣圖片的每個(gè)像素點(diǎn)的顏色值都是0到255,然后我們選用一些在文字矩形框內(nèi)占用面積從大到小的ASCII碼字符2022-08-08Python人工智能學(xué)習(xí)PyTorch實(shí)現(xiàn)WGAN示例詳解
這篇文章主要為大家介紹了人工智能學(xué)習(xí)PyTorch實(shí)現(xiàn)WGAN的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11Python實(shí)戰(zhàn)之利用Geopandas算出每個(gè)省面積
GeoPandas是一個(gè)基于pandas,針對(duì)地理數(shù)據(jù)做了特別支持的第三方模塊。本文將利用GeoPandas計(jì)算出每個(gè)省的面積,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧2021-12-12基于PyQt5實(shí)現(xiàn)一個(gè)串口接數(shù)據(jù)波形顯示工具
這篇文章主要為大家詳細(xì)介紹了如何利用PyQt5實(shí)現(xiàn)一個(gè)串口接數(shù)據(jù)波形顯示工具,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01Python中等待5秒并暫停執(zhí)行的方法總結(jié)
Python 具有各種功能和庫來創(chuàng)建交互式應(yīng)用程序,用戶可以在其中提供輸入和響應(yīng), 我們可以創(chuàng)建需要暫停應(yīng)用程序執(zhí)行的情況,本文主要和大家分享三個(gè)Python 中等待 5 秒并暫停執(zhí)行的方法,有需要的可以參考下2023-10-10python 統(tǒng)計(jì)代碼耗時(shí)的幾種方法分享
本文實(shí)例講述了Python中統(tǒng)計(jì)代碼片段、函數(shù)運(yùn)行耗時(shí)的幾種方法,分享給大家,僅供參考。2021-04-04實(shí)例講解Python編程中@property裝飾器的用法
裝飾器中蘊(yùn)含著很多Python的進(jìn)階技巧,@property也不例外,比如文后會(huì)講到的快速進(jìn)行代碼重構(gòu)的一個(gè)例子,這里我們就來以實(shí)例講解Python編程中@property裝飾器的用法:2016-06-06