小伙伴們,小安派AI語(yǔ)音開(kāi)發(fā)板上線一段時(shí)間了,安信可社區(qū)“瘋狂發(fā)板”模式后,不少伙伴已經(jīng)拿到開(kāi)發(fā)板了,來(lái)看看大家的實(shí)際體驗(yàn)如何~
以下作品由安信可社區(qū)用戶
zzbinfo制作
開(kāi)箱

整個(gè)開(kāi)發(fā)板組件裝在防靜電袋子中,很簡(jiǎn)潔。

打開(kāi)防靜電袋子,還有一個(gè)塑料袋子,袋子里面是個(gè)硬殼的盒子,開(kāi)發(fā)組件就在盒子里面,防止運(yùn)輸過(guò)程中壓壞開(kāi)發(fā)板。


pcb前后都?jí)|有減震棉,包裝確實(shí)很用心。我們來(lái)仔細(xì)看看開(kāi)發(fā)板。
開(kāi)發(fā)板pcb尺寸


開(kāi)發(fā)板35mm*30mm,尺寸小巧緊湊。很容易放置進(jìn)合適的外殼中,對(duì)于我們業(yè)余DIY、開(kāi)發(fā)測(cè)試非常友好。
主要芯片、模塊

主控模組就是安信可的Ai-WB2-12F WiFi模塊,該模組搭載BL602芯片作為核心處理器,支持Wi-Fi 802.11b/g/n協(xié)議和BLE 5.0協(xié)議。
BL602芯片內(nèi)置低功耗的32位RISC CPU,276KB RAM和豐富的外圍接口,包括SDIOSPIUARTI2CIR remotePWMADCDACPIR 和 GPIO等。每個(gè)外接端子都有絲端子采用的是SH1.25。

背面絲印LTH7的是pw4054,單節(jié)鋰電充電芯片,支持3.7V鋰電池的充電,輸入電壓4.5-6.5V,充電電流由旁邊的電阻控制,支持10mA-500mA。板載的電阻是5k,換成2k,可以支持到500mA。板子上沒(méi)有放電控制電路,所以外接的鋰電池要帶充放電控制板。
離線語(yǔ)音識(shí)別采用的是上海華振電子的語(yǔ)音大腦VB6824芯片方案。
內(nèi)核采用高性能 32 位 RISC 內(nèi)核,主頻 240MHz,支持硬件浮點(diǎn)運(yùn)算,內(nèi)置 1MB SPI FLASH。
該方案支持AI語(yǔ)音識(shí)別,采用最新的神經(jīng)網(wǎng)絡(luò)(TDNN)算法,具有識(shí)別精準(zhǔn),誤判率低等優(yōu)勢(shì),5米遠(yuǎn)場(chǎng)可靠識(shí)別。支持語(yǔ)音降噪,可以有效過(guò)濾掉穩(wěn)態(tài)噪聲、對(duì)動(dòng)態(tài)噪聲也有很好的抑制作用,噪音下也可準(zhǔn)確識(shí)別。支持 MP3,WAV,WMA,APE,F(xiàn)LAC,AAC,MP4,M4A,AIF,AIFC音頻解碼。藍(lán)牙支持 SBC,AAC 音頻解碼音頻,支持 mSBC 語(yǔ)音編解碼器。符合藍(lán)牙 V5.1+BR+EDR+ BLE 規(guī)范,提供+6dbm 發(fā)射功率。
上電

接上type-c線后打開(kāi)開(kāi)關(guān),隨著紅燈閃爍,語(yǔ)音提示清晰宏亮,根據(jù)語(yǔ)音提示和快速上手指南進(jìn)行配網(wǎng)后就可以愉快地玩耍了。
小安AiPi-PalChatV1性能測(cè)試
配網(wǎng)測(cè)試
https://www.bilibili.com/video/BV16gTVzBEDr/?spm_id_from=888.80997.embed_other.whitelist&t=60.737005&bvid=BV16gTVzBEDr&vd_source=54c5db21948db2378659b7e8e42bafbf
從輸入密碼點(diǎn)擊確定開(kāi)始,到提示配網(wǎng)成功大概耗時(shí)8秒到10秒,這個(gè)跟網(wǎng)絡(luò)環(huán)境也有很大關(guān)系。網(wǎng)絡(luò)不好,會(huì)造成對(duì)話反應(yīng)變慢,聲音輸出打嗝等現(xiàn)象。具體可以看一下測(cè)試視頻。

