Python實時語音識別控制


代碼地址如下:
http://www.demodashi.com/demo/12946.html

Python實時語音識別控制

概述

本文中的語音識別功能采用 百度語音識別庫 ,首先利用 PyAudio 庫錄制語音指令,保存為受支持的 wav 音頻文件,然后利用 百度語音識別庫 提供的方法實現語音識別,最后檢測識別結果,利用 PyUserInput 庫提供的方法模擬控制web頁面滾動。
百度語音識別為開發者提供業界優質且免費的語音服務,通過場景識別優化,為車載導航,智能家居和社交聊天等行業提供語音解決方案,准確率達到90%以上,讓您的應用繪“聲”繪色。

百度語音AI

准備工作

安裝百度語音識別SDK

pip install baidu-aip

安裝Python音頻處理庫 PyAudio

python -m pip install pyaudio

安裝鼠標控制庫 PyUserInput

pip install pyuserinput

PyUserInput 庫依賴另外兩個庫 pywin32pyHook ,需要單獨安裝。
安裝方法可以參考下面這篇文章:Win10 Python3.5安裝PyUserInput

令附文中提到的資源下載鏈接:lfd-pythonlibs

另外文中提到的兩個包, 需要根據自己的系統和python版本來選擇。

如果系統是64位的,就要選擇帶 amd64 的。

如果python版本為python3.7的,就要選擇帶 cp37 的。

比如:pywin32-223-cp37-cp37m-win_amd64.whl
pyHook-1.5.1-cp37-cp37m-win_amd64.whl

申請百度開發者帳號

參考下面鏈接中的文章注冊百度帳號,完成開發者認證,創建應用,獲取密鑰
百度AI開放平台接入流程

用Pyaudio庫錄制音頻

Pyaudio 是一個非常強大的音頻處理庫,簡單幾行代碼即可實現音頻播放,錄制等功能.
百度語音識別API支持的語音格式有: pcm(不壓縮)wav(不壓縮,pcm編碼)amr(壓縮格式).
推薦 pcm , 采樣率: 16000 固定值, 編碼: 16bit , 位深: 單聲道 .百度服務端會將非pcm格式, 轉為pcm格式, 因此使用wav, amr會有額外的轉換耗時.
為了實現實時語音識別功能, 這里通過pyaudio錄制一段wav格式的音頻, 報文成wav音頻文件, 供后續識別時調用.

# 用Pyaudio庫錄制音頻
#   out_file:輸出音頻文件名
#   rec_time:音頻錄制時間(秒)
def audio_record(out_file, rec_time):
    CHUNK = 1024
    FORMAT = pyaudio.paInt16 #16bit編碼格式
    CHANNELS = 1 #單聲道
    RATE = 16000 #16000采樣頻率
    
    p = pyaudio.PyAudio()
    # 創建音頻流 
    stream = p.open(format=FORMAT, # 音頻流wav格式
                    channels=CHANNELS, # 單聲道
                    rate=RATE, # 采樣率16000
                    input=True,
                    frames_per_buffer=CHUNK)

    print("Start Recording...")

    frames = [] # 錄制的音頻流
    # 錄制音頻數據
    for i in range(0, int(RATE / CHUNK * rec_time)):
        data = stream.read(CHUNK)
        frames.append(data)
    
    # 錄制完成
    stream.stop_stream()
    stream.close()
    p.terminate()

    print("Recording Done...")

    # 保存音頻文件
    wf = wave.open(out_file, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()

調用百度語音API

# 讀取paudio錄制好的音頻文件, 調用百度語音API, 設置api參數, 完成語音識別
#    client:AipSpeech對象
#    afile:音頻文件
#    afmt:音頻文件格式(wav)
def aip_get_asrresult(client, afile, afmt):
    # 選項參數:
    # cuid    String  用戶唯一標識,用來區分用戶,填寫機器 MAC 地址或 IMEI 碼,長度為60以內
    # dev_pid String  語言類型(見下表), 默認1537(普通話 輸入法模型)
    # 識別結果已經被SDK由JSON字符串轉為dict
    result = client.asr(get_file_content(afile), afmt, 16000, {"cuid": CUID, "dev_pid": DEV_PID,})
    #print(result)
    # 如果err_msg字段為"success."表示識別成功, 直接從result字段中提取識別結果, 否則表示識別失敗
    if result["err_msg"] == "success.": 
        #print(result["result"])
        return result["result"]
    else:
        #print(result["err_msg"])
        return ""

dev_pid 參數列表

dev_pid 語言 模型 是否有標點 備注
1536 普通話(支持簡單的英文識別) 搜索模型 無標點 支持自定義詞庫
1537 普通話(純中文識別) 輸入法模型 有標點 不支持自定義詞庫
1737 英語 有標點 不支持自定義詞庫
1637 粵語 有標點 不支持自定義詞庫
1837 四川話 有標點 不支持自定義詞庫
1936 普通話遠場 遠場模型 有標點 不支持

控制(鼠標)頁面滾動

# 控制鼠標滾動
def mouse_control(dir_tr):
    MOVE_DX = 5 # 每次滾動行數
    ms = PyMouse()
    horizontal = 0
    vertical = 0
    if dir_tr.find("上") != -1: # 向上移動
        vertical = MOVE_DX
        #print("vertical={0}, 向上".format(vertical))
    elif dir_tr.find("下") != -1: # 向下移動
        vertical = 0 - MOVE_DX
        #print("vertical={0}, 向下".format(vertical))
    elif dir_tr.find("左") != -1: # 向左移動
        horizontal = 0 - MOVE_DX
        #print("horizontal={0}, 向左".format(horizontal))
    elif dir_tr.find("右") != -1: # 向右移動
        horizontal = MOVE_DX
        #print("horizontal={0}, 向右".format(horizontal))

    #print("horizontal, vertical=[{0},{1}]".format(horizontal, vertical))
    # 通過scroll(vertical, horizontal)函數控制頁面滾動
    # 另外PyMouse還支持模擬move光標,模擬鼠標click,模擬鍵盤擊鍵等
    ms.scroll(vertical, horizontal) 

完成實時語音識別控制

while(True):
    # 請說出語音指令,例如["向上", "向下", "向左", "向右"]
    print("\n\n==================================================")
    print("Please tell me the command(limit within 3 seconds):")
    #print("Please tell me what you want to identify(limit within 10 seconds):")
    audio_record(AUDIO_OUTPUT, 3) # 錄制語音指令
    print("Identify On Network...")
    asr_result =  aip_get_asrresult(client, AUDIO_OUTPUT, AUDIO_FORMAT) # 識別語音指令
    if len(asr_result) != 0: # 語音識別結果不為空,識別結果為一個list
        print("Identify Result:", asr_result[0])
        print("Start Control...")
        mouse_control(asr_result[0]) # 根據識別結果控制頁面滾動
        print("Control End...")
        if asr_result[0].find("退出") != -1: # 如果是"退出"指令則結束程序
            break;
        time.sleep(1) # 延時1秒

程序運行截圖

語音識別

程序運行截圖

語音控制

程序運行截圖

項目內文件截圖

項目內文件截圖
Python實時語音識別控制

代碼地址如下:
http://www.demodashi.com/demo/12946.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM