
1. 背景介紹
智能語音助手作為物聯網領域的一個重要生態成員,是一種全新的互動方式,它能夠解放雙手,隨時提供服務,無須借助任何按鍵,想必很多開發者都有玩過天貓精靈、小愛同學或者小度吧,看到這些炫酷的人工智能產品,是不是很想搞清楚它到底怎么作業的沖動,是不是也想自己打造一臺專屬智能語音助手,僅僅通過說出“HaaS HaaS”、“天貓精靈”、或“小愛同學”,就可以喚醒語音助手并告訴它想要的資訊,在商業領域的人工智能產品要么是C或者C++開發,作業量巨大,現在有了HaaS EDU K1,通過數100行Python代碼就可以輕松打造一款智能音箱,這種全新的開發方式,還不來體驗下!
開始學習之前我們先看一下案例效果:
爆肝一周,用Python在物聯網設備上寫了個智能語音助手!
涉及知識點
- HaaS小程式配網
- https網路通信
- 本地喚醒AI推理引擎運用
- 云端智能語音互動平臺應用
- 云端智能對話機器人應用
- 模擬MIC聲音采樣
- 喇叭播放wav、mp3檔案
- 檔案系統應用
- OLED繪字
2. 方案介紹
本案例基于HaaS云端一體智能語音互動框架打造的,整個框架如下:

從框架可以看到,該案例是一個完整的云端語音互動全鏈路,包括了本地語音喚醒、回聲消除、降噪、ASR、NLP、TTS等,學完該案例讓你對智能語音助手有一個全新的認識,
2.1 軟體功能
整個方案支持:
- HaaS小程式配網;
- HaaS HaaS離線語音喚醒;
- 云端智能語音互動;
- 自定義問答、閑聊、多輪對話、知識庫等對話流管理,
3. 開發環境搭建
3.1 硬體準備
3.1.1 使用HaaS語音擴展板
HaaS語音擴展板是專門為HaaS EDU K1教育神器打造的,無縫對接,即查即用,不過目前沒有對外售賣,后續將在一些訓練營或活動中定向贈送,以下是使用HaaS語音擴展板的硬體圖,最終正式的版本比這個更小,

3.1.2 使用外接麥克風和喇叭
如果沒有HaaS語音擴展板也沒有關系,請按照如下步驟接入麥克風和喇叭:

麥克風接入MIC1_N介面,喇叭介入SPKLP介面,
HaaS EDU K1硬體排線圖請參考
https://help.aliyun.com/document_detail/205267.html
購買鏈接僅供參考!!我們不負責商家發貨的品質保障等問題!!
| 名稱 | 數量 | 參考鏈接 |
| HaaS EDU K1開發版 | 1 | HaaS EDU K1購買鏈接 |
| microUSB資料線 | 1 | 普通microusb線即可 |
| 模擬MIC | 1 | 模擬MIC參考鏈接 |
| 喇叭 | 1 | 喇叭參考鏈接 |
| 杜邦線 | 數條 | NA |
3.2 環境搭建
參考《HaaS EDU K1快速開始》中安裝HaaS Studio完成AliOS Things開發環境搭建,
3.2.1 Python韌體編譯、燒錄
參考 《HaaS EDU K1快速上手》燒錄帶Python引擎的韌體包,
打開串口
韌體燒錄完成后,可以通過串口查看示例的運行結果,打開串口的具體方法可參考《HaaS EDU K1快速開始》查看日志章節,
3.2.2 Python案例代碼下載
該案例相關的源代碼下載可參考《創建工程》,該案例是Python案例,
其中:
選擇Python開發
選擇解決方案: “voice_assistant”
選擇開發板: HaaS EDU K1

