Python實時語音識別控制
概述
本文中的語音識別功能采用 百度語音識別庫 ,首先利用 PyAudio 庫錄制語音指令,保存為受支持的 wav 音頻文件,然后利用 百度語音識別庫 提供的方法實現語音識別,最后檢測識別結果,利用 PyUserInput 庫提供的方法模擬控制web頁面滾動。
百度語音識別為開發者提供業界優質且免費的語音服務,通過場景識別優化,為車載導航,智能家居和社交聊天等行業提供語音解決方案,准確率達到90%以上,讓您的應用繪“聲”繪色。
准備工作
安裝百度語音識別SDK
pip install baidu-aip
安裝Python音頻處理庫 PyAudio
python -m pip install pyaudio
安裝鼠標控制庫 PyUserInput
pip install pyuserinput
PyUserInput 庫依賴另外兩個庫 pywin32 和 pyHook ,需要單獨安裝。
安裝方法可以參考下面這篇文章: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實時語音識別控制
注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權