【项目背景】
随着科技的不断进步,人们对于生活品质的追求也越来越高。传统的家居装饰画已经无法满足现代人对于个性化和动态变化的需求。在物联网和人工智能技术日益成熟的今天,我们有机会将这些高科技元素融入日常生活,创造出能够与环境互动、随时间变化的智能艺术品。
“云绘天像”项目正是基于这样的背景应运而生。该项目旨在通过结合最新的人工智能技术和传感器技术,创造一种全新的家居装饰体验。通过实时分析环境数据和天气情况,利用AI生成与当前环境相匹配的画面内容,使得家中的装饰画不再是静态的,而是能够随天气、季节的变化而变化,为居住空间带来前所未有的活力和新鲜感。
【项目理念】
项目的核心理念是“生活即艺术”,通过科技手段将艺术与日常生活紧密结合,让每个人都能成为自己生活空间的艺术家。用户不仅能享受到个性化的视觉体验,还能在与作品的互动中感受到科技的魅力和生活的乐趣。
【项目设计】
项目以传感器硬件如温湿度传感器、光线传感器和空气质量传感器为基础,搭配行空板,实现数据的实时采集与处理。通过调用心知天气API,系统能够获取并整合天气信息,然后利用人工智能如Kimi API,将这些数据转化为生动的描述性文本。进一步地,腾讯AI绘画图像生成AI将这些文本转化为视觉图像,行空板屏幕则负责展示这些随时间变化的艺术作品。整个系统设计考虑了易用性,用户只需简单设置,便可以享受到自动化的个性化视觉体验。
【项目硬件】
【添加扩展】
Mind+python模式下添加“腾讯ai绘画”、“kimi”、“心知天气”扩展。
【获取Kimi的API】
登陆Kimi开放平台:访问以下网址,并微信扫码登陆,https://platform.moonshot.cn/console
在API Key 管理中,新建一个“API Key”,注意:密钥只会在新建后显示一次,请妥善保存。
【心知天气API_KEY】
访问:https://www.seniverse.com/,在“控制台”,添加密钥,获取API_KEY。
个人认为,温湿度、空气质量最好使用行空板连接传感器来测,得到的数据就是身边的环境数据,实时。因心知天气也能获取城市的温度,为测试方便,暂时用知心天气的。
【生成提示语】
将从知心天气获取的天气信息,“合并”成提示词,发送消息给Kimi,并返回响应。
想象一幅画面:乌云密布的天空下,一道闪电划破天际,雨滴在风中斜斜地落下。温度计显示22度,一个穿着轻便夏装的人在雨中奔跑,享受着凉爽的微风。
【腾讯ai绘画API】
腾讯云平台:https://cloud.tencent.com/,微信扫码登陆,控制台——访问密钥(搜索或最近访问)——API密钥管理。
新建密钥:(我的帐号只能建两个)为降低密钥泄漏的风险,自2023年11月30日起,新建的密钥只在创建时提供SecretKey,后续不可再进行查询,请保存好SecretKey。
运行程序时,出现资源不足的信息
【文生图轻量版】
改用“文生图轻量版”,使用“API Explorer 进行在线调试”,并可生成python代码。
prompt:阳光明媚,蓝天白云,温度适宜,空气清新,绿树成荫,鲜花盛开,人们在公园里散步或野餐。
negative prompt:反向提示词,它告诉模型在生成过程中应该避免某些特征或行为。低分辨率、暗淡的、扭曲的、变形的、不清晰的等。
Style:点击查看风格列表,仅支持单选。401
Resolution:生成图片分辨率。768:1024
生成如下python代码:
import json
import types
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.hunyuan.v20230901 import hunyuan_client, models
try:
# 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
# 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
# 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
cred = credential.Credential("SecretId", "SecretKey")
# 实例化一个http选项,可选的,没有特殊需求可以跳过
httpProfile = HttpProfile()
httpProfile.endpoint = "hunyuan.tencentcloudapi.com"
# 实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = hunyuan_client.HunyuanClient(cred, "ap-guangzhou", clientProfile)
# 实例化一个请求对象,每个接口都会对应一个request对象
req = models.TextToImageLiteRequest()
params = {
"Prompt": "阳光明媚,蓝天白云,温度适宜,空气清新,绿树成荫,鲜花盛开,人们在公园里散步或野餐。",
"NegativePrompt": "模糊",
"Style": "201",
"Resolution": "768:1024",
"LogoAdd": 1,
"RspImgType": "base64"
}
req.from_json_string(json.dumps(params))
# 返回的resp是一个TextToImageLiteResponse的实例,与请求对象对应
resp = client.TextToImageLite(req)
# 输出json格式的字符串回包
print(resp.to_json_string())
except TencentCloudSDKException as err:
print(err)
【安装SDK库】
Mind+python模型下,利用pip模型,手动安装:tencentcloud-sdk-python-hunyuan。
【python代码程序】
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import seniverse
from unihiker import GUI
import openai
import numpy as np
import json
import types
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.hunyuan.v20230901 import hunyuan_client, models
import base64
import cv2
u_gui=GUI()
api = "SAabm-73z5YLtTaxb"
lang = "&"
temp_unit = "&"
client = openai.OpenAI(api_key="****************", base_url="https://api.moonshot.cn/v1")
kimi_model = "moonshot-v1-8k"
kimi_temperature = 0.3
kimi_history = [
{"role": "system", "content": """你是 Kimi,由 Moonshot AI 提供的人工智能助手,
你更擅长中文和英文的对话。你会为用户提供安全,有帮助,准确的回答。
回答问题的时候尽量精简词语,尽量将回答控制在50字以内。
也不需要在回答中添加关于时效性或者是请注意之类的额外说明"""}
]
def kimi_chat(query, kimi_history, kimi_model, kimi_temperature):
kimi_history.append({
"role": "user",
"content": query
})
completion = client.chat.completions.create(
model=kimi_model,
messages=kimi_history,
temperature=kimi_temperature,
)
result = completion.choices[0].message.content
kimi_history.append({
"role": "assistant",
"content": result
})
return result
url = "https://api.seniverse.com/v3/weather/daily.json?key=" + api + lang + temp_unit
weather = seniverse.get_seni_weather(url ,"张家口")
ZuiGaoWenDu = weather["results"][0]["daily"][0]["high"]
TianQiXianXiang = weather["results"][0]["daily"][0]["text_day"]
FengSu = weather["results"][0]["daily"][0]["wind_speed"]
Tianqi=(str("利用温度") + str((str(ZuiGaoWenDu) + str((str("、天气") + str((str(TianQiXianXiang) + str((str("、风速") + str((str(FengSu) + str("构思一幅图画。"))))))))))))
TiShiCi = kimi_chat(Tianqi,kimi_history, kimi_model, kimi_temperature)
print(Tianqi)
print(TiShiCi)
cred = credential.Credential("****************","*********************")
httpProfile = HttpProfile()
httpProfile.endpoint = "hunyuan.tencentcloudapi.com"
#实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = hunyuan_client.HunyuanClient(cred, "ap-guangzhou", clientProfile)
req = models.TextToImageLiteRequest()
params = {
"Prompt": TiShiCi,
"NegativePrompt": "模糊,扭曲",
"Styles": ["102"],
"ResultConfig": {
"Resolution": "768:1024"
},
"LogoAdd": 0
}
req.from_json_string(json.dumps(params))
#返回的resp是一个TextToImageResponse的实例,与请求对象对应
resp = client.TextToImageLite(req)
image_base64 = resp.ResultImage
image_data = base64.b64decode(image_base64)
np_array=np.frombuffer(image_data,np.uint8)
image=cv2.imdecode(np_array,cv2.IMREAD_COLOR)
image=cv2.resize(image,(240,320))
cv2.imwrite("img.png", image)
显示图片=u_gui.draw_image(image="img.png",x=0,y=0)
while True:
pass
运行程序,打印如下信息:
利用温度21、天气阴、风速8.4构思一幅图画。
想象一幅画:柔和的光线透过云层,21度的气温下,人们穿着轻薄的衣物。远处的树木轻轻摇曳,风速8.4的微风让树叶沙沙作响。画面中心是一条小径,两旁是盛开的花朵,给人一种宁静而舒适的感觉。
【完善程序】
1.可增加时间,如2024年9月6日13时。日期可让AI确定季节,时间可让AI确定白天、黑天,太阳在图片中的位置(理论上)。
import datetime
year=datetime.datetime.now().year
month=datetime.datetime.now().month
day=datetime.datetime.now().day
hour=datetime.datetime.now().hour
Tianqi="利用时间"+str(year)+"年"+str(month)+"月"+str(day)+"日"+str(hour)+"时,温度"+ str(ZuiGaoWenDu) + "、天气" + TianQiXianXiang+ "、风速"+ str(FengSu) + ",构思一幅图画。"
2.增加每隔一小时,重新生成图片功能。为了演示效果,示例中是每一分钟重新生成图片。
3.根据说明文档,对Kimi的回答提出要求,修改“kimi_history”,要求Kimi每次给的答复控制在80个字以内。
kimi_history = [
{"role": "system", "content": """你是 Kimi,由 Moonshot AI 提供的人工智能助手,
你更擅长中文的对话。每次回答会将时间及天气信息描绘成一幅画面,且详细描述画面主体、细节、场景,必须将回答控制在80字以内。除此不需要额外的说明"""}
# -*- coding: UTF-8 -*-
# MindPlus
# Python
import seniverse
import datetime,time
from unihiker import GUI
import openai
import numpy as np
import json
import types
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.hunyuan.v20230901 import hunyuan_client, models
import base64
import cv2
u_gui=GUI()
api = "SAabm-73z5YLtTaxb"
lang = "&"
temp_unit = "&"
client_OpenAI = openai.OpenAI(api_key="*********************", base_url="https://api.moonshot.cn/v1")
kimi_model = "moonshot-v1-8k"
kimi_temperature = 0.3
kimi_history = [
{"role": "system", "content": """你是 Kimi,由 Moonshot AI 提供的人工智能助手,
你更擅长中文的对话。每次回答会将时间及天气信息描绘成一幅画面,且详细描述画面主体、细节、场景,必须将回答控制在80字以内。
除此不需要额外的说明"""}
]
def kimi_chat(query, kimi_history, kimi_model, kimi_temperature):
kimi_history.append({
"role": "user",
"content": query
})
completion = client_OpenAI.chat.completions.create(
model=kimi_model,
messages=kimi_history,
temperature=kimi_temperature,
)
result = completion.choices[0].message.content
kimi_history.append({
"role": "assistant",
"content": result
})
return result
url = "https://api.seniverse.com/v3/weather/daily.json?key=" + api + lang + temp_unit
weather = seniverse.get_seni_weather(url ,"张家口")
ZuiGaoWenDu = weather["results"][0]["daily"][0]["high"]
TianQiXianXiang = weather["results"][0]["daily"][0]["text_day"]
FengSu = weather["results"][0]["daily"][0]["wind_speed"]
year=datetime.datetime.now().year
month=datetime.datetime.now().month
day=datetime.datetime.now().day
hour=datetime.datetime.now().hour
Tianqi="利用时间"+str(year)+"年"+str(month)+"月"+str(day)+"日"+str(hour)+"时,温度"+ str(ZuiGaoWenDu) + "、天气" + TianQiXianXiang+ "、风速"+ str(FengSu) + ",构思一幅图画。"
TiShiCi = kimi_chat(Tianqi,kimi_history, kimi_model, kimi_temperature)
print(Tianqi)
print(TiShiCi)
cred = credential.Credential("*********************","*********************")
httpProfile = HttpProfile()
httpProfile.endpoint = "hunyuan.tencentcloudapi.com"
#实例化一个client选项,可选的,没有特殊需求可以跳过
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
# 实例化要请求产品的client对象,clientProfile是可选的
client = hunyuan_client.HunyuanClient(cred, "ap-guangzhou", clientProfile)
req = models.TextToImageLiteRequest()
params = {
"Prompt": TiShiCi,
"NegativePrompt": "模糊,扭曲",
"Styles": ["102"],
"ResultConfig": {
"Resolution": "768:1024"
},
"LogoAdd": 0
}
req.from_json_string(json.dumps(params))
#返回的resp是一个TextToImageResponse的实例,与请求对象对应
resp = client.TextToImageLite(req)
image_base64=resp.ResultImage
image_base64 = resp.ResultImage
image_data = base64.b64decode(image_base64)
np_array=np.frombuffer(image_data,np.uint8)
image=cv2.imdecode(np_array,cv2.IMREAD_COLOR)
image=cv2.resize(image,(240,320))
cv2.imwrite("img.png", image)
显示图片=u_gui.draw_image(image="img.png",x=0,y=0)
YunXingShiJian = time.time()
while True:
if ((time.time() - YunXingShiJian) > 60):
YunXingShiJian = time.time()
weather = seniverse.get_seni_weather(url ,"张家口")
ZuiGaoWenDu = weather["results"][0]["daily"][0]["high"]
TianQiXianXiang = weather["results"][0]["daily"][0]["text_day"]
FengSu = weather["results"][0]["daily"][0]["wind_speed"]
year=datetime.datetime.now().year
month=datetime.datetime.now().month
day=datetime.datetime.now().day
hour=datetime.datetime.now().hour
Tianqi="利用时间"+str(year)+"年"+str(month)+"月"+str(day)+"日"+str(hour)+"时,温度"+ str(ZuiGaoWenDu) + "、天气" + TianQiXianXiang+ "、风速"+ str(FengSu) + ",构思一幅图画。"
TiShiCi = kimi_chat(Tianqi,kimi_history, kimi_model, kimi_temperature)
params = {
"Prompt": TiShiCi,
"NegativePrompt": "模糊,扭曲",
"Styles": ["102"],
"ResultConfig": {
"Resolution": "768:1024"
},
"LogoAdd": 0
}
req.from_json_string(json.dumps(params))
#返回的resp是一个TextToImageResponse的实例,与请求对象对应
resp = client.TextToImageLite(req)
image_base64=resp.ResultImage
image_base64 = resp.ResultImage
image_data = base64.b64decode(image_base64)
np_array=np.frombuffer(image_data,np.uint8)
image=cv2.imdecode(np_array,cv2.IMREAD_COLOR)
image=cv2.resize(image,(240,320))
cv2.imwrite("img.png", image)
显示图片.config(image="img.png")
【程序上传到行空板】
1.行空板连接WIFI,10.1.2.3
2. 需为行空板安装openai、tencentcloud、tencentcloud-sdk-python-hunyuan库
3.心知天气库,使用扩展
sys.path.append("/root/mindplus/.lib/thirdExtension/nick-weather-thirdex")
【演示视频】
评论