8379浏览
查看: 8379|回复: 6

[项目] 用大语言模型控制行空板机器人

[复制链接]
本帖最后由 云天 于 2024-1-9 18:58 编辑

【项目背景】
       百模大战愈演愈烈,大模型在各个社会场景中释放出的潜力已肉眼可见,不断推动着生产力的变革。技术的迭代升级,让开发门槛进一步降低,为开发者带来了新机遇。
       2023科大讯飞全球1024开发者节上,讯飞星火认知大模型V3.0如约而至,七大能力持续提升,整体超越ChatGPT,医疗六大核心能力超越GPT-4。
       现在讯飞星火V3.0已向开发者开放调用,多项能力提升的同时,新增FunctionCall 、System指令和大模型定制训练平台,满足开发者更多场景调用需求,带来优质人机交互体验。

       讯飞星火FunctionCall:
       让大模型实现与外部物理世界的交互,其中的关键就是对外部功能的调用,而其底层就是大模型FunctionCall的支持能力。讯飞星火新推出的FunctionCall 可调用自有函数生成内容,让大模型能更准确理解用户意图并与函数调用相匹配。对于开发者来说,Functioncall 功能的推出不仅使研发成本大大降低,还有助于打造更懂用户的应用。
【项目设计】
       本项目使用行空板结合星火大语言模型,让机器人理解我说的话(话的内容为控制机器人做动作的指令:抬起手、放下手,但话的内容不固定),做出相应的动作。同时配合讯飞语音识别和语音合成功能,用户可以与行空板机器人进行语音对话。
【演示视频】

【Function Call分析】
       从人机交互上来说, Function Call 本质上只做了一件事,那就是实现了「准确识别用户的语义,将其转为结构化的指令」。而这,非常了不起。
       它实现的最大的价值,就是让机器轻易地理解了用户模糊化的输入,将其转换为机器可以理解的技术指令。这对于人机交互的范式来说,完全是质的改变。
       官方文档里给出了使用模型进行Function Call 工具调用的流程(星火认知大模型Web API文档 | 讯飞开放平台文档中心 (xfyun.cn)):
  1. 我:明天我应该穿什么衣服?
  2. 星火:{"header":{"code":0,"message":"Success","sid":"cht000b8e77@dx18ce887dd74b8f3550","status":2},"payload":{"choices":{"status":2,"seq":0,"text":[{"content":"","role":"assistant","content_type":"text","function_call":{"arguments":"{"datetime":"明天","location":"CURRENT_CITY"}","name":"天气查询"},"index":0}]},"usage":{"text":{"question_tokens":6,"prompt_tokens":6,"completion_tokens":0,"total_tokens":6}}}}
复制代码

       假设我们正在开发一个聊天类的AI应用,它需要根据用户输入的问题来生成相应的回答。我们在提问上并没有直接问明天的天气如何,而是问「我明天应该穿什么衣服?」此时 语言完全理解了我的问题,而且知道穿衣建议是需要了解相关天气情况的。那么机器人应该返回一个关于今天天气的字符串。为了实现这个功能,我们可以定义一个名为“天气查询”的函数,它接受两个参数:一个表示日期的字符串、一个表示所在城市的字符串。然后,我们可以将这个函数的描述传递给大模型,让它生成一个包含调用该函数所需参数的JSON对象。最后,当用户输入一个问题时,我们可以让大模型分析问题并确定是否需要调用“天气查询”函数。如果需要,我们可以从JSON对象中提取所需的参数,并将它们传递给"天气查"询函数。这样,我们就可以根据用户输入的问题来生成相应的回答了。

       为了让机器理解人类的意图,过去我们想方设法去「约束用户行为」或者「猜测用户意图』。但时代已经开始变了,通过 Function Call, 我们只需要在发送给 GPT 请求时加一个functions的参数,告知 AI 可以调用的外部方法有什么,然后 AI 就能够自动分析问题的上下文,并通过多轮对话来收集必要的调用参数,最后拼合返回调用方法的 JSON。

