成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基于Python創(chuàng)建語音識別控制系統(tǒng)

開發(fā) 后端
這篇文章主要介紹了通過Python實現創(chuàng)建語音識別控制系統(tǒng),能利用語音識別識別說出來的文字,根據文字的內容來控制圖形移動,感興趣的同學可以關注一下

 前言:

[[439352]]

這篇文章主要介紹了通過Python實現創(chuàng)建語音識別控制系統(tǒng),能利用語音識別識別說出來的文字,根據文字的內容來控制圖形移動,感興趣的同學可以關注一下

利用語音識別識別說出來的文字,根據文字的內容來控制圖形移動,例如說向上,識別出文字后,畫布上的圖形就會向上移動。本文使用的是百度識別API(因為免費),自己做的流程圖:

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

不多說,直接開始程序設計,首先登錄百度云,創(chuàng)建應用

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

注意這里的API Key和Secret Key,要用自己的才能生效

百度語音識別有對應的文檔,具體調用方法說的很清晰,如果想學習一下可以查看REST API文檔

文檔寫的很詳細,本文只說明用到的方法,語音識別使用方法為組裝URL獲取token,然后處理本地音頻以JSON格式發(fā)送到百度語音識別服務器,獲得返回結果。

百度語音識別支持pcm、wav等多種格式,百度服務端會將非pcm格式轉成pcm格式,因此使用wav、amr格式會有額外的轉換耗時。保存為pcm格式可以識別,只是windows自帶播放器識別不了pcm格式的,所以改用wav格式,同時要引用wave庫,功能為可讀、寫wav類型的音頻文件。采樣率使用了pcm采樣率16000固定值,編碼為16bit位深得單聲道。

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

錄音函數中使用了PyAudio庫,是Python下的一個音頻處理模塊,用于將音頻流輸送到計算機聲卡上。在當前文件夾打開一個新的音頻進行錄音并存放錄音數據。本地錄音:

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

然后是獲取token,根據創(chuàng)建應用得到的APIKey和SecreKey(這里要使用自己的)來組裝URL獲取token。在語音識別函數中調用獲取的token和已經錄制好的音頻數據,按照要求的格式來寫進JSON參數進行上傳音頻。

