创建交互式阅读助手
在本文中,将探讨如何利用目标检测和光学字符识别(OCR)模型,结合GPT-4技术,开发出一款能够帮助用户识别图像中特定单词并朗读出来的交互式阅读助手。这种助手能够帮助用户理解单词的含义,同时辅助他们正确发音。
首先,注册并创建一个Roboflow账户。在工作空间中创建一个项目,并自定义项目名称和标注组。确保创建的是一个目标检测项目。接下来,添加图像。使用的图像可以通过下载。确保下载数据集并保存在某个位置。将下载的图像添加到数据集中,然后继续。接着,添加希望模型检测的类别。对于用例,只需要一个类别。现在已经拥有了标注和图像,可以生成一个标记图像的数据集版本。每个版本都是唯一的,并且与训练的模型相关联,因此可以迭代增强和数据实验。
工作流是一个基于Web的交互式计算机视觉应用程序构建器。可以使用工作流来定义可以在云端或自己的硬件上运行的多阶段计算机视觉应用程序。使用工作流,能够:检测屏幕上的手指、使用目标字符识别预测单词。工作流还可以调用外部视觉能力API,例如GPT-4,这是将在应用程序中利用的功能。要开始使用,请转到Roboflow应用程序中的工作流,然后点击“创建工作流”。接下来,点击“自定义工作流”并点击“创建”。接下来,导航到添加块并搜索“目标检测”:添加目标检测块。现在需要选择想要使用的具体目标检测模型。要做到这一点,请点击模型按钮。选择需要的具体目标检测模型。很好!已经完成了第一个块。接下来,让添加一个动态裁剪块来裁剪图像。最后,使用裁剪,需要使用目标字符识别来获取屏幕上显示的字母。添加LMM块。
在开始编程之前,需要先安装一些库。首先,安装所需的库。使用pip安装opencv-python、openai、pydub、inference和supervision。接下来导入必要的库。
在这一步中,将创建一个音频功能,根据输入的单词播放任何单词。首先,粘贴OpenAI API密钥。在这里使用OpenAI来访问文本到语音功能。接下来,添加以下功能来运行音频。
client = OpenAI(api_key="OPENAI_API_KEY")
def run_audio(message):
speech_file_path = Path(__file__).parent / "speech.mp3"
response = client.audio.speech.create(
model="tts-1",
voice="alloy",
input=f"{message}"
)
response.stream_to_file(speech_file_path)
speech_file_path = speech_file_path
audio = AudioSegment.from_file(speech_file_path)
play(audio)
这个功能首先定义了语音文件的路径,然后将音频添加到文件中,最后通过pydub播放文件。
现在已经完成了音频功能,需要检测何时有手指在视线中。为此,需要一个目标检测功能,它在每一帧上运行。首先定义注释器。这些将帮助绘制检测结果。
COLOR_ANNOTATOR = sv.ColorAnnotator()
LABEL_ANNOTATOR = sv.LabelAnnotator()
接下来,添加目标检测功能。以下是整体代码片段。
def on_prediction(res: dict, frame:VideoFrame) -> None:
image = frame.image
annotated_frame = image.copy()
detections = res["predictions"]
if detections is not None:
detections = sv.Detections.from_inference(detections)
annotated_frame = COLOR_ANNOTATOR.annotate(
scene = annotated_frame,
detections = detections
)
annotated_frame = LABEL_ANNOTATOR.annotate(
scene = annotated_frame,
detections = detections,
)
gpt = res["gpt"]
if gpt:
word = gpt[0]["raw_output"]
print(word)
# 打印提取的单词
run_audio(word)
该功能首先获取视频的帧(位于frame)以及相应的检测结果(位于res),这些是从之前创建的工作流中获得的。使用模型在工作流上的预测,能够看到帧中是否有手指。如果有,添加逻辑来绘制边界框并通过调用函数播放音频。
现在可以使用之前获得的工作流代码。使用以下代码,用个人工作流中的信息替换工作空间名称、ID和API密钥。
pipeline = InferencePipeline.init_with_workflow(
video_reference=0, # 使用个人网络摄像头
workspace_name="WORKSPACE_NAME",
workflow_id="ID",
max_fps = 60,
api_key="KEY",
on_prediction=on_prediction,
)
pipeline.start()
pipeline.join()
要运行实时模型,请添加最后两行代码。