打斷測(cè)試
https://www.bilibili.com/video/BV1ruTVzuEUm/?spm_id_from=888.80997.embed_other.whitelist&t=70.125983&bvid=BV1ruTVzuEUm&vd_source=54c5db21948db2378659b7e8e42bafbf
由于采用的是VB6824語(yǔ)音識(shí)別方案,實(shí)現(xiàn)的對(duì)話中打斷,效果還是不錯(cuò)的。可能是咪頭和輸出喇叭比較近的緣故,偶爾也會(huì)出現(xiàn)打斷不了的情況,不過(guò)總體使用感覺(jué)還是很流暢。打斷、識(shí)別的效果也和咪頭有比較大的關(guān)系,我測(cè)試了兩種手上有的咪頭,效果相差很大。

識(shí)別距離測(cè)試
https://www.bilibili.com/video/BV1eWTVzfEYn/?spm_id_from=333.788.player.player_end_recommend_autoplay&bvid=BV1ruTVzuEUm&vd_source=54c5db21948db2378659b7e8e42bafbf
再次提醒,識(shí)別距離和環(huán)境有很大關(guān)系,筆者測(cè)試的房間外面是狹長(zhǎng)的走廊,在走廊里面有比較大的回音,經(jīng)過(guò)芯片的消回音處理,識(shí)別的效果就大打折扣了,實(shí)際測(cè)試時(shí)也確實(shí)在房間內(nèi)有很好的識(shí)別效果,走廊里面就完全識(shí)別不到語(yǔ)音了。

AiPi-PalChatV1語(yǔ)音開(kāi)發(fā)板通過(guò)MCP服務(wù)實(shí)現(xiàn)自動(dòng)化控制家電
實(shí)現(xiàn)途徑
有了AiPi-PalChatv1開(kāi)發(fā)板和小智人工智能后臺(tái)的加持,不實(shí)現(xiàn)點(diǎn)實(shí)用功能難免浪費(fèi),首先肯定是自動(dòng)化控制家里的電器,通過(guò)查閱資料,有多種途徑:
1、可以直接對(duì)開(kāi)發(fā)板編程,定制自己的固件。
2、可以通過(guò)home assistant mcp server,這個(gè)需要有home assistant ,并且還要滿足一定的要求。
3、自己寫MCP server,小智后臺(tái)提供了MCP接口和示例。
筆者采用第三種方式,把之前廚房的甲烷傳感器,衛(wèi)生間的熱水器,空調(diào),燈等能接入的全部實(shí)現(xiàn)了自動(dòng)控制,效果非常驚喜。
硬件優(yōu)化

從之前的測(cè)試和最近一段時(shí)間的摸索,發(fā)現(xiàn)語(yǔ)音識(shí)別依賴于采集的聲音的質(zhì)量,筆者把開(kāi)發(fā)板上的兩個(gè)開(kāi)關(guān)電源芯片禁用了(也可以直接拆掉)。
通過(guò)外接的LDO實(shí)現(xiàn)的5V和3.3V的供電,實(shí)際使用效果良好,同樣的咪頭,喚醒距離增加一倍,對(duì)話流暢。(如下視頻)
https://www.bilibili.com/video/BV1sxNoz8EKy/?spm_id_from=888.80997.embed_other.whitelist&t=13.901191&bvid=BV1sxNoz8EKy&vd_source=54c5db21948db2378659b7e8e42bafbf

