介绍
智能助手允许你通过语音交互快速从网络收集信息。
在制作智能助手时,我想制作一个带有图形用户界面的网络应用程序,我可以使用我的语音与智能助手进行交互。
在这篇文章中,我详细介绍了我如何制作这个应用程序,我使用了什么工具以及我应用的方法。用于这个小项目的许多工具可以用于其他许多项目。
方法
为了制作智能助手,我使用了OpenAI的GPT-3。GPT-3是OpenAI训练的大规模语言模型。它是经过预训练的,能够很好地推广到各种各样的用例。
我的目标是制作一个应用程序,通过它我可以使用我的语音与GPT-3交互。
应用程序的总体流程图如下所示:
为了将我的声音传递给OpenAI,我首先需要将我的语言传递给文本。因此,首先我使用Streamlit应用程序录制我的声音。然后我对录音进行编码,并将其传递给AssemblyAI,以便转录。我收到转录并将其传递给OpenAI。然后,我可以获取响应并在应用程序上显示。
为了通过应用程序与这些服务进行通信,我使用了它们的API。
什么是API?
应用程序接口(API)是软件程序相互通信的方式。为了让他们进行交互,API提供了一组协议和工具来帮助交互成功。
这两个服务都有Python中的API,所以我可以很容易地将这两种服务集成到应用程序中。
API允许我访问由公司开发和托管的服务、工具和AI模型。我可以向他们发送一个请求,说明我希望他们的模型为我处理什么,然后我会得到他们预训练模型输出的响应。
如何使用API?
为了实时转录音频,我使用了AssemblyAI Websocket API。与HTTPS连接不同,Websocket连接允许双向发送和接收来自API服务器的请求。这样我可以实时转录数据。
为了建立WebSocket连接,我使用了Python中的异步库“asyncio”和“websockets”库。下面是代码的外观:
async with websockets.connect(
self.URL,
extra_headers=(("Authorization", assemblyAI_key),),
ping_interval=5,
ping_timeout=20
) as _ws:
r = await asyncio.sleep(0.1)
session_begins = await _ws.recv()
在上面的代码中,我连接到WebSocket URL,并尝试接收连接确认(见上文session_begins)。
连接后,我可以定义发送和接收函数,这将允许我以我想要的方式与API通信。
async def send():
while st.session_state["init"] == True:
data = self.stream.read(self.FRAMES_PER_BUFFER, exception_on_overflow = False)
data = base64.b64encode(data).decode("utf-8")
json_data = json.dumps({"audio_data":str(data)})
r = await _ws.send(json_data)
return True
async def receive():
while st.session_state["init"] == True:
result_str = await _ws.recv()
if (json.loads(result_str)["message_type"] == "FinalTranscript") and (json.loads(result_str)['text'] != ""):
promt = json.loads(result_str)["text"]
response = openai.Completion.create(
engine = "text-davinci-002",
prompt = promt,
n=5,
temperature = 0
)
response_test = response.choices[0].text
send_result, receive_result = await asyncio.gather(send(), receive())
在send函数中,我首先收集音频,将其编码为utf-8,然后使用WebSocket发送。使用音频文件或API时,utf-8编码非常标准。
在接收函数中,我首先从音频文件中接收转录的文本,然后将该文本发送到OpenAI并接收来自GPT-3的响应。
使用Streamlit构建应用程序
Streamlit可用于快速构建web应用程序。该应用程序的目标是提供一个图形用户界面(GUI),以便用户无需使用任何代码即可与智能助手无缝交互。
现在我将详细介绍我用于制作应用程序的代码结构。我总是将Streamlit应用程序打包在一个类中。这就是整个代码结构的样子:
class app:
def __init__(self):
...
self.pipeline()
def pipeline(self):
self.initialize_tool()
self.buttons()
self.load_past()
asyncio.run(self.send_receive())
def initialize_tool(self):
st.set_page_config(page_title="Interactive AI", page_icon="🤖")
st.markdown('<h1 style="color: white">SMART ASSISTANT TOOL</h1>', unsafe_allow_html=True)
...
def clear_chat(self):
...
def buttons(self):
...
async def send_receive(self):
...
async def send():
...
async def receive():
...
if __name__ == '__main__':
app()
该应用程序包含两个按钮。第一个是记录按钮,第二个是清晰的聊天按钮。
录制按钮开始录制你的语音,然后转录并将文本发送到OpenAI。然后,应用程序会将响应显示为聊天对话。
该应用程序保存对话记录,聊天记录存储在.txt文件中。当按下清除聊天按钮时,.txt文件将被清除。
我无法在这里展示的应用程序的最后一个附加功能是文本到语音。当机器人做出反应时,它会读出句子。为此,我使用了pyttsx3库。
与工具交互
上面是应用程序的屏幕截图。顶部是应用程序的两个按钮。要与智能助手交互,你可以按记录并说出你的消息。消息的转录显示在左侧,GPT-3的响应显示在右侧。
这位聪明的助手显然名叫莎拉,今年26岁。该应用程序似乎运行良好,它可以检测我的声音,并以全面的方式显示它。智能助手可以处理更复杂的查询:
智能助手在处理基本缩略语时没有问题。机器人还了解现代公司的背景:
结论
在本文中,我介绍了我如何制作智能助手应用程序。该应用程序能够记录你的声音,转录它,将转录传递到OpenAI的GPT-3,并读出你的响应。
我详细介绍了应用程序的流程,以及应用程序是如何在streamlit上编程的。最后,我介绍了我与智能助手的一些交互示例。总的来说,我认为这个应用程序很有用,而且运行良好。
感谢阅读!