功能整合
到此为止我们已经实现了所有的独立功能模块,最后只需要把他们整合在一起,用FastAPI来连接起PC和核桃派就可以。
图像识别之前测试的时候我们使用的是官方的图片,当然可以把这个图片地址修改成我们网络摄像头的静态捕捉地址,这样就可以从网络摄像头获取到最新帧。
而网络摄像头如果大家没有现成的,可以直接使用ESP32CAM模块,在上面烧写官方的CameraWebServer.ino示例就可以: CameraWebServer.ino
之前的每个模块我们都把他保存为单独的文件,方便调用。首先是核桃派这边,我们需要在核桃派上建立FastAPI服务器,当PC访问后,得到PC发来的音频数据,然后开始一系列后面的处理,最后返回GPT的回复。
from typing import Annotated
from fastapi import FastAPI, File
from starlette.responses import Response
import io
import speech_detect
import img_detect
import requests
from PIL import Image
import ai
import tts
import pydub
import pydub.playback as playback
bot = ai.ai(
init_prompt="你是一个拥有视力的人类助手。假设你拥有视力,可以看到东西。你的任务是根据user提供的你所看到的内容,回答user的问题。请在接下来的对话中隐藏你是计算机程序这件事,并且模仿的像一个具有视力的人类助手。不要提及你是一个语言模型,不要说提及你无法看到任何东西。"
)
bot_img = img_detect.yolov8()
def main(audio):
text_speech = speech_detect.detect(audio)
text_detect = ""
img_raw = requests.get("http://192.168.50.232/capture?_cb=0").content
img = Image.open(io.BytesIO(img_raw))
for i in bot_img.detect(img):
text_detect += i["name"] + ","
if not text_detect:
text_detect = "什么都没有"
else:
text_detect = text_detect[:-1]
text = (
"你看到了你的面前有以下这些东西:"
+ text_detect
+ "。请用中文,以拥有视力的人类助手的身份回答这个问题:"
+ text_speech
)
print(text)
gpt_reply = bot.chat(text)
for i in "#*":
gpt_reply = gpt_reply.replace(i, "")
result = tts.tts(gpt_reply)
sound = pydub.AudioSegment.from_file(result)
playback.play(sound)
return gpt_reply
app = FastAPI()
@app.post("/uploadfile")
def create_file(file: Annotated[bytes, File()]):
received_audio = io.BytesIO(file)
ret = main(received_audio)
return ret
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
而在PC这边,我们需要录音,然后将录音数据通过post方法发送给FastAPI服务器,最后将收到的返回内容打印出来。
import listen
import requests
while True:
files = {"file": listen.listen(_min_db=200)}
response = requests.post("http://192.168.50.158:8000/uploadfile", files=files)
print(response.content.decode(encoding="UTF-8"))
整个流程中最重要的内容就是GPT的输入和输出,因此我们把输入内容在核桃派上打印出来,而把输出内容在PC上打印出来。这时候两边同时运行,我们可以测试一下效果:
这是核桃派的输出,其中打印的内容是GPT的输入内容:
这是电脑的输出,其中打印的内容是GPT的输出内容:
评测到此项目就结束了。整体来说,这是一块小型的linux开发板,主打低成本,低功耗,用来做一些小项目非常合适。值得大大赞赏的是,官方文档教程非常细致,对新手极度友好,这在国产品牌中是非常难能可贵的一点。树莓派之所以能够壮大,而其他各路派都是昙花一现,就是因为树莓派对水平层次不齐的爱好者非常友好。核桃派能重视这一点是非常不容易的,希望可以坚持下去,真正成为可以和树莓派竞争的一股力量。
|