【修改functions】

       定制了一个"机器人控制"functions,描述为:“机器人控制可以控制机器人的左右手相应动作,你可以让机器人抬起、放下左右手。可以是只控制一只手,也可能同时控制两只手。”
  1.        "payload": {
  2.             "message": {
  3.                 "text": question
  4.             },
  5.             "functions": {
  6.                 "text": [
  7.                     {
  8.                         "name": "机器人控制",
  9.                         "description": "机器人控制可以控制机器人的左右手相应动作,你可以让机器人抬起、放下左右手。可以是只控制一只手,也可能同时控制两只手",
  10.                         "parameters": {
  11.                             "type": "object",
  12.                             "properties": {
  13.                                 "hand": {
  14.                                     "type": "string",
  15.                                     "description": "控制对象,左手或右手或左右手"
  16.                                 },
  17.                                 "action": {
  18.                                     "type": "string",
  19.                                     "description": "动作,抬起或放下"
  20.                                 }
  21.                             },
  22.                             "required": [
  23.                                 "hand","action"
  24.                             ]
  25.                         }
  26.                     }
  27.                 ]
  28.             }   
  29.         }
复制代码
      经过对话发现星火对"让两只手都抬起",给出的反馈“hand”为“双手”,此处给星火点赞!

  1. 我:让机器人抬起左手
  2. 星火:{"header":{"code":0,"message":"Success","sid":"cht000bf06b@dx18ce8ce92c5b8f3550","status":2},"payload":{"choices":{"status":2,"seq":0,"text":[{"content":"","role":"assistant","content_type":"text","function_call":{"arguments":"{"action":"抬起","hand":"左手"}","name":"机器人控制"},"index":0}]},"usage":{"text":{"question_tokens":4,"prompt_tokens":4,"completion_tokens":0,"total_tokens":4}}}}
  3. 我:放下右手
  4. 星火:{"header":{"code":0,"message":"Success","sid":"cht000bf6ba@dx18ce8cee8eab8f2550","status":2},"payload":{"choices":{"status":2,"seq":0,"text":[{"content":"","role":"assistant","content_type":"text","function_call":{"arguments":"{"action":"放下","hand":"右手"}","name":"机器人控制"},"index":0}]},"usage":{"text":{"question_tokens":2,"prompt_tokens":6,"completion_tokens":0,"total_tokens":6}}}}
  5. 我:抬起右手
  6. 星火:{"header":{"code":0,"message":"Success","sid":"cht000b09e3@dx18ce8d1b7e69a4b550","status":2},"payload":{"choices":{"status":2,"seq":0,"text":[{"content":"","role":"assistant","content_type":"text","function_call":{"arguments":"{"action":"抬起","hand":"右手"}","name":"机器人控制"},"index":0}]},"usage":{"text":{"question_tokens":2,"prompt_tokens":2,"completion_tokens":0,"total_tokens":2}}}}
  7. 我:让两只手都抬起
  8. 星火:{"header":{"code":0,"message":"Success","sid":"cht000b0bea@dx18ce8d202b79a4b550","status":2},"payload":{"choices":{"status":2,"seq":0,"text":[{"content":"","role":"assistant","content_type":"text","function_call":{"arguments":"{"action":"抬起","hand":"双手"}","name":"机器人控制"},"index":0}]},"usage":{"text":{"question_tokens":5,"prompt_tokens":7,"completion_tokens":0,"total_tokens":7}}}}
复制代码
【定义行空板控制舵机函数】
       定义控制舵机函数“RobotControl”,根据用户输入参数的值。"hand"指控制操作的对象:左手、右手、双手。“action”指控制动作:抬起、放下。
  1. def RobotControl(hand,action):
  2.     if hand=="左手":
  3.         if action=="抬起":
  4.             servoL.write_angle(90)
  5.         else:
  6.             servoL.write_angle(178)
  7.     elif hand=="右手":
  8.         if action=="抬起":
  9.            servoR.write_angle(90)
  10.         else:
  11.            servoR.write_angle(2)
  12.     elif hand=="双手":
  13.         if action=="抬起":
  14.            servoL.write_angle(90)
  15.            servoR.write_angle(90)
  16.         else:
  17.            servoR.write_angle(2)
  18.            servoL.write_angle(178)