MCP服務(wù)器代碼
# -*- coding: utf-8 -*-
# 以下代碼在2025年6月18日 python3.11環(huán)境下運(yùn)行通過(guò)
import sys
sys.path.append('/usr/local/lib/python3.7/dist-packages')
import paho.mqtt.client as mqtt
#
import sys
sys.path.append('/usr/lib/python3/dist-packages')
import requests
import json
from mcp.server.fastmcp import FastMCP
import logging
import socket
import threading
import time
def connTCP(topic:str,msg:str):
global tcp_client_socket
# 創(chuàng)建socket
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# IP 和端口
server_ip = 'bemfa.com'
server_port = 8344
uid = 'UUID'
try:
# 連接服務(wù)器
tcp_client_socket.connect((server_ip, server_port))
#發(fā)送訂閱指令
substr = 'cmd=2&uid=' + uid + '&topic=' + topic + '&msg=' + msg + 'rn'
tcp_client_socket.send(substr.encode("utf-8"))
time.sleep(2)
tcp_client_socket.shutdown(2)
tcp_client_socket.close()
except:
time.sleep(2)
tcp_client_socket.shutdown(2)
tcp_client_socket.close()
#connTCP()
#Kitchen_temperature = ""
#Kitchen_CH4 = ""
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
client.subscribe("****") # 訂閱消息
#消息接收
def on_message(client, userdata, msg):
global Ktemperature
global KCH4
#print("主題:"+msg.topic+" 消息:"+str(msg.payload.decode('utf-8')))
if msg.topic == topicA: #判斷topic是否是topicA
#print(" topicA msg")
msgstr = str(msg.payload.decode('utf-8'))
Ktemperature = msgstr.split("#")[-2]
KCH4 = msgstr.split("#")[-1]
#print(Kitchen_temperature)
#print(" topicA msg")
#print(Kitchen_CH4)
#if str(msg.payload.decode('utf-8')) == "ON": #如果接收字符on,亮燈
# connTCP('topic','ON') #開(kāi)燈函數(shù)
#if str(msg.payload.decode('utf-8')) == "OFF": #如果接收字亮燈
# connTCP('topic','OFF') #關(guān)燈函數(shù)
#訂閱成功
def on_subscribe(client, userdata, mid, granted_qos):
print("On Subscribed: qos = %d" % granted_qos)
# 失去連接
def on_disconnect(client, userdata, rc):
if rc != 0:
print("Unexpected disconnection %s" % rc)
logger = logging.getLogger('WHcontrol')
# Create an MCP server
mcp = FastMCP("WHcontrol")
# Add an addition tool
@mcp.tool()
def get_kitchen_temperature() -> dict:
"""用于查詢廚房溫度,返回溫度值,單位攝氏度。"""
global Ktemperature
if float(Ktemperature) > 45:
Ktemperature = f'{float(Ktemperature)-18:.1f}' #修正溫度值,由于電子溫度計(jì)裝的高,不修正,人工智能容易報(bào)警
result = Ktemperature
#print(result)
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
@mcp.tool()
def get_kitchen_CH4() -> dict:
"""用于查詢廚房天然氣或是甲烷含量,返回天然氣或是甲烷PPM值。"""
global KCH4
if int(KCH4) > 440:
KCH4 = f'{int(KCH4)-440}'
result = KCH4
# print(result)
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
@mcp.tool()
def get_wh_timer_switch() -> dict:
"""用于查詢熱水器定時(shí)器開(kāi)關(guān)的狀態(tài),on是打開(kāi),off是關(guān)閉。"""
headers={ "content-type": "application/x-www-form-urlencoded"}
urlmsg = f'https://apis.bemfa.com/va/getmsg?uid=UUID&topic=reshuiqi&type=3&num=1'
response = requests.get(url=urlmsg,headers=headers,timeout=5)
if response.status_code != 200:
raise ConnectionError(f'{url} status code is {response.status_code}.')
response = json.loads(response.content)
if 'data' not in response.keys():
raise ValueError(f'{url} miss key msg.')
response = json.dumps(response['data'][0])
response = json.loads(response)
if 'msg' not in response.keys():
raise ValueError(f'{url} miss key msg.')
result = response['msg'].split("#")[-1]
print(result)
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
@mcp.tool()
def set_wh_timer_switch(sw:str) -> dict:
"""設(shè)置熱水器定時(shí)加熱開(kāi)關(guān)狀態(tài),on是打開(kāi),off是關(guān)閉。打開(kāi)后在每天晚上20點(diǎn)自動(dòng)開(kāi)始加熱,一個(gè)小時(shí)后關(guān)閉加熱開(kāi)關(guān)。"""
if sw == "on":
connTCP("topic","G2on")
if sw == "off":
connTCP("topic","G2off")
result = sw
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
@mcp.tool()
def get_wh_switch() -> dict:
"""用于查詢熱水器加熱開(kāi)關(guān)的狀態(tài),on是打開(kāi),off是關(guān)閉。"""
headers={ "content-type": "application/x-www-form-urlencoded"}
urlmsg = f'https://apis.bemfa.com/va/getmsg?uid=UUID&topic=reshuiqi&type=3&num=1'
response = requests.get(url=urlmsg,headers=headers,timeout=5)
if response.status_code != 200:
raise ConnectionError(f'{url} status code is {response.status_code}.')
response = json.loads(response.content)
if 'data' not in response.keys():
raise ValueError(f'{url} miss key msg.')
response = json.dumps(response['data'][0])
response = json.loads(response)
if 'msg' not in response.keys():
raise ValueError(f'{url} miss key msg.')
result = response['msg'].split("#")[-2]
print(result)
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
@mcp.tool()
def set_wh_switch(sw:str) -> dict:
"""設(shè)置熱水器加熱開(kāi)關(guān)狀態(tài),on是打開(kāi)熱水器加熱開(kāi)關(guān),off是關(guān)閉熱水器加熱開(kāi)關(guān)。"""
if sw == "on":
connTCP("topic","G1on")
if sw == "off":
connTCP("topic","G1off")
result = sw
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
@mcp.tool()
def set_light_switch(sw:str) -> dict:
"""設(shè)置客廳照明燈的開(kāi)關(guān)狀態(tài),on是打開(kāi)照明燈,off是關(guān)閉照明燈。"""
if sw == "on":
connTCP("topic","A857A4AC6C") #我是通過(guò)433網(wǎng)關(guān)來(lái)發(fā)的控制指令,這個(gè)是我的燈的指令,修改成你們自己的
if sw == "off":
connTCP("topic","A857A4AC69")
result = sw
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
@mcp.tool()
def set_light_brightness(sw:str) -> dict:
"""設(shè)置客廳照明燈的亮度,add是增加亮度,fall是減小亮度。"""
if sw == "fall":
connTCP("topic","A857A4AC64")
if sw == "add":
connTCP("topic","A857A4AC68")
result = sw
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
@mcp.tool()
def set_air_switch(sw:str) -> dict:
"""設(shè)置臥室空調(diào)的開(kāi)關(guān)狀態(tài),on是打開(kāi)空調(diào),off是關(guān)閉空調(diào)。"""
if sw == "on":
connTCP("topic","H823CB2602002403053D000000007F") #我是通過(guò)紅外網(wǎng)關(guān)來(lái)發(fā)的控制指令,這個(gè)是我的空調(diào)的指令,修改成你們自己的
if sw == "off":
connTCP("topic","H823CB26020020030F3A0000000082")
result = sw
http://logger.info(f"result: {result}")
return {"success": True, "result": result}
# Start the server
if __name__ == "__main__":
MQTTHOST = "http://bemfa.com"
MQTTPORT = 9501
client_id = "UUID"
topicA = "tipoc"
client = mqtt.Client(client_id)
client.username_pw_set("userName", "passwd")
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(MQTTHOST, MQTTPORT, 60)
client.loop_start()
time.sleep(3)
mcp.run(transport="stdio")
筆者的設(shè)備都是通過(guò)bemfa云控制的,具體接入文檔可以參照巴法云的說(shuō)明。
MCP server運(yùn)行在一個(gè)樹(shù)莓派上,先按照小智MCP示例安裝運(yùn)行環(huán)境,然后直接把小智MCP接入點(diǎn)的字符串寫到mcp_pipe.py文件中,省的設(shè)置環(huán)境變量。通過(guò)命令啟動(dòng)MCP server :python mcp_pipe.py switch-py.py。
在小智后臺(tái) --》配置角色 最下面的MCP接入點(diǎn)中就應(yīng)該能看到已經(jīng)接入的MCP服務(wù)了。

