本帖最后由 云天 于 2024-1-10 11:09 编辑
【项目背景】
2023年10月24日,2023科大讯飞全球1024开发者节在合肥开幕,如期升级发布讯飞星火认知大模型V3.0。科大讯飞讯飞星火认知大模型基于深度学习技术,通过大量的数据训练,具备了强大的自然语言处理能力。这个模型不仅能够理解人类语言,还能够执行各种任务,如问答、机器翻译、文本生成等,亮点在于引入了语音输入识别及语言播报。
【项目设计】
本项目给行空板插上上带麦克风的USB摄像头,为行空板配上“耳机”和“眼睛”。使用行空板自带的“蓝牙模块”连接上蓝牙音箱,行空板的嘴巴。行空板上的屏幕显示摄像头拍摄的内容。行空板通过Mind+的Python模式编写程序调用“星火认知大模型”API,配上智慧的大脑。(API功能:用户输入一张图片和问题,从而识别出图片中的对象、场景等信息回答用户的问题)
【项目实现】
1、通过调用Opencv库采集环境图像,通过讯飞语音识别功能识别用户提问,发送给“星火认知大模型”进行“图像理解”,并可结合图像内容进行多轮细节提问。也可让“大模型”结合图像内容编写故事等。再通过“讯飞语音合成”,行空板通过蓝牙音箱播放反馈结果。
2.本项目重点,让行空板机器人(本人给它做了一个很丑的外形),对着镜子给自己照相,然后我们让它评价一下自己。
【机器人外形】
用圆纸板做为机器人的“脸”,中间是行空板、上面是USB摄像头(这两个增加了图像理解难度),为了更像是“脸”,用两个圆形红纸片装饰成两个腮红,再加上一个红红的大嘴吧。丑还是丑!!!
【测试一下】
把丑丑的它自己的照片传给星火大语言模型进行图片理解,因我做的机器人有点抽象,有时它不太理解我问的问题,比如它找不到“自己的腿”。
-
- 问:这张照片里有一个抽象的机器人和一个带灯的蓝牙音箱。请描述一下这个机器人。
- 答:这个机器人看起来像一个卡通人物,它有一个圆润的身体和一个大眼睛。它的身体是白色的,眼睛是蓝色的。
-
- 问:机器人的嘴是什么颜色?
- 答:根据照片描述,机器人的嘴是红色的。
-
- 问:机器人的一只腿上有一个东西,请描述一下它是什么?(我想问的是那个按钮)
- 答:根据照片描述,机器人的一只腿上有一个东西,它是一个带灯的蓝牙音箱。
-
- 问:蓝牙音箱上面是机器人的两条腿,记住这一点,然后重新描述一下,机器人腿上的东西。
- 答:根据照片描述,蓝牙音箱的上面是机器人的两条腿,所以这个东西就是蓝牙音箱。(我的机器人太抽象了,它也迷糊了)
-
- 问:那你描述一下这个蓝牙音箱
- 答:根据照片描述,蓝牙音箱的上面是机器人的两条腿,所以这个东西就是蓝牙音箱。
-
- 问:这个蓝牙音箱长什么样子
- 答:根据照片描述,这个蓝牙音箱的外形是一个长方形,上面有一个圆形的灯。
-
- 问:蓝牙音箱的外形是圆形的,请住这一点。那么请重新描述一下这个音箱。
- 答:根据照片描述,这个蓝牙音箱的外形是一个圆形的,所以这个东西就是蓝牙音箱。
-
- 问:这个蓝牙音箱长什么样子?
- 答:根据照片描述,这个蓝牙音箱的外形是一个圆形的,上面有一个圆形的灯。
-
- 问:机器人能说话吗?
- 答:根据照片描述,这个机器人的嘴是红色的。所以它可能能说话,但需要更多的信息才能确定。
-
- 问:说一说这个机器人的美丑?并说明理由。
- 答:根据照片描述,这个机器人的外形是一个圆润的身体和一个大眼睛。它的身体是白色的,眼睛是蓝色的。从视觉上来看,它看起来很可爱,所以可以说是美的。但是美丑是主观的评价,不同的人可能会有不同的看法。
-
- 问:你能重新给这个机器人设计一个形象
- 答:将机器人的头部设计成一个球形,身体设计成圆柱形,这样可以让整个机器人看起来更加立体和生动。同时,可以在机器人的身上添加一些细节,比如在身体上添加一些花纹或者图案,让机器人看起来更加有趣和吸引人。
-
- 问:你给一个刚刚说的机器人设计图,并以网址链接的形式给我,我能通过这个网址下载你的设计图。
- 答:抱歉,作为一个认知智能模型的我无法提供图片和网址链接。
复制代码
所用的代码:
-
- import _thread as thread
- import base64
- import datetime
- import hashlib
- import hmac
- import json
- from urllib.parse import urlparse
- import ssl
- from datetime import datetime
- from time import mktime
- from urllib.parse import urlencode
- from wsgiref.handlers import format_date_time
- import websocket # 使用websocket_client
-
-
- appid = "*********************" #填写控制台中获取的 APPID 信息
- api_secret = "*****************" #填写控制台中获取的 APISecret 信息
- api_key ="*********************" #填写控制台中获取的 APIKey 信息
- imagedata = open("pic.jpg",'rb').read()
-
-
-
- imageunderstanding_url = "wss://spark-api.cn-huabei-1.xf-yun.com/v2.1/image"#云端环境的服务地址
- text =[{"role": "user", "content": str(base64.b64encode(imagedata), 'utf-8'), "content_type":"image"}]
-
-
-
- class Ws_Param(object):
- # 初始化
- def __init__(self, APPID, APIKey, APISecret, imageunderstanding_url):
- self.APPID = APPID
- self.APIKey = APIKey
- self.APISecret = APISecret
- self.host = urlparse(imageunderstanding_url).netloc
- self.path = urlparse(imageunderstanding_url).path
- self.ImageUnderstanding_url = imageunderstanding_url
-
- # 生成url
- def create_url(self):
- # 生成RFC1123格式的时间戳
- now = datetime.now()
- date = format_date_time(mktime(now.timetuple()))
-
- # 拼接字符串
- signature_origin = "host: " + self.host + "\n"
- signature_origin += "date: " + date + "\n"
- signature_origin += "GET " + self.path + " HTTP/1.1"
-
- # 进行hmac-sha256进行加密
- signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
- digestmod=hashlib.sha256).digest()
-
- signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
-
- authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
-
- authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
-
- # 将请求的鉴权参数组合为字典
- v = {
- "authorization": authorization,
- "date": date,
- "host": self.host
- }
- # 拼接鉴权参数,生成url
- url = self.ImageUnderstanding_url + '?' + urlencode(v)
- #print(url)
- # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
- return url
-
-
- # 收到websocket错误的处理
- def on_error(ws, error):
- print("### error:", error)
-
-
- # 收到websocket关闭的处理
- def on_close(ws,one,two):
- print(" ")
-
-
- # 收到websocket连接建立的处理
- def on_open(ws):
- thread.start_new_thread(run, (ws,))
-
-
- def run(ws, *args):
- data = json.dumps(gen_params(appid=ws.appid, question= ws.question ))
- ws.send(data)
-
-
- # 收到websocket消息的处理
- def on_message(ws, message):
- #print(message)
- data = json.loads(message)
- code = data['header']['code']
- if code != 0:
- print(f'请求错误: {code}, {data}')
- ws.close()
- else:
- choices = data["payload"]["choices"]
- status = choices["status"]
- content = choices["text"][0]["content"]
- print(content,end ="")
- global answer
- answer += content
- # print(1)
- if status == 2:
- ws.close()
-
-
- def gen_params(appid, question):
- """
- 通过appid和用户的提问来生成请参数
- """
-
- data = {
- "header": {
- "app_id": appid
- },
- "parameter": {
- "chat": {
- "domain": "image",
- "temperature": 0.5,
- "top_k": 4,
- "max_tokens": 2028,
- "auditing": "default"
- }
- },
- "payload": {
- "message": {
- "text": question
- }
- }
- }
-
- return data
-
-
- def main(appid, api_key, api_secret, imageunderstanding_url,imagedata,question):
-
- wsParam = Ws_Param(appid, api_key, api_secret, imageunderstanding_url)
- websocket.enableTrace(False)
- wsUrl = wsParam.create_url()
- ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
- ws.appid = appid
- ws.imagedata = imagedata
- ws.question = question
- ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
-
-
- def getText(role, content):
- jsoncon = {}
- jsoncon["role"] = role
- jsoncon["content"] = content
- text.append(jsoncon)
- return text
-
-
- def getlength(text):
- length = 0
- for content in text:
- temp = content["content"]
- leng = len(temp)
- length += leng
- return length
-
-
- def checklen(text):
- #print("text-content-tokens:", getlength(text[1:]))
- while (getlength(text[1:])> 8000):
- del text[1]
- return text
-
- if __name__ == '__main__':
-
- text.clear
- print(text)
- while(1):
- Input = input("\n" +"问:")
- question = checklen(getText("user",Input))
- print(question)
- answer = ""
- print("答:",end = "")
- main(appid, api_key, api_secret, imageunderstanding_url, imagedata,question)
- getText("assistant", answer)
- # print(str(text))
复制代码
【行空板摄像头】
行空板使用USB摄像头,通过Opencv库打开摄像头获取图像并在屏幕上显示。
-
-
- #导入所需的模块:
- import cv2
- from unihiker import GUI
- #创建视频对象并打开摄像头:
- cap = cv2.VideoCapture(0) # 参数为0表示默认摄像头设备
- u_gui=GUI()
- #读取每一帧图像并显示:
- bs=0
- while True:
- ret, img = cap.read() # 从摄像头读取当前帧图像
-
- if not ret:
- break # 若无法成功读取图像,则退出循环
- img=cv2.resize(img,(240,320))
- cv2.imwrite("img.png", img)
- if bs==0:
- AI图=u_gui.draw_image(image="img.png",x=0,y=0)
- bs=1
- else:
- AI图.config(image="img.png")
- #关闭视频对象:
- cap.release()
复制代码
【使用A键拍照进行图像理解】
使用行空板自带的A键,程序中用“button_a.is_pressed()”判断是否按下。主要用于测试时使用,当整个机器人安装好后,每次去“脸”的后面去按有些不方便。
-
- import _thread as thread
- import base64
- import datetime
- import hashlib
- import hmac
- import json
- from urllib.parse import urlparse
- import ssl
- from datetime import datetime
- from time import mktime
- from urllib.parse import urlencode
- from wsgiref.handlers import format_date_time
- import websocket # 使用websocket_client
- import cv2
- import base64
- from unihiker import GUI
- from pinpong.extension.unihiker import *
- from pinpong.board import Board,Pin
- import time
- Board().begin()
-
- #创建视频对象并打开摄像头:
- cap = cv2.VideoCapture(0) # 参数为0表示默认摄像头设备
-
- #读取每一帧图像并显示:
- bs=0
-
- appid = "************" #填写控制台中获取的 APPID 信息
- api_secret = "******************" #填写控制台中获取的 APISecret 信息
- api_key ="***********************" #填写控制台中获取的 APIKey 信息
- imageunderstanding_url = "wss://spark-api.cn-huabei-1.xf-yun.com/v2.1/image"#云端环境的服务地址
- text =[{"role": "user", "content": "", "content_type":"image"}]
-
- class Ws_Param(object):
- # 初始化
- def __init__(self, APPID, APIKey, APISecret, imageunderstanding_url):
- self.APPID = APPID
- self.APIKey = APIKey
- self.APISecret = APISecret
- self.host = urlparse(imageunderstanding_url).netloc
- self.path = urlparse(imageunderstanding_url).path
- self.ImageUnderstanding_url = imageunderstanding_url
-
- # 生成url
- def create_url(self):
- # 生成RFC1123格式的时间戳
- now = datetime.now()
- date = format_date_time(mktime(now.timetuple()))
-
- # 拼接字符串
- signature_origin = "host: " + self.host + "\n"
- signature_origin += "date: " + date + "\n"
- signature_origin += "GET " + self.path + " HTTP/1.1"
-
- # 进行hmac-sha256进行加密
- signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
- digestmod=hashlib.sha256).digest()
-
- signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
-
- authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
-
- authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
-
- # 将请求的鉴权参数组合为字典
- v = {
- "authorization": authorization,
- "date": date,
- "host": self.host
- }
- # 拼接鉴权参数,生成url
- url = self.ImageUnderstanding_url + '?' + urlencode(v)
- #print(url)
- # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
- return url
-
-
- # 收到websocket错误的处理
- def on_error(ws, error):
- print("### error:", error)
-
-
- # 收到websocket关闭的处理
- def on_close(ws,one,two):
- print(" ")
-
-
- # 收到websocket连接建立的处理
- def on_open(ws):
- thread.start_new_thread(run, (ws,))
-
-
- def run(ws, *args):
- data = json.dumps(gen_params(appid=ws.appid, question= ws.question ))
- ws.send(data)
-
-
- # 收到websocket消息的处理
- def on_message(ws, message):
-
- data = json.loads(message)
- code = data['header']['code']
- if code != 0:
- print(f'请求错误: {code}, {data}')
- ws.close()
- else:
- choices = data["payload"]["choices"]
- status = choices["status"]
- content = choices["text"][0]["content"]
-
- print(content,end ="")
- global answer
- answer += content
- # print(1)
- if status == 2:
- ws.close()
-
-
- def gen_params(appid, question):
- """
- 通过appid和用户的提问来生成请参数
- """
-
- data = {
- "header": {
- "app_id": appid
- },
- "parameter": {
- "chat": {
- "domain": "image",
- "temperature": 0.5,
- "top_k": 4,
- "max_tokens": 2028,
- "auditing": "default"
- }
- },
- "payload": {
- "message": {
- "text": question
- }
- }
- }
-
- return data
-
-
- def main(appid, api_key, api_secret, imageunderstanding_url,imagedata,question):
-
- wsParam = Ws_Param(appid, api_key, api_secret, imageunderstanding_url)
- websocket.enableTrace(False)
- wsUrl = wsParam.create_url()
- ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
- ws.appid = appid
- ws.imagedata = imagedata
- ws.question = question
- ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
-
-
- def getText(role, content):
- jsoncon = {}
- jsoncon["role"] = role
- jsoncon["content"] = content
- text.append(jsoncon)
- return text
-
-
- def getlength(text):
- length = 0
- for content in text:
- temp = content["content"]
- leng = len(temp)
- length += leng
- return length
-
-
- def checklen(text):
- #print("text-content-tokens:", getlength(text[1:]))
- while (getlength(text[1:])> 8000):
- del text[1]
- return text
-
-
- u_gui=GUI()
-
- if __name__ == '__main__':
-
-
- bs=0
- while(1):
- ret, img = cap.read() # 从摄像头读取当前帧图像
-
- if not ret:
- break # 若无法成功读取图像,则退出循环
- img=cv2.resize(img,(240,320))
- cv2.imwrite("img.jpg", img)
-
- if bs==0:
- AI图=u_gui.draw_image(image="img.jpg",x=0,y=0)
- bs=1
- else:
- AI图.config(image="img.jpg")
- if (button_a.is_pressed()==True):
- imagedata = open("img.jpg",'rb').read()
- text =[{"role": "user", "content": str(base64.b64encode(imagedata), 'utf-8'), "content_type":"image"}]
- text.clear
-
- Input="start"
- while True:
- Input = input("\n" +"问:")
- if Input=="不再提问":
- break
- question = checklen(getText("user",Input))
-
- answer = ""
- print("答:",end = "")
- main(appid, api_key, api_secret, imageunderstanding_url, imagedata,question)
-
- getText("assistant", answer)
- #关闭视频对象:
- cv2.destroyAllWindows()
-
-
复制代码
【语音交互】
语音监听及录音使用自定义模块文件“listening.py”(这前项目有源代码,此不在展示),使用一个外置按钮接在22引脚上,方便操作。语音交互使用讯飞语音识别及语音合成。完整代码如下:
-
- import _thread as thread
- import base64
- import datetime
- import hashlib
- import hmac
- import json
- from urllib.parse import urlparse
- import ssl
- from datetime import datetime
- from time import mktime
- from urllib.parse import urlencode
- from wsgiref.handlers import format_date_time
- import websocket # 使用websocket_client
- import cv2
- import base64
- from unihiker import GUI
- from pinpong.extension.unihiker import *
- from pinpong.board import Board,Pin
- import time
- import listening
-
- from df_xfyun_speech import XfIat
- from df_xfyun_speech import XfTts
- from unihiker import Audio
- u_audio = Audio()
-
- appid = "***************" #填写控制台中获取的 APPID 信息
- api_secret = "**************" #填写控制台中获取的 APISecret 信息
- api_key ="******************" #填写控制台中获取的 APIKey 信息
- import xunfeiasr
- xunfeiasr.xunfeiasr_set(APPID=appid,APISecret=api_secret,APIKey=api_key)
- options = {}
- tts = XfTts(appid, api_key, api_secret, options)
-
- iat = XfIat(appid, api_key, api_secret)
- Board().begin()
- p_p22_in=Pin(Pin.P22, Pin.IN)
- #创建视频对象并打开摄像头:
- cap = cv2.VideoCapture(0) # 参数为0表示默认摄像头设备
-
- #读取每一帧图像并显示:
- bs=0
-
- imageunderstanding_url = "wss://spark-api.cn-huabei-1.xf-yun.com/v2.1/image"#云端环境的服务地址
- text =[{"role": "user", "content": "", "content_type":"image"}]
-
- class Ws_Param(object):
- # 初始化
- def __init__(self, APPID, APIKey, APISecret, imageunderstanding_url):
- self.APPID = APPID
- self.APIKey = APIKey
- self.APISecret = APISecret
- self.host = urlparse(imageunderstanding_url).netloc
- self.path = urlparse(imageunderstanding_url).path
- self.ImageUnderstanding_url = imageunderstanding_url
-
- # 生成url
- def create_url(self):
- # 生成RFC1123格式的时间戳
- now = datetime.now()
- date = format_date_time(mktime(now.timetuple()))
-
- # 拼接字符串
- signature_origin = "host: " + self.host + "\n"
- signature_origin += "date: " + date + "\n"
- signature_origin += "GET " + self.path + " HTTP/1.1"
-
- # 进行hmac-sha256进行加密
- signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
- digestmod=hashlib.sha256).digest()
-
- signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
-
- authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
-
- authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
-
- # 将请求的鉴权参数组合为字典
- v = {
- "authorization": authorization,
- "date": date,
- "host": self.host
- }
- # 拼接鉴权参数,生成url
- url = self.ImageUnderstanding_url + '?' + urlencode(v)
- #print(url)
- # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
- return url
-
-
- # 收到websocket错误的处理
- def on_error(ws, error):
- print("### error:", error)
-
-
- # 收到websocket关闭的处理
- def on_close(ws,one,two):
- print(" ")
-
-
- # 收到websocket连接建立的处理
- def on_open(ws):
- thread.start_new_thread(run, (ws,))
-
-
- def run(ws, *args):
- data = json.dumps(gen_params(appid=ws.appid, question= ws.question ))
- ws.send(data)
-
-
- # 收到websocket消息的处理
- def on_message(ws, message):
-
- data = json.loads(message)
- code = data['header']['code']
- if code != 0:
- print(f'请求错误: {code}, {data}')
- ws.close()
-
- else:
- choices = data["payload"]["choices"]
- status = choices["status"]
- content = choices["text"][0]["content"]
-
- print(content,end ="")
- global answer
- answer += content
- # print(1)
- if status == 2:
- ws.close()
-
-
- def gen_params(appid, question):
- """
- 通过appid和用户的提问来生成请参数
- """
-
- data = {
- "header": {
- "app_id": appid
- },
- "parameter": {
- "chat": {
- "domain": "image",
- "temperature": 0.5,
- "top_k": 4,
- "max_tokens": 2028,
- "auditing": "default"
- }
- },
- "payload": {
- "message": {
- "text": question
- }
- }
- }
-
- return data
-
-
- def main(appid, api_key, api_secret, imageunderstanding_url,imagedata,question):
-
- wsParam = Ws_Param(appid, api_key, api_secret, imageunderstanding_url)
- websocket.enableTrace(False)
- wsUrl = wsParam.create_url()
- ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
- ws.appid = appid
- ws.imagedata = imagedata
- ws.question = question
- ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
-
-
- def getText(role, content):
- jsoncon = {}
- jsoncon["role"] = role
- jsoncon["content"] = content
- text.append(jsoncon)
- return text
-
-
- def getlength(text):
- length = 0
- for content in text:
- temp = content["content"]
- leng = len(temp)
- length += leng
- return length
-
-
- def checklen(text):
- #print("text-content-tokens:", getlength(text[1:]))
- while (getlength(text[1:])> 8000):
- del text[1]
- return text
-
-
- u_gui=GUI()
-
- if __name__ == '__main__':
-
-
- bs=0
- while(1):
- ret, img = cap.read() # 从摄像头读取当前帧图像
-
- if not ret:
- break # 若无法成功读取图像,则退出循环
- img=cv2.resize(img,(240,320))
- cv2.imwrite("img.jpg", img)
-
- if bs==0:
- AI图=u_gui.draw_image(image="img.jpg",x=0,y=0)
- bs=1
- else:
- AI图.config(image="img.jpg")
- if (p_p22_in.read_digital()==True):
-
- imagedata = open("img.jpg",'rb').read()
- text =[{"role": "user", "content": str(base64.b64encode(imagedata), 'utf-8'), "content_type":"image"}]
- text.clear
- tts.synthesis("拍照已完成,请提出你的问题。", "speech.wav")
- u_audio.play("speech.wav")
- time.sleep(2)
-
- while True:
-
- listening.listen()
- ShiBieNaRong=xunfeiasr.xunfeiasr(r"record.wav")
- if ShiBieNaRong=="不再提问":
- break
- if ShiBieNaRong!="":
- question = checklen(getText("user",ShiBieNaRong))
- answer = ""
- print("答:",end = "")
- main(appid, api_key, api_secret, imageunderstanding_url, imagedata,question)
-
-
- if answer!="":
- tts.synthesis(answer+"……", "speech.wav")
- u_audio.play("speech.wav")
-
- getText("assistant", answer)
- time.sleep(2)
- #关闭视频对象:
- cv2.destroyAllWindows()
-
-
复制代码
【让“它“照镜子】让AI从镜子中找到自己的脸(实际上不太像是脸),并进行描述。开始AI并不认为镜中“圆圆的东西”是张脸,当告诉它后,它说:这是张白色的圆脸,眼睛很大,嘴巴微微张开,好像在笑,脸部表情非常可爱,给人一种友好和亲切的感觉。(真会夸)我要是告诉它这就是它自己,它会怎么说。我还真不敢问,不敢问呀!!!
我的视角拍的
这是它的视角看到的
【看”它“的主人及环境】
我让AI给我编了一个故事,但当我让AI评价一我的相貌时,它以无法看出我的年龄为由搪塞过去,是不想说,还是不敢说(怕我砸了它)。当我让看周围环境时,AI看的还是蛮认真的。
|