最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

下面附上參考文章,這篇文章是通過(guò)識(shí)別出來(lái)的文字來(lái)打開(kāi)瀏覽器中的默認(rèn)網(wǎng)站。python通過(guò)調(diào)用百度api實(shí)現(xiàn)語(yǔ)音識(shí)別

題目很簡(jiǎn)單,利用語(yǔ)音識(shí)別識(shí)別說(shuō)出來(lái)的文字,根據(jù)文字的內(nèi)容來(lái)控制圖形移動(dòng),例如說(shuō)向上,識(shí)別出文字后,畫(huà)布上的圖形就會(huì)向上移動(dòng)。本文使用的是百度識(shí)別API(因?yàn)槊赓M(fèi)),自己做的流程圖:

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

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

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

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

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

錄音函數(shù)中使用了PyAudio庫(kù),是Python下的一個(gè)音頻處理模塊,用于將音頻流輸送到計(jì)算機(jī)聲卡上。在當(dāng)前文件夾打開(kāi)一個(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()
    # 打開(kāi)一個(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(這里要使用自己的)來(lái)組裝URL獲取token。在語(yǔ)音識(shí)別函數(shù)中調(diào)用獲取的token和已經(jīng)錄制好的音頻數(shù)據(jù),按照要求的格式來(lái)寫(xiě)進(jìn)JSON參數(shù)進(jìn)行上傳音頻。

百度語(yǔ)音要求對(duì)本地語(yǔ)音二進(jìn)制數(shù)據(jù)進(jìn)行base64編碼,使用base64庫(kù)來(lái)進(jìn)行編碼。創(chuàng)建識(shí)別請(qǐng)求使用的是POST方式來(lái)進(jìn)行提交,在識(shí)別函數(shù)中寫(xiě)入百度語(yǔ)音提供的短語(yǔ)音識(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
 
 
# 傳入語(yǔ)音二進(jìn)制數(shù)據(jù),token
# dev_pid為百度語(yǔ)音識(shí)別提供的幾種語(yǔ)言選擇,默認(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'  # 短語(yǔ)音識(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

最后我們編寫(xiě)控制移動(dòng)函數(shù),首先我們要知道如何來(lái)把控制圖形移動(dòng)來(lái)呈現(xiàn)出來(lái)。本項(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來(lái)設(shè)置一個(gè)畫(huà)布,并創(chuàng)建一個(gè)事件ID為1的矩形,把矩形放在畫(huà)布中顯示。在畫(huà)布中添加Button按鈕,回調(diào)中寫(xiě)入對(duì)應(yīng)的函數(shù),點(diǎn)擊觸發(fā)錄制音頻和語(yǔ)音識(shí)別。為了使代碼更加簡(jiǎn)潔,我們把移動(dòng)函數(shù)放在語(yǔ)音識(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("語(yǔ)音識(shí)別控制圖形移動(dòng)")
Button(tk, text="開(kāi)始錄音", command=AI.my_record).pack()
Button(tk, text="開(kāi)始識(shí)別", command=speech2text).pack()
canvas = Canvas(tk, width=500, height=500)  # 設(shè)置畫(huà)布
canvas.pack()  # 顯示畫(huà)布
r = canvas.create_rectangle(180, 180, 220, 220, fill="red")  # 事件ID為1
mainloop()

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

其實(shí)代碼寫(xiě)的十分麻煩,寫(xiě)在一個(gè)文件里會(huì)簡(jiǎn)單些,我畫(huà)了兩個(gè)文件的調(diào)用關(guān)系:

完整demo如下

AI.py

import wave  # 可讀、寫(xiě)wav類(lèi)型的音頻文件。
import requests  # 基于urllib,采?Apache2 Licensed開(kāi)源協(xié)議的 HTTP 庫(kù)。在本項(xiàng)目中用于傳遞headers和POST請(qǐng)求
import time
import base64  # 百度語(yǔ)音要求對(duì)本地語(yǔ)音二進(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()
    # 打開(kāi)一個(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
 
 
# 傳入語(yǔ)音二進(jìn)制數(shù)據(jù),token
# dev_pid為百度語(yǔ)音識(shí)別提供的幾種語(yǔ)言選擇,默認(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'  # 短語(yǔ)音識(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("語(yǔ)音識(shí)別控制圖形移動(dòng)")
Button(tk, text="開(kāi)始錄音", command=AI.my_record).pack()
Button(tk, text="開(kāi)始識(shí)別", command=speech2text).pack()
canvas = Canvas(tk, width=500, height=500)  # 設(shè)置畫(huà)布
canvas.pack()  # 顯示畫(huà)布
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)擊開(kāi)始錄音

點(diǎn)擊開(kāi)始識(shí)別

然后可以看到圖形往右移動(dòng)

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

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

相關(guān)文章

  • python的函數(shù)最詳解

    python的函數(shù)最詳解

    這篇文章主要介紹了詳解python中各種的函數(shù),是Python入門(mén)中的基礎(chǔ)知識(shí),需要的朋友可以參考下,希望能夠給你帶來(lái)幫助
    2021-10-10
  • 詳解Python中類(lèi)方法@classmethod的應(yīng)用技巧

    詳解Python中類(lèi)方法@classmethod的應(yīng)用技巧

    在Python中,類(lèi)方法(class method)是一種特殊的方法,可以在不創(chuàng)建類(lèi)的實(shí)例的情況下調(diào)用,本文將詳細(xì)介紹類(lèi)方法的概念、用法以及在實(shí)際開(kāi)發(fā)中的應(yīng)用場(chǎng)景,希望對(duì)大家有所幫助
    2024-03-03
  • python去除列表中的空值元素實(shí)戰(zhàn)技巧

    python去除列表中的空值元素實(shí)戰(zhàn)技巧

    這篇文章主要介紹了python實(shí)戰(zhàn)技巧之去除列表中的空值元素,搜集針對(duì)python高效處理數(shù)據(jù)的核心代碼,今天是實(shí)現(xiàn)去除列表中的空值元素,需要的朋友可以參考下
    2023-02-02
  • jupyter notebook 參數(shù)傳遞給shell命令行實(shí)例

    jupyter notebook 參數(shù)傳遞給shell命令行實(shí)例

    這篇文章主要介紹了jupyter notebook 參數(shù)傳遞給shell命令行實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • pytorch 實(shí)現(xiàn)二分類(lèi)交叉熵逆樣本頻率權(quán)重

    pytorch 實(shí)現(xiàn)二分類(lèi)交叉熵逆樣本頻率權(quán)重

    這篇文章主要介紹了pytorch 實(shí)現(xiàn)二分類(lèi)交叉熵逆樣本頻率權(quán)重的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python翻譯軟件實(shí)現(xiàn)代碼(使用google api完成)

    python翻譯軟件實(shí)現(xiàn)代碼(使用google api完成)

    這篇文章主要介紹了python結(jié)合google api完成的翻譯軟件實(shí)現(xiàn)代碼,大家參考使用
    2013-11-11
  • Python pass 語(yǔ)句使用示例

    Python pass 語(yǔ)句使用示例

    這篇文章主要介紹了Python pass 語(yǔ)句的使用方法示例,需要的朋友可以參考下
    2014-03-03
  • python格式的Caffe圖片數(shù)據(jù)均值計(jì)算學(xué)習(xí)

    python格式的Caffe圖片數(shù)據(jù)均值計(jì)算學(xué)習(xí)

    這篇文章主要為大家介紹了python格式的Caffe圖片數(shù)據(jù)均值計(jì)算學(xué)習(xí)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • python具名元組(namedtuple)的具體使用

    python具名元組(namedtuple)的具體使用

    本文主要介紹了python具名元組(namedtuple)的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python自動(dòng)化操作實(shí)現(xiàn)圖例繪制

    Python自動(dòng)化操作實(shí)現(xiàn)圖例繪制

    這篇文章主要介紹了Python自動(dòng)化操作實(shí)現(xiàn)圖例繪制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

克东县| 蓝田县| 牟定县| 科技| 宝山区| 乐平市| 韩城市| 平安县| 营口市| 三门县| 大足县| 汶川县| 静安区| 大兴区| 麻栗坡县| 湄潭县| 招远市| 东港市| 天门市| 泰宁县| 甘谷县| 开化县| 赤城县| 电白县| 临西县| 东至县| 遵义县| 白朗县| 利辛县| 周宁县| 丰台区| 侯马市| 图们市| 桐柏县| 朔州市| 河北区| 乌兰察布市| 汾阳市| 车险| 镇康县| 长沙市|