欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年12月07日 09:30:41   作者:蘭斯洛特.  
這篇文章主要介紹了通過Python實現(xiàn)創(chuàng)建語音識別控制系統(tǒng),能利用語音識別識別說出來的文字,根據(jù)文字的內(nèi)容來控制圖形移動,感興趣的同學可以關(guān)注一下

下面附上參考文章,這篇文章是通過識別出來的文字來打開瀏覽器中的默認網(wǎng)站。python通過調(diào)用百度api實現(xiàn)語音識別

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

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

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

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

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

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

錄音函數(shù)中使用了PyAudio庫,是Python下的一個音頻處理模塊,用于將音頻流輸送到計算機聲卡上。在當前文件夾打開一個新的音頻進行錄音并存放錄音數(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()
    # 打開一個新的音頻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è)置錄音時間(秒)
        # 循環(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ù)中調(diào)用獲取的token和已經(jīng)錄制好的音頻數(shù)據(jù),按照要求的格式來寫進JSON參數(shù)進行上傳音頻。

百度語音要求對本地語音二進制數(shù)據(jù)進行base64編碼,使用base64庫來進行編碼。創(chuàng)建識別請求使用的是POST方式來進行提交,在識別函數(shù)中寫入百度語音提供的短語音識別請求地址。識別結(jié)果會立刻返回,采用JSON格式進行封裝,識別結(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
 
 
# 傳入語音二進制數(shù)據(jù),token
# dev_pid為百度語音識別提供的幾種語言選擇,默認1537為有標點普通話
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'  # 短語音識別請求地址
    headers = {'Content-Type': 'application/json'}
    print('正在識別...')
    r = requests.post(url, json=data, headers=headers)
    Result = r.json()
    if 'result' in Result:
        return Result['result'][0]
    else:
        return Result

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

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

def move(result):
    print(result)
    if "向上" in result:
        canvas.move(1, 0, -30)  # 移動的是 ID為1的事物【move(2,0,-5)則移動ID為2的事物】,使得橫坐標加0,縱坐標減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("語音識別控制圖形移動")
Button(tk, text="開始錄音", command=AI.my_record).pack()
Button(tk, text="開始識別", 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()

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

其實代碼寫的十分麻煩,寫在一個文件里會簡單些,我畫了兩個文件的調(diào)用關(guān)系:

完整demo如下

AI.py

import wave  # 可讀、寫wav類型的音頻文件。
import requests  # 基于urllib,采?Apache2 Licensed開源協(xié)議的 HTTP 庫。在本項目中用于傳遞headers和POST請求
import time
import base64  # 百度語音要求對本地語音二進制數(shù)據(jù)進行base64編碼
from pyaudio import PyAudio, paInt16  # 音頻處理模塊,用于將音頻流輸送到計算機聲卡上
 
framerate = 16000  # 采樣率
num_samples = 2000  # 采樣點
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()
    # 打開一個新的音頻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è)置錄音時間(秒)
        # 循環(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
 
 
# 傳入語音二進制數(shù)據(jù),token
# dev_pid為百度語音識別提供的幾種語言選擇,默認1537為有標點普通話
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'  # 短語音識別請求地址
    headers = {'Content-Type': 'application/json'}
    print('正在識別...')
    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)  # 移動的是 ID為1的事物【move(2,0,-5)則移動ID為2的事物】,使得橫坐標加0,縱坐標減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("語音識別控制圖形移動")
Button(tk, text="開始錄音", command=AI.my_record).pack()
Button(tk, text="開始識別", 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)系

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

測試結(jié)果,運行

點擊開始錄音

點擊開始識別

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

經(jīng)測試,大吼效果更佳?

到此這篇關(guān)于基于Python創(chuàng)建語音識別控制系統(tǒng)的文章就介紹到這了,更多相關(guān)Python 語音識別控制系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python讀取xml文件方法解析

    python讀取xml文件方法解析

    這篇文章主要介紹了python讀取xml文件方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Python實現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫

    Python實現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫

    這篇文章主要介紹了Python實現(xiàn)將圖片轉(zhuǎn)換為ASCII字符畫,要將圖片轉(zhuǎn)換為字符圖其實很簡單,我們首先將圖片轉(zhuǎn)換為灰度圖像,這樣圖片的每個像素點的顏色值都是0到255,然后我們選用一些在文字矩形框內(nèi)占用面積從大到小的ASCII碼字符
    2022-08-08
  • Python人工智能學習PyTorch實現(xiàn)WGAN示例詳解

    Python人工智能學習PyTorch實現(xiàn)WGAN示例詳解

    這篇文章主要為大家介紹了人工智能學習PyTorch實現(xiàn)WGAN的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • Python小波變換去噪的原理解析

    Python小波變換去噪的原理解析

    這篇文章主要介紹了Python小波變換去噪,對于去噪效果好壞的評價,常用信號的信噪比(SNR)與估計信號同原始信號的均方根誤差(RMSE)來判斷,需要的朋友可以參考下
    2021-12-12
  • Python實戰(zhàn)之利用Geopandas算出每個省面積

    Python實戰(zhàn)之利用Geopandas算出每個省面積

    GeoPandas是一個基于pandas,針對地理數(shù)據(jù)做了特別支持的第三方模塊。本文將利用GeoPandas計算出每個省的面積,感興趣的小伙伴快跟隨小編一起學習一下吧
    2021-12-12
  • 基于PyQt5實現(xiàn)一個串口接數(shù)據(jù)波形顯示工具

    基于PyQt5實現(xiàn)一個串口接數(shù)據(jù)波形顯示工具

    這篇文章主要為大家詳細介紹了如何利用PyQt5實現(xiàn)一個串口接數(shù)據(jù)波形顯示工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-01-01
  • Python中等待5秒并暫停執(zhí)行的方法總結(jié)

    Python中等待5秒并暫停執(zhí)行的方法總結(jié)

    Python 具有各種功能和庫來創(chuàng)建交互式應(yīng)用程序,用戶可以在其中提供輸入和響應(yīng), 我們可以創(chuàng)建需要暫停應(yīng)用程序執(zhí)行的情況,本文主要和大家分享三個Python 中等待 5 秒并暫停執(zhí)行的方法,有需要的可以參考下
    2023-10-10
  • python 統(tǒng)計代碼耗時的幾種方法分享

    python 統(tǒng)計代碼耗時的幾種方法分享

    本文實例講述了Python中統(tǒng)計代碼片段、函數(shù)運行耗時的幾種方法,分享給大家,僅供參考。
    2021-04-04
  • 實例講解Python編程中@property裝飾器的用法

    實例講解Python編程中@property裝飾器的用法

    裝飾器中蘊含著很多Python的進階技巧,@property也不例外,比如文后會講到的快速進行代碼重構(gòu)的一個例子,這里我們就來以實例講解Python編程中@property裝飾器的用法:
    2016-06-06
  • Python3.7黑帽編程之病毒篇(基礎(chǔ)篇)

    Python3.7黑帽編程之病毒篇(基礎(chǔ)篇)

    這篇文章主要介紹了Python3.7黑帽編程之病毒篇(基礎(chǔ)篇),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02

最新評論