最后代碼
里面的一些變量需要自己修改,代碼寫的比較亂,大家湊合看。
附件:mcp代碼.rar?bbs.aithinker.com/forum.php?mod=attachment&aid=34182
審核編輯 黃宇
-
AI
+關(guān)注
關(guān)注
91文章
39793瀏覽量
301456 -
安信可
+關(guān)注
關(guān)注
0文章
226瀏覽量
5078
發(fā)布評(píng)論請(qǐng)先 登錄
【ESP32-C5系列】WT0132C5-S5/S5U模組產(chǎn)品介紹
【ESP32-C5系列】WT0132C5-S6/S6U模組產(chǎn)品介紹
唯捷創(chuàng)芯推出Wi-Fi 7和藍(lán)牙雙連接前端模組
【W(wǎng)iFi+藍(lán)牙模組】高性能 Wi-Fi +藍(lán)牙模組的國(guó)產(chǎn)替代方案
【W(wǎng)iFi+藍(lán)牙】智能門鎖、智能插座:用Ai-WB2系列,價(jià)格更低,性能更強(qiáng)
【 藍(lán)牙模組】安信可模組TG-12F/TG-01M:AT指令入門教程 &接入阿里飛燕/天貓精靈平臺(tái)
【Wi-Fi&BLE模組】給格力風(fēng)扇增加WiFi連網(wǎng),擴(kuò)充智慧家居
【Wi-Fi&BLE模組】Ai-WB2系列的固件燒錄指導(dǎo)
安信可BW系列模組,2.4G + 5.8G 雙頻加持,更穩(wěn)更快
用Wi-Fi藍(lán)牙模組Ai-M62-CBS做一個(gè)電子沙漏
2.4GHz / 5GHz Wi-Fi+BLE模組,可支持Wi-Fi Mesh組網(wǎng)
BW20雙頻WiFi模塊,可支持Wi-Fi Mesh 組網(wǎng):二次開(kāi)發(fā)環(huán)境搭建教程
BLE + Mesh ,安信可藍(lán)牙模組從可穿戴到智慧照明全覆蓋場(chǎng)景
安信可雙頻Wi-Fi模組BW16的99+常見(jiàn)問(wèn)題
【安信可Wi-Fi&BLE模組】做一個(gè)藍(lán)牙點(diǎn)陣音箱
評(píng)論