百度語音要求對本地語音二進制數據進行base64編碼,使用base64庫來進行編碼。創(chuàng)建識別請求使用的是POST方式來進行提交,在識別函數中寫入百度語音提供的短語音識別請求地址。識別結果會立刻返回,采用JSON格式進行封裝,識別結果放在 JSON 的 “result” 字段中,統(tǒng)一采用 utf-8 方式編碼。

 

  1. # 組裝url獲取token 
  2. base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" 
  3. APIKey = "*****************" 
  4. SecretKey = "********************" 
  5. HOST = base_url % (APIKey, SecretKey) 
  6.    
  7.    
  8. def getToken(host): 
  9.     res = requests.post(host) 
  10.     r = res.json()['access_token'
  11.     return r 
  12.    
  13.    
  14. # 傳入語音二進制數據,token 
  15. # dev_pid為百度語音識別提供的幾種語言選擇,默認1537為有標點普通話 
  16. def speech2text(speech_data, token, dev_pid=1537): 
  17.     FORMAT = 'wav' 
  18.     RATE = '16000' 
  19.     CHANNEL = 1 
  20.     CUID = '*******' 
  21.     SPEECH = base64.b64encode(speech_data).decode('utf-8'
  22.     data = { 
  23.         'format': FORMAT, 
  24.         'rate': RATE, 
  25.         'channel': CHANNEL, 
  26.         'cuid': CUID, 
  27.         'len': len(speech_data), 
  28.         'speech': SPEECH, 
  29.         'token': token, 
  30.         'dev_pid': dev_pid 
  31.     } 
  32.     url = 'https://vop.baidu.com/server_api'  # 短語音識別請求地址 
  33.     headers = {'Content-Type''application/json'
  34.     print('正在識別...'
  35.     r = requests.post(url, json=data, headers=headers) 
  36.     Result = r.json() 
  37.     if 'result' in Result: 
  38.         return Result['result'][0] 
  39.     else
  40.         return Result 

 

最后我們編寫控制移動函數,首先我們要知道如何來把控制圖形移動來呈現出來。本項目中我們使用的是tkinter模塊,Tkinter是一個python模塊,是一個調用Tcl/Tk的接口,它是一個跨平臺的腳本圖形界面接口。是一個比較流行的python圖形編程接口。最大的特點是跨平臺,缺點是性能不太好,執(zhí)行速度慢。

我們利用tkinter中的canvas來設置一個畫布,并創(chuàng)建一個事件ID為1的矩形,把矩形放在畫布中顯示。在畫布中添加Button按鈕,回調中寫入對應的函數,點擊觸發(fā)錄制音頻和語音識別。為了使代碼更加簡潔,我們把移動函數放在語音識別函數中調用,返回識別結果后對結果做出判斷,最后使圖形進行移動。

 

  1. def move(result): 
  2.     print(result) 
  3.     if "向上" in result: 
  4.         canvas.move(1, 0, -30)  # 移動的是 ID為1的事物【move(2,0,-5)則移動ID為2的事物】,使得橫坐標加0,縱坐標減30 
  5.     elif "向下" in result: 
  6.         canvas.move(1, 0, 30) 
  7.     elif "向左" in result: 
  8.         canvas.move(1, -30, 0) 
  9.     elif "向右" in result: 
  10.         canvas.move(1, 30, 0) 
  11.    
  12.    
  13. tk = Tk() 
  14. tk.title("語音識別控制圖形移動"
  15. Button(tk, text="開始錄音", command=AI.my_record).pack() 
  16. Button(tk, text="開始識別", command=speech2text).pack() 
  17. canvas = Canvas(tk, width=500, height=500)  # 設置畫布 
  18. canvas.pack()  # 顯示畫布 
  19. r = canvas.create_rectangle(180, 180, 220, 220, fill="red")  # 事件ID為1 
  20. mainloop() 

 

個人習慣,我把語音識別和圖形控制寫在了兩個文件里,這就導致main.py文件中沒有辦法使用AI.py文件函數中的返回值,因為我們使用的tkinter模塊是不斷循壞的,通過mainloop()才能結束循環(huán),這樣不斷循壞就調用不了返回值,使用的方法是在main.py中重新構建一樣函數來調用AI.py文件中的函數,并聲明全局變量,把AI.py文件中的返回值放在main.py文件的全局變量中,這樣就得到了返回值,再將函數寫到Button回調中就實現了對應的功能。

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

其實代碼寫得十分麻煩,寫在一個文件里會簡單些,我畫了兩個文件的調用關系:

完整demo如下

AI.py

 

  1. import wave  # 可讀、寫wav類型的音頻文件。 
  2. import requests  # 基于urllib,采⽤Apache2 Licensed開源協(xié)議的 HTTP 庫。在本項目中用于傳遞headers和POST請求 
  3. import time 
  4. import base64  # 百度語音要求對本地語音二進制數據進行base64編碼 
  5. from pyaudio import PyAudio, paInt16  # 音頻處理模塊,用于將音頻流輸送到計算機聲卡上 
  6.    
  7. framerate = 16000  # 采樣率 
  8. num_samples = 2000  # 采樣點 
  9. channels = 1  # 聲道 
  10. sampwidth = 2  # 采樣寬度2bytes 
  11. FILEPATH = 'speech.wav' 
  12.    
  13. # 組裝url獲取token 
  14. base_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=%s&client_secret=%s" 
  15. APIKey = "8bv3inF5roWBtEXYpZViCs39" 
  16. SecretKey = "HLXYiLGCpeOD6ddF1m6BvwcDZVOYtwwD" 
  17. HOST = base_url % (APIKey, SecretKey) 
  18.    
  19.    
  20. def getToken(host): 
  21.     res = requests.post(host) 
  22.     r = res.json()['access_token'
  23.     return r 
  24.    
  25.    
  26. def save_wave_file(filepath, data): 
  27.     wf = wave.open(filepath, 'wb'
  28.     wf.setnchannels(channels) 
  29.     wf.setsampwidth(sampwidth) 
  30.     wf.setframerate(framerate) 
  31.     wf.writeframes(b''.join(data)) 
  32.     wf.close() 
  33.    
  34.    
  35. # 錄音 
  36. def my_record(): 
  37.     pa = PyAudio() 
  38.     # 打開一個新的音頻stream 
  39.     stream = pa.open(format=paInt16, channels=channels, 
  40.                      rate=framerate, input=True, frames_per_buffer=num_samples) 
  41.     my_buf = []  # 存放錄音數據 
  42.     t = time.time() 
  43.     print('正在錄音...'
  44.     while time.time() < t + 5:  # 設置錄音時間(秒) 
  45.         # 循環(huán)read,每次read 2000frames 
  46.         string_audio_data = stream.read(num_samples) 
  47.         my_buf.append(string_audio_data) 
  48.     print('錄音結束.'
  49.     save_wave_file(FILEPATH, my_buf) 
  50.     stream.close() 
  51.    
  52.    
  53. def get_audio(file): 
  54.     with open(file, 'rb'as f: 
  55.         data = f.read() 
  56.     return data 
  57.    
  58.    
  59. # 傳入語音二進制數據,token 
  60. # dev_pid為百度語音識別提供的幾種語言選擇,默認1537為有標點普通話 
  61. def speech2text(speech_data, token, dev_pid=1537): 
  62.     FORMAT = 'wav' 
  63.     RATE = '16000' 
  64.     CHANNEL = 1 
  65.     CUID = '*******' 
  66.     SPEECH = base64.b64encode(speech_data).decode('utf-8'
  67.     data = { 
  68.         'format': FORMAT, 
  69.         'rate': RATE, 
  70.         'channel': CHANNEL, 
  71.         'cuid': CUID, 
  72.         'len': len(speech_data), 
  73.         'speech': SPEECH, 
  74.         'token': token, 
  75.         'dev_pid': dev_pid 
  76.     } 
  77.     url = 'https://vop.baidu.com/server_api'  # 短語音識別請求地址 
  78.     headers = {'Content-Type''application/json'
  79.     print('正在識別...'
  80.     r = requests.post(url, json=data, headers=headers) 
  81.     Result = r.json() 
  82.     if 'result' in Result: 
  83.         return Result['result'][0] 
  84.     else
  85.         return Result 

main.py

 

  1. import AI 
  2. from tkinter import *  # 導入tkinter模塊的所有內容 
  3.    
  4. token = None 
  5. speech = None 
  6. result = None 
  7.    
  8.    
  9. def getToken(): 
  10.     temptoken = AI.getToken(AI.HOST) 
  11.     return temptoken 
  12.    
  13.    
  14. def speech2text(): 
  15.     global token 
  16.     if token is None: 
  17.         token = getToken() 
  18.     speech = AI.get_audio(AI.FILEPATH) 
  19.     result = AI.speech2text(speech, token, dev_pid=1537) 
  20.     print(result) 
  21.     move(result) 
  22.    
  23.    
  24. def move(result): 
  25.     print(result) 
  26.     if "向上" in result: 
  27.         canvas.move(1, 0, -30)  # 移動的是 ID為1的事物【move(2,0,-5)則移動ID為2的事物】,使得橫坐標加0,縱坐標減30 
  28.     elif "向下" in result: 
  29.         canvas.move(1, 0, 30) 
  30.     elif "向左" in result: 
  31.         canvas.move(1, -30, 0) 
  32.     elif "向右" in result: 
  33.         canvas.move(1, 30, 0) 
  34.    
  35.    
  36. tk = Tk() 
  37. tk.title("語音識別控制圖形移動"
  38. Button(tk, text="開始錄音", command=AI.my_record).pack() 
  39. Button(tk, text="開始識別", command=speech2text).pack() 
  40. canvas = Canvas(tk, width=500, height=500)  # 設置畫布 
  41. canvas.pack()  # 顯示畫布 
  42. r = canvas.create_rectangle(180, 180, 220, 220, fill="red")  # 事件ID為1 
  43. mainloop() 

文件關系

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

錄制的音頻會自動保存在當前文件夾下,就是speech文件

測試結果,運行

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

點擊開始錄音

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

點擊開始識別

 

基于Python創(chuàng)建語音識別控制系統(tǒng)

 

然后可以看到圖形往右移動

 

 

經測試,大吼效果更佳

到此這篇關于基于Python創(chuàng)建語音識別控制系統(tǒng)的文章就介紹到這了!

責任編輯:華軒 來源: 今日頭條
相關推薦

2022-09-05 15:14:11

語音識別模塊智能家居

2010-06-04 09:33:34

電子訪問控制生物識別身份驗證

2009-04-01 17:58:28

MercurialPython版本控制

2020-03-04 10:51:35

Python算法腳本語言

2009-03-23 09:53:47

LinuxGNOMEGit版本

2022-03-17 00:07:00

工業(yè)控制系統(tǒng)

2020-09-27 09:50:35

自動化

2014-06-23 10:22:18

2011-04-08 18:00:19

GitSubversion版本控制系統(tǒng)

2023-05-24 14:58:23

2017-09-01 06:45:37

2023-10-16 12:42:00

物聯(lián)網IOT

2020-06-15 10:53:16

工控安全工業(yè)控制網絡安全

2021-02-04 06:54:09

DevOpsGitLab系統(tǒng)

2010-09-14 14:22:22

2023-10-24 20:41:28

物聯(lián)網控制系統(tǒng)

2020-11-02 17:28:51

人臉識別技術數據

2025-06-27 05:00:00

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

2023-07-31 10:15:14

物聯(lián)網智能家居

2014-07-31 16:22:38

githubLinux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品成人一区 | 亚洲午夜精品视频 | 在线成人免费视频 | 亚洲精品国产一区 | 在线国产欧美 | 国产亚洲精品精品国产亚洲综合 | 精品乱码一区二区三四区 | 精品国产乱码久久久久久蜜退臀 | 国产成人在线一区二区 | 欧美性jizz18性欧美 | 欧美日韩国产在线 | 美女爽到呻吟久久久久 | 久久精品免费观看 | 久草资源网站 | 欧美一区二区三区在线播放 | 亚洲欧美一区二区三区1000 | 青娱乐国产 | 国产精品福利视频 | 日日干日日操 | 精品久久久久久 | 黄色网址av | 男女污污网站 | 中文字幕四虎 | 成人免费视频 | 久久精品女人天堂av | 国产乱人伦精品一区二区 | www.免费看片.com | 中文在线a在线 | 久久国产精品视频观看 | 日韩欧美三区 | 久草视| 国产精品免费播放 | 中文字幕免费观看 | 日韩在线国产 | 99亚洲国产精品 | 欧美日韩精品一区二区三区蜜桃 | 一级a性色生活片久久毛片波多野 | 欧美另类视频 | 最新中文字幕在线 | 亚洲视频二区 | 久久精品久久综合 |