复制代码
     另我兴奋的是,我输入“把右手举起来”,星火也能反馈回来action:抬起。(当然此时,我已看到我的简易机器人,把它的“右手”“抬起”来了。
  1. 我:把右手举起来
  2. 星火:{"header":{"code":0,"message":"Success","sid":"cht000b8d3e@dx18ce96fcae5b8f2550","status":2},"payload":{"choices":{"status":2,"seq":0,"text":[{"content":"","role":"assistant","content_type":"text","function_call":{"arguments":"{"action":"抬起","hand":"右手"}","name":"机器人控制"},"index":0}]},"usage":{"text":{"question_tokens":4,"prompt_tokens":4,"completion_tokens":0,"total_tokens":4}}}}
复制代码
【简易机器人制作】
用大语言模型控制行空板机器人图1
【SparkApi模块文件完整代码】
  1. import _thread as thread
  2. import base64
  3. import datetime
  4. import hashlib
  5. import hmac
  6. import json
  7. from urllib.parse import urlparse
  8. import ssl
  9. from datetime import datetime
  10. from time import mktime
  11. from urllib.parse import urlencode
  12. from wsgiref.handlers import format_date_time
  13. import websocket  # 使用websocket_client
  14. from pinpong.extension.unihiker import *
  15. from pinpong.board import Servo
  16. from pinpong.board import Board
  17. from pinpong.board import Pin
  18. Board().begin()
  19. pin1 = Pin(Pin.D23)
  20. pin2 = Pin(Pin.D22)
  21. servoL = Servo(pin1)#左手舵机
  22. servoR = Servo(pin2)#右手舵机
  23. #左右手放平
  24. servoL.write_angle(178)
  25. servoR.write_angle(2)
  26. hand=""
  27. action=""
  28. answer = ""
  29. class Ws_Param(object):
  30.     # 初始化
  31.     def __init__(self, APPID, APIKey, APISecret, Spark_url):
  32.         self.APPID = APPID
  33.         self.APIKey = APIKey
  34.         self.APISecret = APISecret
  35.         self.host = urlparse(Spark_url).netloc
  36.         self.path = urlparse(Spark_url).path
  37.         self.Spark_url = Spark_url
  38.     # 生成url
  39.     def create_url(self):
  40.         # 生成RFC1123格式的时间戳
  41.         now = datetime.now()
  42.         date = format_date_time(mktime(now.timetuple()))
  43.         # 拼接字符串
  44.         signature_origin = "host: " + self.host + "\n"
  45.         signature_origin += "date: " + date + "\n"
  46.         signature_origin += "GET " + self.path + " HTTP/1.1"
  47.         # 进行hmac-sha256进行加密
  48.         signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
  49.                                  digestmod=hashlib.sha256).digest()
  50.         signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')
  51.         authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'
  52.         authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
  53.         # 将请求的鉴权参数组合为字典
  54.         v = {
  55.             "authorization": authorization,
  56.             "date": date,
  57.             "host": self.host
  58.         }
  59.         # 拼接鉴权参数,生成url
  60.         url = self.Spark_url + '?' + urlencode(v)
  61.         # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
  62.         return url
  63. # 收到websocket错误的处理
  64. def on_error(ws, error):
  65.     print("### error:", error)
  66. # 收到websocket关闭的处理
  67. def on_close(ws,one,two):
  68.     print(" ")
  69. # 收到websocket连接建立的处理
  70. def on_open(ws):
  71.     thread.start_new_thread(run, (ws,))
  72. def run(ws, *args):
  73.     data = json.dumps(gen_params(appid=ws.appid, domain= ws.domain,question=ws.question))
  74.     ws.send(data)
  75. # 收到websocket消息的处理
  76. def on_message(ws, message):
  77.     global hand,action
  78.     #print(message)
  79.     data = json.loads(message)
  80.     code = data['header']['code']
  81.     if code != 0:
  82.         print(f'请求错误: {code}, {data}')
  83.         ws.close()
  84.     else:
  85.         choices = data["payload"]["choices"]
  86.         status = choices["status"]
  87.         content = choices["text"][0]["content"]
  88.         print(content,end ="")
  89.         global answer
  90.         answer += content
  91.         # print(1)
  92.         if choices["text"][0]["function_call"] is not None:
  93.             function_call=choices["text"][0]["function_call"]
  94.             if function_call["name"]=="机器人控制":
  95.                arguments=json.loads(function_call["arguments"])
  96.                action=arguments["action"]
  97.                hand=arguments["hand"]
  98.                RobotControl(hand,action)
  99.         if status == 2:
  100.             ws.close()
  101. def gen_params(appid, domain,question):
  102.     """
  103.     通过appid和用户的提问来生成请参数
  104.     """
  105.     data = {
  106.         "header": {
  107.             "app_id": appid,
  108.             "uid": "1234"
  109.         },
  110.         "parameter": {
  111.             "chat": {
  112.                 "domain": domain,
  113.                 "temperature": 0.5,
  114.                 "max_tokens": 2048
  115.             }
  116.         },
  117.         "payload": {
  118.             "message": {
  119.                 "text": question
  120.             },
  121.             "functions": {
  122.                 "text": [
  123.                     {
  124.                         "name": "机器人控制",
  125.                         "description": "“机器人控制”可以控制机器人的左右手相应动作,你可以使用动作指令让机器人抬起、放下左右手。动作指令只包括抬起和放下。可以是只控制一只手,也可能同时控制双手",
  126.                         "parameters": {
  127.                             "type": "object",
  128.                             "properties": {
  129.                                 "hand": {
  130.                                     "type": "string",
  131.                                     "description": "控制对象,左手或右手或左右手"
  132.                                 },
  133.                                 "action": {
  134.                                     "type": "string",
  135.                                     "description": "动作,抬起或放下"
  136.                                 }
  137.                             },
  138.                             "required": [
  139.                                 "hand","action"
  140.                             ]
  141.                         }
  142.                     }
  143.                 ]
  144.             }   
  145.         }
  146.     }
  147.     return data
  148. def RobotControl(hand,action):
  149.     if hand=="左手":
  150.         if action=="抬起":
  151.             servoL.write_angle(90)
  152.         else:
  153.             servoL.write_angle(178)
  154.     elif hand=="右手":
  155.         if action=="抬起":
  156.            servoR.write_angle(90)
  157.         else:
  158.            servoR.write_angle(2)
  159.     elif hand=="双手":
  160.         if action=="抬起":
  161.            servoL.write_angle(90)
  162.            servoR.write_angle(90)
  163.         else:
  164.            servoR.write_angle(2)
  165.            servoL.write_angle(178)
  166. def main(appid, api_key, api_secret, Spark_url,domain, question):
  167.     # print("星火:")
  168.     wsParam = Ws_Param(appid, api_key, api_secret, Spark_url)
  169.     websocket.enableTrace(False)
  170.     wsUrl = wsParam.create_url()
  171.     ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)
  172.     ws.appid = appid
  173.     ws.question = question
  174.     ws.domain = domain
  175.     ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})
