一、任务目标
本文将利用大语言模型强大的对话能力,搭建一个PC端问答助手。具体来说,我们将使用API来调用我们想要的大模型,并结合Prompt让大模型根据任务类型生成对应的输出。为了更方便地调用大模型助手,我们将结合python第三方库中的语音识别库进行开发,实现调用麦克风语音输入和音箱语音响应的人机交互。
二、简易版问答助手
得益于目前高度集成的工具库,我们只需要少量的代码便可以实现语音的交互以及大模型的调用,这里直接给出代码:
import pyttsx3
import openai
import random
import speech_recognition as sr
# 使用默认麦克风
recognizer = sr.Recognizer()
microphone = sr.Microphone()
# 初始化tts引擎
engine = pyttsx3.init()
# 设置发音人的语音
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
# 设置发音人的语速
engine.setProperty('rate', 200)
# api
openai.api_key = "your api key"
openai.api_base = "your api base"
# 持续识别语音,直到用户输入退出指令
while True:
with microphone as source:
print("请开始说话...")
audio = recognizer.listen(source)
try:
# 将音频转换为文字
print('语音识别中...')
text = recognizer.recognize_google(audio, language='zh-CN')
print(f"你说了:{text}")
# 要转换的文本
# 这里使用一个简单的触发词
if '嘿小娜' == text:
responses = ['您好,有什么可以帮您的吗?', '在呢!有什么吩咐?', '需要我做些什么?']
response = random.choice(responses)
# 将文本转换为语音
engine.say(response)
# 播放声音
engine.runAndWait()
# 理解用户输入意图
elif '嘿小娜' in text and '再见' not in text:
chat_completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "system",
"content": "你是一个私人的电脑语音助手,名字叫小娜,你将以尊敬的语气回答你主人提出的问题。请注意,输入给你的文本是麦克风语音转化成的汉语文本,没有标点符号,你需要根据语境进行标点符号位置的判断从而理解语义,并回答相应的问题。需要注意的是,你回答的文字应当在50个汉字以内。"},
{"role": "user", "content": text}]
)
response = chat_completion.choices[0].message.content
# 将文本转换为语音
engine.say(response)
# 播放声音
engine.runAndWait()
if '嘿小娜' in text and '再见' in text:
engine.say('下次见!')
# 播放声音
engine.runAndWait()
break
except sr.UnknownValueError:
print("未识别出触发词")
except sr.RequestError as e:
print(f"识别服务出错; {e}")
这里主要有以下几个需要注意的地方:
- 语音识别模块使用了比较基础的python库,识别并转文字之后的文本不包含标点符号,因此需要在prompt中特别说明,当然这也是一个明显可以优化的地方(换个更强大的语音识别库)。
- 同样,语音响应模块也较为简单,助手发出的声音较为正式(播音腔),发音也算流畅,但与真人对话场景还是存在比较大的差异,这里可以使用诸如chattts之类的强大的文本转语音库,实现极其逼真的语音响应(例如输入一段真人语音,chattts可以学习这个人的声纹信息,从而发出几乎一模一样的声音,着实令人震惊!)。
- 大模型输出模块并没有采用流式输出,实际上,流式输出可以让语音响应更加及时,不需要等大语言模型把回复完全生成了之后再进行朗读(当然,不选择流式输出的另一个考量就是流式输出较难对大模型输出的文本进行后处理)。
三、结合电脑交互的个人助手
这里还是以上面的代码为基础,我们给问答助手加入一些控制浏览器的能力,同时通过prompt让大模型生成我们期望的输出格式,便于后续调用对应的控制能力。
1、prompt输出优化
下面的代码主体结构和前述内容一致,但为了更充分的利用大模型的理解能力和交互能力,我们通过修改prompt让大模型输出半格式化的响应,进而对半格式化的响应进行解析,并调用对应交互功能。
import pyttsx3
import openai
import speech_recognition as sr
# 导入自建模块
from automation.open_chrome import open_website
from automation.web_address import web_dic
from automation.open_search import open_search
# 使用默认麦克风
recognizer = sr.Recognizer()
microphone = sr.Microphone()
# 初始化tts引擎
engine = pyttsx3.init()
# 设置发音人的语音
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
engine.setProperty('rate', 200)
openai.api_key = "Your api key"
openai.api_base = "Your api base"
while True:
with microphone as source:
print("请开始说话...")
audio = recognizer.listen(source)
try:
# 将音频转换为文字
print('语音识别中...')
text = recognizer.recognize_google(audio, language='zh-CN')
print(f"你说了:{text}")
if '小娜' not in text:
continue
# 要转换的文本
prompt = (f"你是一个强大的私人电脑管家,名字叫小娜。你可以使用谷歌浏览器打开用户指定的网站(B站、百度、谷歌中的其中一个),也可以使用谷歌浏览器搜索用户指定的内容。"
f"用户给你的指令将以三个井号符合进行分隔,你需要根据用户的需求返回对应的回答格式。如果用户需要你打开指定的网站,你需要返回‘打开网站|网站名称’的答复格式;"
f"如果用户需要你帮助他搜索指定内容,你需要返回‘搜索|待搜索内容’的答复格式;如果用户输入的指令既不是打开指定网站也不是搜索指定内容,则你需要以尊敬的态度回复用户的对话,"
f"返回答复的格式为‘问答|你的回复’,需要注意的是,你回复的文字应当在50个汉字以内。以下是用户的指令:###{text}###,请务必返回指定格式的答复。"
f"另外,如果用户与你说再见,则你只需要需要返回‘退出程序|你的告别语’即可。")
chat_completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "system", "content": prompt}]
)
response = chat_completion.choices[0].message.content
print(response)
response = response.strip('(')
response = response.strip(')')
response = response.strip('(')
response = response.strip(')')
response = response.strip("'")
print(response)
order_type, answer = response.split('|')[0], response.split('|')[1]
if '问答' in order_type:
# 将文本转换为语音
engine.say(answer)
# 播放声音
engine.runAndWait()
elif '打开网站' in order_type:
if answer not in web_dic:
answer = '谷歌'
address = web_dic[answer]
open_website(address)
elif '搜索' in order_type:
browser = 'https://www.google.com'
open_search(browser, answer)
elif '退出程序' in order_type:
# 将文本转换为语音
engine.say(answer)
# 播放声音
engine.runAndWait()
break
except sr.UnknownValueError:
print("未识别出触发词")
except sr.RequestError as e:
print(f"识别服务出错; {e}")
上述代码中的prompt为:
f"你是一个强大的私人电脑管家,名字叫小娜。你可以使用谷歌浏览器打开用户指定的网站(B站、百度、谷歌中的其中一个),也可以使用谷歌浏览器搜索用户指定的内容。"
f"用户给你的指令将以三个井号符合进行分隔,你需要根据用户的需求返回对应的回答格式。如果用户需要你打开指定的网站,你需要返回‘打开网站|网站名称’的答复格式;"
f"如果用户需要你帮助他搜索指定内容,你需要返回‘搜索|待搜索内容’的答复格式;如果用户输入的指令既不是打开指定网站也不是搜索指定内容,则你需要以尊敬的态度回复用户的对话,"
f"返回答复的格式为‘问答|你的回复’,需要注意的是,你回复的文字应当在50个汉字以内。以下是用户的指令:###{text}###,请务必返回指定格式的答复。"
f"另外,如果用户与你说再见,则你只需要需要返回‘退出程序|你的告别语’即可。"
这里面,我们指定了四种响应类型——打开网站、搜索、常规问答以及退出程序。我们通过.split()方法即可对模型的响应进行分隔,如果是“打开网站”或者“搜索”则调用open_website或者open_search功能,而对于“退出程序”或者“常规问答”则无需任何操作,直接输出大模型的回答。此外,对于“打开网站”和“搜索”,我们让大模型总结和推断需要打开哪个网站,或者需要搜索什么问题,open_website和open_search直接输入大模型的响应结果。
2、控制浏览器
这里我们实现了简单的控制代码,读者可自行优化。
(1)打开网站(automation/open_chrome.py)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
def open_website(website_address):
# 配置ChromeDriver的路径
chrome_driver_path = ChromeDriverManager().install()
# 创建Chrome选项对象
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
# 创建Chrome浏览器的实例
driver = webdriver.Chrome(service=Service(chrome_driver_path), options=chrome_options)
# 将浏览器窗口最大化
driver.maximize_window()
# 打开指定的网站
driver.get(website_address)
(2)搜索(automation/open_search.py)
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
def open_search(browser, query):
# 配置ChromeDriver的路径
chrome_driver_path = ChromeDriverManager().install()
# 创建Chrome选项对象
chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
# 创建Chrome浏览器的实例
driver = webdriver.Chrome(service=Service(chrome_driver_path), options=chrome_options)
# 将浏览器窗口最大化
driver.maximize_window()
# 打开指定的网站
driver.get(browser)
# 等待页面加载
time.sleep(2)
# 找到搜索框元素
search_box = driver.find_element(By.NAME, "q")
# 在搜索框中输入搜索内容
search_box.send_keys(query)
# 模拟按下回车键进行搜索
search_box.send_keys(Keys.RETURN)
# 等待搜索结果加载
time.sleep(2)
(3)网站地址(automation/web_address.py)
web_dic = {
'B站':'https://www.bilibili.com/',
'百度':'https://www.baidu.com',
'谷歌':'https://www.google.com',
'微博':'https://www.weibo.com',
'github':'https://github.com/'
}
四、总结
本文实现了PC端智能问答助手的构建,基于大模型的交互能力和一些简单的控制代码,即可打造出一个专属于你自己的电脑AI管家!
标签:实战,engine,python,chrome,助手,语音,import,open,response From: https://blog.csdn.net/ChaneMo/article/details/143164383