4. 軟體架構
4.1 代碼結構
├── asr.py # 云端語音識別處理介面
├── kws.py # 語音喚醒識別處理介面
├── main.py # 主程式
├── nlp.py # 云端智能對話互動處理介面
├── tts.py # TTS語音合成處理介面
├── oled.py # oled顯示介面
├── player.py # TTS語音播報介面
├── README.md # 使用檔案說明
├── recorder.py # 錄音介面
├── resource # 本地語料檔案
│ ├── network_connecting.mp3
│ ├── network_fail.mp3
│ ├── network_ok.mp3
│ ├── noquestion.mp3
│ ├── sorry.mp3
│ ├── wakeup.mp3
│ ├── welcome.mp3
│ ├── get_token_fail.mp3
└── └── wifi_smartconfig.mp3
4.2 程式主體
100行Python代碼搞定程式主體:
def main():
# 初始化聲卡驅動
print("enter main function\n")
Snd.install_codec_driver()
Snd.init()
# 打開語音擴展板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
# 播報歡迎語料
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: # 非多輪對話時播放提示音
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識別
oledShowText('Recognizing...', 12, 24, 1, True)
# 動態獲取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) # 抱歉,我沒有聽清楚,請重新說一次試試
continue
# NLP自然語音處理
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) # 抱歉,沒有找到你問的問題,請換一個試試
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)
# 根據意圖執行設備端動作
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()
# 釋放聲卡驅動
Snd.uninstall_codec_driver()
Snd.deinit()
5. 案例體驗
本案例不支持打斷功能,所以在喚醒后等待語音播報完成在進行問答,螢屏上有對應的提示,
5.1 云端功能開通
5.1.1 阿里云賬號開通及訪問控制
參考《爆肝一周,用Python在物聯網設備上寫了個智能語音助手-創建阿里云賬號》完成以下兩個步驟:
- 注冊阿里云賬號
- 獲取AccessKey和Secret
5.1.2 智能語音互動開通及配置
參考《爆肝一周,用Python在物聯網設備上寫了個智能語音助手-阿里云智能語音互動》完成以下三個主要步驟:
- 智能語音互動功能開通
- 完成語音識別和語音合成功能進行配置
- 獲取智能語音互動Appkey
5.1.3 智能對話機器人開通及配置
參考《爆肝一周,用Python在物聯網設備上寫了個智能語音助手-阿里云智能對話機器人》完成以下四個主要步驟:
- 創建會話機器人
- 配置機器人知識庫
- 發布機器人
- 在機器人管理頁獲取對話機器人實體ID
5.2 設備端代碼配置
5.2.1 賬號資訊配置
在上述5.1云端功能開通完成后,將獲取到的AccessKey/Access Secret/Appkey/機器人ID填入到main.py中:
# 阿里云訪問賬號
access_key = 'Your-Access-Key'
access_secret = 'Your-Access-Secret'
# 智能語音互動
app_key = 'Your-App-Key'
# 登陸https://nls-portal.console.aliyun.com/overview
# 查看你創建的專案功能配置旁邊的appkey
# Chatbot對話機器人實體ID
instance_id = 'chatbot-cn-XXXXXXX'
# 登陸https://chatbot.console.aliyun.com/yunme.htm#/beebot_preview/overview
# 查看您創建的機器人ID
5.2.2 開關燈意圖匹配
在5.1.3 智能對話機器人開通及配置中介紹了如何創建開關燈對話流,設備端events中的名稱需與對話流中的意圖名稱保持一致,設備端對意圖的處理代碼位于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()
當匹配意圖為red_light_on時,設備端將GPIO led_r拉高置1點亮紅燈,其他意圖類似處理,如果有特殊需求,可以根據需要修改意圖,比如控制其他GPIO或者PWM等操作,
5.3 Python代碼推送
參考《Python 輕應用開發工具 HaaS-Studio》推送本案例Python代碼包到設備中,
注意事項
如果遇到代碼推送結束時報錯,請確保設備/data/目錄下,除python相關檔案外,沒有其他不必要的檔案,如有,請洗掉再重試,
5.4 HaaS小程式配網
- 確認OLED上顯示"Enter WiFi Smart Config...";
- 打開手機支付寶,搜索HaaS小程式,同時打開手機藍牙功能;
- 點擊掃描待配網設備;
- 選擇Wi-Fi SSID;
- 填入Wi-Fi密碼;
- 點擊發起配網;
- 等待設備端連接Wi-Fi,當聽到語音播報“網路連接成功!”或OLED看到“WiFi Connected!”表示網路連接成功,
注意事項
如果已經連接過WiFi,想要重新配網,請進入串口按"Ctrl+C",然后按“Ctrl+D”退出Python,再rm /data/wifi.conf后重啟進入配網,
5.5 語音互動體驗
聯網成功后,說出“HaaS HaaS“后,設備喚醒,可以開始向HaaS小助手提問了,讓她幫你查天氣,開關燈等,當然前提是你在智能對話機器人中已經配置好對話策略,快來打造你的智能語音助手吧!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298871.html
標籤:AI
上一篇:深度學習之卷積
下一篇:Python基礎學習(十)