复制代码
【使用语音交互】
1.语音输入
(1)音量监听#主程序
  1. import listening
复制代码
      音量监听listening.py模块文件代码
  1. import pyaudio,wave
  2. import numpy as np
  3. def listen():
  4.     temp = 20
  5.     CHUNK = 1024
  6.     FORMAT = pyaudio.paInt16
  7.     CHANNELS = 1
  8.     RATE = 16000
  9.     RECORD_SECONDS = 2
  10.     WAVE_OUTPUT_FILENAME = 'record.wav'
  11.     mindb=1500    #最小声音,大于则开始录音,否则结束
  12.     delayTime=1.3  #小声1.3秒后自动终止
  13.     p = pyaudio.PyAudio()
  14.     stream = p.open(format=FORMAT,
  15.                     channels=CHANNELS,
  16.                     rate=RATE,
  17.                     input=True,
  18.                     frames_per_buffer=CHUNK)
  19.     #snowboydecoder.play_audio_file()
  20.     print("开始!计时")
  21.     frames = []
  22.     flag = False            # 开始录音节点
  23.     stat = True                                #判断是否继续录音
  24.     stat2 = False                        #判断声音小了
  25.     tempnum = 0                                #tempnum、tempnum2、tempnum3为时间
  26.     tempnum2 = 0
  27.     while stat:
  28.         data = stream.read(CHUNK,exception_on_overflow = False)
  29.         
  30.         audio_data = np.frombuffer(data, dtype=np.short)
  31.         temp = np.max(audio_data)
  32.         if temp > mindb and flag==False:
  33.             flag =True
  34.             print("开始录音")
  35.             tempnum2=tempnum
  36.         if flag:
  37.             frames.append(data)
  38.             if(temp < mindb and stat2==False):
  39.                 stat2 = True
  40.                 tempnum2 = tempnum
  41.                 print("声音小,且之前是是大的或刚开始,记录当前点")
  42.             if(temp > mindb):
  43.                 stat2 =False
  44.                 tempnum2 = tempnum
  45.                 #刷新
  46.             if(tempnum > tempnum2 + delayTime*15 and stat2==True):
  47.                 print("间隔%.2lfs后开始检测是否还是小声"%delayTime)
  48.                 if(stat2 and temp < mindb):
  49.                     stat = False
  50.                     #还是小声,则stat=True
  51.                     print("小声!")
  52.                 else:
  53.                     stat2 = False
  54.                     print("大声!")
  55.         print(str(temp)  +  "      " +  str(tempnum))
  56.         tempnum = tempnum + 1
  57.         if tempnum > 3600:
  58.             tempnum=0                        #超时直接退出
  59.             #stat = False
  60.     print("录音结束")
  61.     stream.stop_stream()
  62.     stream.close()
  63.     p.terminate()
  64.     wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
  65.     wf.setnchannels(CHANNELS)
  66.     wf.setsampwidth(p.get_sample_size(FORMAT))
  67.     wf.setframerate(RATE)
  68.     wf.writeframes(b''.join(frames))
  69.     wf.close()
