前提准备
1.本地歌曲、本地视频。
2.PotPlayer播放器,打开网络加速器后可在官网下载。https://potplayer.daum.net/
3.openai的api_key,可在官方网站或者某宝买一个key,并把key放入电脑环境里面。
重难点
- 首先需要实现播放音乐和视频,这个函数定义是一个难点;
- 然后调用GPT API接口需要models,messages, functions这三个参数,functions函数是第二个难点;
- 如何调用API接口是第三难点。
关于为何需要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
# 调用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