摘要:背景介紹智能語(yǔ)音助手作為物聯(lián)網(wǎng)領(lǐng)域的一個(gè)重要生態(tài)成員,是一種全新的交互方式,它能夠解放雙手,隨時(shí)提供服務(wù),無(wú)須借助任何按鍵。學(xué)完該案例讓你對(duì)智能語(yǔ)音助手有一個(gè)全新的認(rèn)識(shí)??靵?lái)打造你的智能語(yǔ)音助手吧
智能語(yǔ)音助手作為物聯(lián)網(wǎng)領(lǐng)域的一個(gè)重要生態(tài)成員,是一種全新的交互方式,它能夠解放雙手,隨時(shí)提供服務(wù),無(wú)須借助任何按鍵。想必很多開發(fā)者都有玩過(guò)天貓精靈、小愛同學(xué)或者小度吧,看到這些炫酷的人工智能產(chǎn)品,是不是很想搞清楚它到底怎么工作的沖動(dòng),是不是也想自己打造一臺(tái)專屬智能語(yǔ)音助手。僅僅通過(guò)說(shuō)出“HaaS HaaS”、“天貓精靈”、或“小愛同學(xué)”,就可以喚醒語(yǔ)音助手并告訴它想要的信息。在商業(yè)領(lǐng)域的人工智能產(chǎn)品要么是C或者C++開發(fā),工作量巨大?,F(xiàn)在有了HaaS EDU K1,通過(guò)數(shù)100行Python代碼就可以輕松打造一款智能音箱。這種全新的開發(fā)方式,還不來(lái)體驗(yàn)下!
開始學(xué)習(xí)之前我們先看一下案例效果:
爆肝一周,用Python在物聯(lián)網(wǎng)設(shè)備上寫了個(gè)智能語(yǔ)音助手!
涉及知識(shí)點(diǎn)
本案例基于HaaS云端一體智能語(yǔ)音交互框架打造的。整個(gè)框架如下:
從框架可以看到,該案例是一個(gè)完整的云端語(yǔ)音交互全鏈路,包括了本地語(yǔ)音喚醒、回聲消除、降噪、ASR、NLP、TTS等。學(xué)完該案例讓你對(duì)智能語(yǔ)音助手有一個(gè)全新的認(rèn)識(shí)。
整個(gè)方案支持:
HaaS語(yǔ)音擴(kuò)展板是專門為HaaS EDU K1教育神器打造的,無(wú)縫對(duì)接,即查即用,不過(guò)目前沒(méi)有對(duì)外售賣,后續(xù)將在一些訓(xùn)練營(yíng)或活動(dòng)中定向贈(zèng)送。以下是使用HaaS語(yǔ)音擴(kuò)展板的硬件圖,最終正式的版本比這個(gè)更小。
如果沒(méi)有HaaS語(yǔ)音擴(kuò)展板也沒(méi)有關(guān)系,請(qǐng)按照如下步驟接入麥克風(fēng)和喇叭:
麥克風(fēng)接入MIC1_N接口,喇叭介入SPKLP接口。
HaaS EDU K1硬件排線圖請(qǐng)參考
https://help.aliyun.com/document_detail/205267.html
購(gòu)買鏈接僅供參考!!我們不負(fù)責(zé)商家發(fā)貨的品質(zhì)保障等問(wèn)題?。?/p>
名稱 | 數(shù)量 | 參考鏈接 |
HaaS EDU K1開發(fā)版 | 1 | |
microUSB數(shù)據(jù)線 | 1 | 普通microusb線即可 |
模擬MIC | 1 | |
喇叭 | 1 | |
杜邦線 | 數(shù)條 | NA |
參考《HaaS EDU K1快速開始》中安裝HaaS Studio完成AliOS Things開發(fā)環(huán)境搭建。
參考 《HaaS EDU K1快速上手》燒錄帶Python引擎的固件包。
打開串口
固件燒錄完成后,可以通過(guò)串口查看示例的運(yùn)行結(jié)果,打開串口的具體方法可參考《HaaS EDU K1快速開始》查看日志章節(jié)。
該案例相關(guān)的源代碼下載可參考《創(chuàng)建工程》,該案例是Python案例。
其中:
選擇Python開發(fā)
選擇解決方案: “voice_assistant”
選擇開發(fā)板: HaaS EDU K1
├── asr.py # 云端語(yǔ)音識(shí)別處理接口├── kws.py # 語(yǔ)音喚醒識(shí)別處理接口├── main.py # 主程序├── nlp.py # 云端智能對(duì)話交互處理接口├── tts.py # TTS語(yǔ)音合成處理接口├── oled.py # oled顯示接口├── player.py # TTS語(yǔ)音播報(bào)接口├── README.md # 使用文檔說(shuō)明├── recorder.py # 錄音接口├── resource # 本地語(yǔ)料文件│ ├── network_connecting.mp3│ ├── network_fail.mp3│ ├── network_ok.mp3│ ├── noquestion.mp3│ ├── sorry.mp3│ ├── wakeup.mp3│ ├── welcome.mp3│ ├── get_token_fail.mp3└── └── wifi_smartconfig.mp3
100行Python代碼搞定程序主體:
def main(): # 初始化聲卡驅(qū)動(dòng) print("enter main function/n") Snd.install_codec_driver() Snd.init() # 打開語(yǔ)音擴(kuò)展板PA,PIN23: GPIO19 gpio = GPIO() gpio.open("GPIO19") gpio.write(1) gpio.close() # 初始化oled oledInit() #初始化播放器 audioPlayerInit() # 錄音初始化 audioRecorderInit() # 連接WiFi connectWifi() # get_wifi_status() sessionId = None is_session_finished = True # 初始化kws喚醒詞 global wakeup, count wakeup = False # 播報(bào)歡迎語(yǔ)料 oledShowText("I am your HaaS", 6, 18, 1, True) oledShowText("voice assistant!", 4, 30, 1, False) audioPlay(welcome_file) while True: if is_session_finished == True: # 非多輪對(duì)話時(shí)播放提示音 oledShowText("I am your HaaS", 6, 18, 1, True) oledShowText("voice assistant!", 4, 30, 1, False) kwsEnable(kwsCb) while wakeup == False: time.sleep(0.2) kwsDisable() # 播放喚醒提示音 oledShowText("Host, i am here!", 2, 24, 1, True) audioPlay(wakeup_file) wakeup = False is_session_finished = True # record 3sec pcm data oledShowText("Please speak...", 8, 24, 1, True) rframes, length = audioRecord(duration) # ASR識(shí)別 oledShowText("Recognizing...", 12, 24, 1, True) # 動(dòng)態(tài)獲取token token_resp = ucloud_ai.get_token_id(access_key, access_secret, domain, region_id) print("token_resp: %s" %token_resp) if token_resp == None: audioPlay(token_fail_file) continue token_resp = ujson.loads(token_resp) if token_resp != None: if token_resp.get("ErrMsg") != "": audioPlay(token_fail_file) continue asr_token = token_resp.get("Token").get("Id") else: print("get token fail") asr_token = asr_default_token if asr_token == None: audioPlay(sorry_file) continue asr_text = asrProcess(app_key, asr_token, "pcm", rframes, length) if asr_text == None: oledShowText("Answering...", 12, 24, 1, True) audioPlay(sorry_file) # 抱歉,我沒(méi)有聽清楚,請(qǐng)重新說(shuō)一次試試 continue # NLP自然語(yǔ)音處理 is_session_finished, sessionId, intentName, text = nlpProcess(access_key, access_secret, instance_id, sessionId, asr_text) if text == None: oledShowText("Answering...", 12, 24, 1, True) audioPlay(noquestion_file) # 抱歉,沒(méi)有找到你問(wèn)的問(wèn)題,請(qǐng)換一個(gè)試試 continue # TTS合成 # text = "今天天氣很好" tts_resp = ttsProcess(app_key, asr_token, 3, 16000, "siqi", 100, 0, 0, text, tts_file) oledShowText("Answering...", 12, 24, 1, True) # 根據(jù)意圖執(zhí)行設(shè)備端動(dòng)作 doIntent(intentName) if tts_resp == True: # 播放tts print("start to audioPlay tts/n") audioPlay("fs:" + tts_file) else: print("tts resposne fail") audioPlay(network_fail_file) # 釋放kws資源 kwsDisable() # 釋放播放器 audioPlayerUninit() # 釋放錄音資源 audioRecordUninit() # 釋放聲卡驅(qū)動(dòng) Snd.uninstall_codec_driver() Snd.deinit()
本案例不支持打斷功能,所以在喚醒后等待語(yǔ)音播報(bào)完成在進(jìn)行問(wèn)答,屏幕上有對(duì)應(yīng)的提示。
參考《爆肝一周,用Python在物聯(lián)網(wǎng)設(shè)備上寫了個(gè)智能語(yǔ)音助手-創(chuàng)建阿里云賬號(hào)》完成以下兩個(gè)步驟:
參考《爆肝一周,用Python在物聯(lián)網(wǎng)設(shè)備上寫了個(gè)智能語(yǔ)音助手-阿里云智能語(yǔ)音交互》完成以下三個(gè)主要步驟:
參考《爆肝一周,用Python在物聯(lián)網(wǎng)設(shè)備上寫了個(gè)智能語(yǔ)音助手-阿里云智能對(duì)話機(jī)器人》完成以下四個(gè)主要步驟:
在上述5.1云端功能開通完成后,將獲取到的AccessKey/Access Secret/Appkey/機(jī)器人ID填入到main.py中:
# 阿里云訪問(wèn)賬號(hào)access_key = "Your-Access-Key"access_secret = "Your-Access-Secret"# 智能語(yǔ)音交互app_key = "Your-App-Key"# 登陸https://nls-portal.console.aliyun.com/overview# 查看你創(chuàng)建的項(xiàng)目功能配置旁邊的appkey# Chatbot對(duì)話機(jī)器人實(shí)例IDinstance_id = "chatbot-cn-XXXXXXX"# 登陸https://chatbot.console.aliyun.com/yunme.htm#/beebot_preview/overview# 查看您創(chuàng)建的機(jī)器人ID
在5.1.3 智能對(duì)話機(jī)器人開通及配置中介紹了如何創(chuàng)建開關(guān)燈對(duì)話流,設(shè)備端events中的名稱需與對(duì)話流中的意圖名稱保持一致。設(shè)備端對(duì)意圖的處理代碼位于main.py中,代碼如下:
def doIntent(intentName): if intentName == None: return print("intentName: %s" %intentName) leds=("led_r", "led_g", "led_b") events = [ {"light_on": "leds", "value": 1}, {"light_off": "leds", "value": 0}, {"red_light_on": "led_r", "value": 1}, {"red_light_off": "led_r", "value": 0}, {"green_light_on": "led_g", "value": 1}, {"green_light_off": "led_g", "value": 0}, {"blue_light_on": "led_b", "value": 1}, {"blue_light_off": "led_b", "value": 0}, ] gpio = GPIO() for event in events: led = event.get(intentName) if led != None: value = event.get("value") if led == "leds": for led in leds: gpio.open(led) gpio.write(value) gpio.close() else: gpio.open(led) gpio.write(value) gpio.close()
當(dāng)匹配意圖為red_light_on時(shí),設(shè)備端將GPIO led_r拉高置1點(diǎn)亮紅燈。其他意圖類似處理,如果有特殊需求,可以根據(jù)需要修改意圖,比如控制其他GPIO或者PWM等操作。
參考《Python 輕應(yīng)用開發(fā)工具 HaaS-Studio》推送本案例Python代碼包到設(shè)備中。
注意事項(xiàng)
如果遇到代碼推送結(jié)束時(shí)報(bào)錯(cuò),請(qǐng)確保設(shè)備/data/目錄下,除python相關(guān)文件外,沒(méi)有其他不必要的文件,如有,請(qǐng)刪除再重試。
注意事項(xiàng)
如果已經(jīng)連接過(guò)WiFi,想要重新配網(wǎng),請(qǐng)進(jìn)入串口按"Ctrl+C",然后按“Ctrl+D”退出Python,再rm /data/wifi.conf后重啟進(jìn)入配網(wǎng)。
聯(lián)網(wǎng)成功后,說(shuō)出“HaaS HaaS“后,設(shè)備喚醒。可以開始向HaaS小助手提問(wèn)了,讓她幫你查天氣,開關(guān)燈等。當(dāng)然前提是你在智能對(duì)話機(jī)器人中已經(jīng)配置好對(duì)話策略。快來(lái)打造你的智能語(yǔ)音助手吧!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/119774.html
摘要:亞馬遜人工智能語(yǔ)音助手技能超過(guò)萬(wàn)個(gè),全球各主要硬件廠商紛紛搭載或兼容,使得其亞馬遜助手無(wú)處不在。物聯(lián)網(wǎng)設(shè)備透過(guò)云端實(shí)現(xiàn)跨行業(yè)和跨設(shè)備互聯(lián)互通,所收集數(shù)據(jù)除了在邊緣側(cè)處理,還需要上傳至云端,云端作為數(shù)據(jù)集散地,各種數(shù)據(jù)經(jīng)過(guò)云端AI處理后,對(duì)這些數(shù)據(jù)利用將會(huì)帶來(lái)新的商業(yè)模式。在物聯(lián)網(wǎng)資深專家楊劍勇看來(lái),云計(jì)算是全球物聯(lián)網(wǎng)重要基礎(chǔ)設(shè)施,作為物聯(lián)網(wǎng)產(chǎn)業(yè)發(fā)展基石,聚集了亞馬遜、微軟、谷歌和BAT等重量...
摘要:年月日,智能音箱全球發(fā)貨,早在今年月的谷歌開發(fā)者大會(huì)上,作為新的生態(tài)圈硬件角色開始涉足智能家居領(lǐng)域,鎖定目前美國(guó)最火爆的智能家居硬件亞馬遜為競(jìng)爭(zhēng)對(duì)手。2016年11月4日,Google Home智能音箱全球發(fā)貨,早在今年5月的谷歌I/O開發(fā)者大會(huì)上,Google Home作為新的Google生態(tài)圈硬件角色開始涉足智能家居領(lǐng)域,鎖定目前美國(guó)最火爆的智能家居硬件亞馬遜Echo為競(jìng)爭(zhēng)對(duì)手。Goog...
摘要:定律在那篇最流行的編程語(yǔ)言能做什么里,我們列舉了在不同領(lǐng)域的使用情況,今天讓我們來(lái)詳解一下在物聯(lián)網(wǎng)中的應(yīng)用。這個(gè)硬件層決定了物聯(lián)網(wǎng)應(yīng)用比應(yīng)用更加復(fù)雜。這時(shí),我開始關(guān)注實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用的可能性。 凡是能用JavaScript寫出來(lái)的,最終都會(huì)用JavaScript寫出來(lái)。 —— Atwood定律 在那篇《最流行的編程語(yǔ)言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:定律在那篇最流行的編程語(yǔ)言能做什么里,我們列舉了在不同領(lǐng)域的使用情況,今天讓我們來(lái)詳解一下在物聯(lián)網(wǎng)中的應(yīng)用。這個(gè)硬件層決定了物聯(lián)網(wǎng)應(yīng)用比應(yīng)用更加復(fù)雜。這時(shí),我開始關(guān)注實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用的可能性。 凡是能用JavaScript寫出來(lái)的,最終都會(huì)用JavaScript寫出來(lái)。 —— Atwood定律 在那篇《最流行的編程語(yǔ)言JavaScript能做什么?》里,我們列舉了JavaScript在不...
摘要:一名德國(guó)男子不在家,家中的被意外激活,并在半夜兩點(diǎn)開始播放音樂(lè),吵醒了鄰居。然而在兩個(gè)小時(shí)后,公交車就被一輛大貨車撞上了。匯豐馬上推出了解決方案嘗試三次失敗之后就鎖定賬戶。 showImg(https://segmentfault.com/img/bV192y?w=700&h=312); 簡(jiǎn)評(píng):整體來(lái)說(shuō),2017 年的 AI 進(jìn)步還是不小的,比 2016 的 AR/VR 強(qiáng)很多。今天的...
閱讀 3605·2021-11-15 11:38
閱讀 2800·2021-11-11 16:55
閱讀 2549·2021-11-08 13:22
閱讀 2626·2021-11-02 14:45
閱讀 1303·2021-09-28 09:35
閱讀 2567·2021-09-10 10:50
閱讀 462·2019-08-30 15:44
閱讀 2774·2019-08-29 17:06