复制代码
(2)讯飞语音识别
主程序 导入讯飞语音识别库
  1. import xunfeiasr
  2. xunfeiasr.xunfeiasr_set(APPID=appid,APISecret=api_secret,APIKey=api_key)
复制代码
将主程序文字输入修改为讯飞语音识别文本输入。
修改:
  1. Input = input("\n" +"我:")
复制代码
为:
  1. listening.listen()
  2. ShiBieNaRong=xunfeiasr.xunfeiasr(r"record.wav")
复制代码
      经测试星火有时会反馈其它action,所以在描述description中增加对动作指令的限制。
  1. "description": "“机器人控制”可以控制机器人的左右手相应动作,你可以使用动作指令让机器人抬起、放下左右手。动作指令只包括抬起和放下。可以是只控制一只手,也可能同时控制双手",
复制代码
      使用语音输入如:把右手向上,也能实现机器人抬起右手。nice!
  
       主程序代码:
  1. import SparkApi
  2. import listening
  3. #以下密钥信息从控制台获取
  4. appid = "*********"     #填写控制台中获取的 APPID 信息
  5. api_secret = "***********"   #填写控制台中获取的 APISecret 信息
  6. api_key ="**************"    #填写控制台中获取的 APIKey 信息
  7. import xunfeiasr
  8. xunfeiasr.xunfeiasr_set(APPID=appid,APISecret=api_secret,APIKey=api_key)
  9. #用于配置大模型版本,默认“general/generalv2”
  10. #domain = "general"   # v1.5版本
  11. # domain = "generalv2"    # v2.0版本
  12. domain = "generalv3"    # v3.0版本
  13. #云端环境的服务地址
  14. #Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # v1.5环境的地址
  15. # Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat"  # v2.0环境的地址
  16. Spark_url = "ws://spark-api.xf-yun.com/v3.1/chat"
  17. text =[]
  18. # length = 0
  19. def getText(role,content):
  20.     jsoncon = {}
  21.     jsoncon["role"] = role
  22.     jsoncon["content"] = content
  23.     text.append(jsoncon)
  24.     return text
  25. def getlength(text):
  26.     length = 0
  27.     for content in text:
  28.         temp = content["content"]
  29.         leng = len(temp)
  30.         length += leng
  31.     return length
  32. def checklen(text):
  33.     while (getlength(text) > 8000):
  34.         del text[0]
  35.     return text
  36.    
  37. if __name__ == '__main__':
  38.     text.clear
  39.     while(1):
  40.         listening.listen()
  41.         Input=xunfeiasr.xunfeiasr(r"record.wav")
  42.         question = checklen(getText("user",Input))
  43.         SparkApi.answer =""
  44.         print("星火:",end = "")
  45.         SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)
  46.         getText("assistant",SparkApi.answer)
  47.         # print(str(text))
复制代码
2.行空板屏幕表情
  1. from unihiker import GUI
  2. u_gui=GUI()
  3. 表情=u_gui.draw_emoji(emoji="Peace",x=0,y=0,duration=0.2)
复制代码

3.测试视频:


4.机器人语音回答
    (1)设置行空板蓝牙连接蓝牙音箱。       在行空板终端窗口下使用bluetoothctl配置蓝牙连接蓝牙音箱。
用大语言模型控制行空板机器人图2

    (2)讯飞语音合成
       初始化
  1. from df_xfyun_speech import XfTts
  2. from unihiker import Audio
  3. u_audio = Audio()
  4. options = {}
  5. business_args = {"aue":"raw","vcn":"xiaoyan","tte":"utf8","speed":50,"volume":50,"pitch":50,"bgs":0}
  6. options["business_args"] = business_args
  7. tts = XfTts(appid, api_key, api_secret, options)
复制代码
      主程序循环体while(1)中增加,当星火有回复时:
  1.        if SparkApi.answer!="":
  2.              tts.synthesis(answer+"……", "speech.wav")
  3.              u_audio.play("speech.wav")
复制代码

