赞
踩
1.本地歌曲、本地视频。
2.PotPlayer播放器,打开网络加速器后可在官网下载。https://potplayer.daum.net/
3.openai的api_key,可在官方网站或者某宝买一个key,并把key放入电脑环境里面。
关于为何需要functions函数,通过询问GPT给出的回答是:
import potplayer import difflib import json import glob import openai import subprocess openai.api_key = os.getenv("OPENAI_API_KEY") # 调用本地音乐播放器实现函数 def playMusic(kw): #定义一个曲名关键字函数,需要传入的参数是曲名 potplayer_path = '..\\PotPlayerMini64.exe' #potplayer播放器的位置 fs = glob.glob('..\\*.mp3') #指定音乐文件夹里所有MP3文件列出来 matches = difflib.get_close_matches(kw, fs, cutoff=0.01) #根据字符串匹配找出与曲名参数最相近的文件名(即不用写出准确的文件名) best = matches[0] subprocess.call([potplayer_path, best]) #播放地址文件 # 调用本地视频播放器实现函数 def playMovie(kw): potplayer_path = '..\\PotPlayerMini64.exe' fs = glob.glob('..\\*.mp4') matches = difflib.get_close_matches(kw, fs, cutoff=0.01) best = matches[0] subprocess.call([potplayer_path, best]) # 这个函数接收一个包含对话消息的列表作为参数,并按照角色和内容的格式打印每条消息 def pretty_print_conversation(messages): for message in messages: role = message["role"] content = message["content"] print(f"{role}: {content}")
# 描述函数 # 定义两个函数并封装,一个是播放音乐的函数,一个是播放视频的函数 functions = [{"name": "playMusic", "description": "根据用户提供的曲名关键字播放音乐", #描述 #针对函数的参数进行的定义。它指定了参数的类型、属性和必需性。 "parameters": {"type": "object", # 参数类型为对象(object) "properties": {"kw": {"type": "string","description": "曲名关键字"}},#参数包含一个属性,该属性的键是kw,值是一个字符串类型(string)。kw属性描述是曲名关键字。 "required": ["kw"], #kw属性是必需的,即在调用函数时必须提供该参数。 } }, {"name": "playMovie", "description": "根据用户提供的视频关键字播放视频", "parameters": {"type": "object", "properties": {"kw": {"type": "string","description": "视频关键字"}}, "required": ["kw"], } } ]
# 调用GPT API来进行对话生成,并根据回复执行相应的函数 messages = [] #创建一个空的消息列表messages,需要向其中添加系统消息和用户消息 messages.append({"role": "system","content" : "Don't make assumptions about"}) #作为系统,不要臆断?? messages.append({"role": "user","content":"我想听北京东路的日子"}) #作为用户,输入需求 chat_response = openai.ChatCompletion.create(model='gpt-3.5-turbo',messages=messages,functions=functions) #使用openai.ChatCompletion.create方法调用GPT API,利用gpt3.5作为模型、消息列表和函数列表作为参数 assistant_message = chat_response["choices"][0]["message"] #从API响应中提取回复消息 print(assistant_message) messages.append(assistant_message) #将回复消息添加到消息列表中 #如果回复中包含函数调用信息,则提取函数名称和参数,根据函数名称调用相应的函数,传递解析后的参数 if assistant_message.get( "function_call"): fn = assistant_message["function_call"]["name"] arguments = json.loads(assistant_message["function_call"]["arguments"]) if fn == "playMusic":playMusic(**arguments) elif fn == "playMovie":playMovie(**arguments) pretty_print_conversation(messages) #打印整个对话的内容
通过以上三部分可以基本实现本地歌曲与视频的自动播放。
也可以实现与GPT的对话,当识别到不需要调用自定义函数时,GPT会直接回答相应的问题。例如:
针对以上代码可改进的地方有:
1.多轮对话,实现连续不断的命令交互。
2.语音控制,识别人声需求回答问题。
3.制作网页,将这一实现放入自己的网页中,高级的可以自己开发网站。
本文章的撰写参考哔哩哔哩视频:
免费教程系列(一)手把手教你用GPT点歌放电影 实例讲解新特性Function Calling
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。