【项目背景】
从“语音操控”到“智能创造”
你是否想过,用一个语音指令,就能让AI不仅“看见”并认出你照片里的明星,还能根据描述“创造”出一张全新的画像? 本项目将带你实现这一构想。我们利用HUSKYLENS 2(二哈识图2) 的AI视觉能力和小智AI语音助手,结合LattePanda Alpha 800s上运行的Mind+ V2.0.7与MCP(模型上下文协议) 服务,打造一个完整的语音交互与图像生成系统。整个过程无需编写复杂代码,在Mind+的Python模式下即可轻松完成。 【项目效果演示】
【硬件清单】HUSKYLENS 2 AI视觉传感器 × 1:项目的“眼睛”,负责图像识别。 HUSKYLENS 2 WiFi模块 × 1:为HUSKYLENS 2提供联网能力。 LattePanda Alpha 800s × 1:项目的“大脑”,运行MCP服务。搭载Intel Core m3-8100Y处理器,性能足够。 15.6英寸1920×1080 IPS Type-C电容触摸屏 × 1:项目的“面孔”,用于显示生成的AI画像。 USB Type-C数据线 × 1。
【软件准备】
Mind+ V2.0.7的Python环境
本项目在LattePanda上运行,系统为Windows。核心软件是Mind+ V2.0.7。
核心步骤一:配置HUSKYLENS 2与“小智AI”硬件连接:将WiFi模块插入HUSKYLENS 2,并用Type-C数据线供电。 联网与激活:在HUSKYLENS 2屏幕菜单中配置WiFi。然后进入“小智AI”应用,记下激活码。 绑定设备:浏览器访问 小智控制平台,登录后输入激活码完成绑定。 获取MCP接入点:在控制平台中,找到你绑定的设备,复制其“MCP接入点” URL(形如wss://api.xiaozhi.me/mcp/?token=...)。
核心步骤二:在LattePanda上搭建MCP图像生成服务
这是项目的核心,我们在LattePanda上创建一个MCP服务,等待小智AI的调用。 创建Python项目:打开Mind+,python积木模式——手动编辑,将以下代码粘贴进去。 扩展里添加"小智MCP客户端" 配置参数:将代码中的SILICONFLOW_API_KEY替换为你的SiliconFlow API Key(https://cloud.siliconflow.cn/i/KwyEBX3e,有免费额度),将mcp_runtime.init_mcp_endpoint()中的URL替换为你刚才复制的小智AI MCP接入点。 运行服务:点击Mind+的“运行”按钮。
核心代码解析
- # -*- coding: UTF-8 -*-
- # MindPlus V2
- # python-block
- import json
- import requests
- import os
- import tempfile
- import cv2
- from mcp_api_lib import MCPBlockRuntime
- import threading
-
- # --- 配置区域 ---
- SILICONFLOW_API_KEY = "你的SiliconFlow API Key"
- SILICONFLOW_API_BASE = "https://api.siliconflow.cn/v1"
- IMAGE_GEN_MODEL = "Kwai-Kolors/Kolors"
-
- mcp_runtime = MCPBlockRuntime()
- mcp_current_ctx = None
-
- def generate_image2(prompt: str) -> str:
- """调用 SiliconFlow API 生成图片,返回本地路径"""
- url = f"{SILICONFLOW_API_BASE}/images/generations"
- headers = {
- "Authorization": f"Bearer {SILICONFLOW_API_KEY}",
- "Content-Type": "application/json",
- }
- payload = {
- "model": IMAGE_GEN_MODEL,
- "prompt": prompt,
- "image_size": "1024x1024",
- "batch_size": 1,
- "num_inference_steps": 20,
- }
- try:
- response = requests.post(url, json=payload, headers=headers)
- response.raise_for_status()
- result = response.json()
- image_url = result['images'][0]['url']
-
- img_response = requests.get(image_url, stream=True)
- img_response.raise_for_status()
- with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmp_file:
- for chunk in img_response.iter_content(chunk_size=8192):
- tmp_file.write(chunk)
- tmp_file_path = tmp_file.name
- return tmp_file_path
- except requests.exceptions.RequestException as e:
- error_msg = f"调用 SiliconFlow API 失败: {e}"
- print(error_msg)
- if e.response:
- try:
- error_detail = e.response.json()
- print(f"API 错误详情: {error_detail}")
- except:
- pass
- return None
-
- @mcp_runtime.on_tool_called("generate_image2")
- def on_mcp_tool_generate_image2(ctx):
- global mcp_current_ctx
- mcp_current_ctx = ctx
- prompt = mcp_runtime.get_param_string(ctx.args, "information")
- print(f"收到生成图片请求,提示词: {prompt}")
-
- if not prompt:
- # 修复:返回标准 MCP 格式
- return {
- "content": [
- {"type": "text", "text": "未收到信息"}
- ]
- }
-
- # 定义后台任务函数
- def generate_and_show():
- try:
- image_path = generate_image2(prompt)
- if image_path:
- img = cv2.imread(image_path)
- if img is not None:
- cv2.namedWindow("Generated Image", cv2.WINDOW_NORMAL)
- cv2.setWindowProperty("Generated Image", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
- cv2.imshow("Generated Image", img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- else:
- print("OpenCV 读取图片失败")
- # 可选:清理临时文件
- # os.remove(image_path)
- else:
- print("图片生成失败")
- except Exception as e:
- print(f"后台生成出错: {e}")
-
- # 启动后台线程(守护线程,主程序退出时自动结束)
- # 修复:取消注释,否则图片不会实际生成
- threading.Thread(target=generate_and_show, daemon=True).start()
-
- # 修复:返回标准 MCP 格式,包含 content 数组
- return {
- "content": [
- {"type": "text", "text": "信息已收到,图片正在后台生成中,请稍候..."}
- ]
- }
-
- # 主程序开始
- mcp_runtime.init_mcp_endpoint("你的小智AI MCP接入点URL")
-
- mcp_runtime.register_tool("generate_image2", "本工具能够根据人物信息,生成相应的图片")
- mcp_runtime.add_tool_param(
- tool_name="generate_image2",
- param_name="information",
- param_desc="信息",
- param_type="string",
- detail="信息可能是一个明星人物的描述信息,例如:'刘德华是……,根据信息,我们给其设计了发型是……,服装是……,背景是……'"
- )
-
- while True:
- mcp_runtime.keep_mcp_connection()
复制代码
代码要点: MCP工具注册:@mcp_runtime.on_tool_called("generate_image2") 装饰器将函数注册为一个可由小智AI调用的工具。 参数接收:mcp_runtime.get_param_string(ctx.args, "information") 获取小智AI传来的“信息”参数。
异步处理:使用threading在后台生成图片和显示,主线程立即返回“信息已收到”,保证语音交互的流畅性。 标准MCP响应:函数返回符合MCP协议的content数组,小智AI能正确解析并播报。
【工作流程】语音指令:你对小智AI说“根据胡歌的信息,为其生成相应图片”。 LLM理解与调用:小智AI的大语言模型理解意图,决定调用MCP工具generate_image2,并将描述文本作为information参数传递。 MCP服务响应:LattePanda上的Python服务接收到调用请求。 图像生成与显示:服务解析参数,调用SiliconFlow API生成图片,下载后用OpenCV全屏显示在触摸屏上。 语音反馈:服务立即返回“信息已收到,图片正在后台生成中”,小智AI播报此信息。
    
【总结与展望】 通过本项目,我们见证了MCP协议的强大威力——它像一个万能翻译官,让语音助手(小智AI)能够轻松调用各种本地服务(Python程序)。我们仅用百余行Python代码,就将一个AI视觉传感器与一个强大的云端图像生成模型无缝连接。 这套系统拥有无限可能:你可以将generate_image2替换成任何Python函数,比如控制GPIO引脚、操作数据库、发送邮件等等。Mind+ V2.0.7提供的Python环境选择器和pip库管理功能,让环境配置变得异常简单,让创作者能更专注于创意本身。 未来,你可以尝试: 结合HUSKYLENS 2的物体识别功能,让AI根据看到的物体生成故事插画。 利用其自学习分类模型,训练它认识你的宠物,然后生成宠物的卡通头像。 将MCP服务部署到行空板M10等更多设备上,打造分布式AI应用。
赶快动手试试吧,期待在DF创客社区看到你的精彩作品!
|