当命中机器人控制时:
  1.         if SparkApi.hand!="":
  2.             tts.synthesis("好的"+SparkApi.hand+SparkApi.action+"了", "speech.wav")
  3.             u_audio.play("speech.wav")
复制代码

【主程序完整代码】
  1. import SparkApi
  2. import listening
  3. import time
  4. #以下密钥信息从控制台获取
  5. appid = "*******************"     #填写控制台中获取的 APPID 信息
  6. api_secret = "***************************"   #填写控制台中获取的 APISecret 信息
  7. api_key ="*******************************"    #填写控制台中获取的 APIKey 信息
  8. import xunfeiasr
  9. xunfeiasr.xunfeiasr_set(APPID=appid,APISecret=api_secret,APIKey=api_key)
  10. from df_xfyun_speech import XfTts
  11. from unihiker import Audio
  12. u_audio = Audio()
  13. options = {}
  14. business_args = {"aue":"raw","vcn":"xiaoyan","tte":"utf8","speed":50,"volume":50,"pitch":50,"bgs":0}
  15. options["business_args"] = business_args
  16. global tts
  17. tts = XfTts(appid, api_key, api_secret, options)
  18. #用于配置大模型版本,默认“general/generalv2”
  19. #domain = "general"   # v1.5版本
  20. # domain = "generalv2"    # v2.0版本
  21. domain = "generalv3"    # v3.0版本
  22. #云端环境的服务地址
  23. #Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # v1.5环境的地址
  24. # Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat"  # v2.0环境的地址
  25. Spark_url = "ws://spark-api.xf-yun.com/v3.1/chat"
  26. text =[]
  27. from unihiker import GUI
  28. u_gui=GUI()
  29. 表情=u_gui.draw_emoji(emoji="Peace",x=0,y=0,duration=0.2)
  30. # length = 0
  31. def getText(role,content):
  32.     jsoncon = {}
  33.     jsoncon["role"] = role
  34.     jsoncon["content"] = content
  35.     text.append(jsoncon)
  36.     return text
  37. def getlength(text):
  38.     length = 0
  39.     for content in text:
  40.         temp = content["content"]
  41.         leng = len(temp)
  42.         length += leng
  43.     return length
  44. def checklen(text):
  45.     while (getlength(text) > 8000):
  46.         del text[0]
  47.     return text
  48.    
  49. if __name__ == '__main__':
  50.     text.clear
  51.     while(1):
  52.         listening.listen()
  53.         表情.config(emoji="Wink")
  54.         Input=xunfeiasr.xunfeiasr(r"record.wav")
  55.         print(Input)
  56.         question = checklen(getText("user",Input))
  57.         SparkApi.answer =""
  58.         SparkApi.hand=""
  59.         print("星火:",end = "")
  60.         SparkApi.main(appid,api_key,api_secret,Spark_url,domain,question)
  61.         if SparkApi.answer!="":
  62.              tts.synthesis(SparkApi.answer+"……", "speech.wav")
  63.              u_audio.play("speech.wav")
  64.              time.sleep(3)
  65.         if SparkApi.hand!="":
  66.             tts.synthesis("好的"+SparkApi.hand+SparkApi.action+"了", "speech.wav")
  67.             u_audio.play("speech.wav")
  68.         getText("assistant",SparkApi.answer)
  69.         表情.config(emoji="Peace")
  70.         # print(str(text))
复制代码

【注:System指令

       System指令可对模型在多轮对话中的角色信息进行快捷约束,避免模型定制,即要求模型按照约定的方式进行后续响应。相比prompt约束,可以解决prompt拼接不连贯、不支持多轮的问题。















木子呢  管理员

发表于 2024-1-10 09:58:29

wow!越来越丰富了,期待更多行空板+大语言模型的项目!!!
回复

使用道具 举报

云天  初级技神
 楼主|

发表于 2024-1-10 11:20:31

木子呢 发表于 2024-1-10 09:58
wow!越来越丰富了,期待更多行空板+大语言模型的项目!!!

最近一直在研究这方面内容。
回复

使用道具 举报

许培享  中级技神

发表于 2024-1-13 10:21:46

仰慕仰慕
回复

使用道具 举报

zhouzhuofeng  初级技匠

发表于 2024-1-13 15:05:42

期待更多行空板+大语言模型的项目!!!
回复

使用道具 举报

海川  见习技师

发表于 2024-1-19 19:56:32

期待更多行空板+大语言模型的项目!!!
回复

使用道具 举报

zhangzb61759  初级技师

发表于 2024-1-26 22:34:31

云天老师太厉害了,学习了学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail