LLaVA模型:LLaVA借助特殊的Embedding矩阵将大型语言模型和视觉编码器结合在一起,这使得模型不仅可以理解文本,还可以理解图像提示。我将使用LlamaCpp库来运行模型,虽然它被叫做“Llama”cpp,但它也可以运行 LLaVA 模型
Streamlit库:允许我们制作交互式 UI。使用相机,我们可以拍摄图像并向 LMM 询问有关它的不同问题(例如,我们可以要求模型描述图像)。
TTS (文本转语音)模型会将 LMM 的答案转换为语音,以便视力障碍的人可以收听。对于文本转换,我将使用Facebook 制作的MMS-TTS (大规模多语言语音 TTS)模型。[2]
第一步,我们从 HuggingFace 下载模型:
huggingface-clidownloadjartine/llava-v1.-B-GGUFllava-v1.-b-Q4_K.gguf---dir.---dir--symlinksFalse huggingface-clidownloadjartine/llava-v1.-B-GGUFllava-v1.-b-mmproj-f16.gguf---dir.---dir--symlinksFalse huggingface-clidownloadPsiPi/liuhaotian_llava-v1.-b-GGUFllava-v1.-b-Q5_K_M.gguf---dir.---dir--symlinksFalse huggingface-clidownloadPsiPi/liuhaotian_llava-v1.-b-GGUFmmproj-model-f16.gguf---dir.---dir--symlinksFalse
这里,我们可以根据自己的硬件能力选择7B或13B型号。截至撰写本文时,HuggingFace 上约有 350 个“LLaVA”模型,因此选择范围很广,欢迎读者自行测试其他模型。
下载完成后,加载模型及其投影矩阵:
llama_cppLlama llama_cpp.llama_chat_formatLlava15ChatHandler model_file= model_mmproj_file= chat_handler=Llava15ChatHandler(clip_model_path=model_mmproj_file) model=Llama( model_path=model_file, chat_handler=chat_handler, n_ctx=, n_gpu_layers=-, verbose=, logits_all=, )
我还需要创建一个程序来将图像转换为 Base64 格式:
PILImage ioBytesIO ()->: buffered=BytesIO() img.save(buffered,=) base64.b64encode(buffered.getvalue()).decode()
现在我们准备向模型询问有关图像的任何问题:
()->:
image_b64=image_b64encode(image)
out_stream=model.create_chat_completion(
messages=[
{
:,
:
},
{
:,
:[
{:,
:{:}},
{:,
:request}
]
}
],
stream=,
temperature=
)
output=
rout_stream:
data=r[][][]
data:
(data[],end=)
sys.stdout.flush()
output+=data[]
output这里我也是使用流式传输,这样更方便调试;我们可以在控制台上看到输出。作为测试,让我们要求模型描述该图像:
为此,我们只需要两行代码:
img=Image.() model_inference(model,,img)
对于免费的开源模型来说,结果还不错!这部分生效了,我们可以更进一步。
从模型收到文本后,我们希望将其作为音频播放。为了从文本生成音频,我将使用 Facebook 的 MMS-TTS(大规模多语言语音)项目。我们只需要几行代码:
fromtransformersimportVitsModel,VitsTokenizer model=VitsModel.from_pretrained() tokenizer=VitsTokenizer.from_pretrained() text= inputs=tokenizer(text,return_tensors=) withtorch.no_grad(): data=model(**inputs).waveform.cpu().numpy()
该代码生成采样率为 16,000 KHz 的原始音频数据。要在网络浏览器中播放它,我们需要将此数据转换为 WAV 格式:
fromioimportBytesIO scipy buffer=BytesIO() data_int16=(data*np.iinfo(np.).max).astype(np.) scipy.io.wavfile.write(buffer,rate=sample_rate,data=data_int16.squeeze()) data_wav=buffer.getbuffer().tobytes()
这个语音合成模型大小为150MB,非常适合我们的任务。我还尝试了Suno[4]的Bark TTS 模型[5]。它提供了更好的质量(24,000 与 16,000 KHz 采样率),但模型文件大了 10 倍(1.5 GB 而不是 150 MB),并且音频生成时间长了几倍。
Streamlit[6]是一个 Python 库,可让我们轻松地创建交互式 Web 应用程序。首先,我们创建两个方法来加载和缓存模型:
streamlitst model_mmproj_file= model_file= (): Llava15ChatHandler(clip_model_path=model_mmproj_file) (): chat_handler=load_chat_handler() Llama( model_path=model_file, chat_handler=chat_handler, n_ctx=, n_gpu_layers=-, verbose=, logits_all=, )
cache_resources是一个装饰器,它的作用是避免每次用户在浏览器中按下“刷新”按钮时重新加载模型。Streamlit已经有了摄像头支持[7],所以我们不需要为摄像头调用编写很多代码。我只需要创建辅助方法来从图像生成文本和音频:
()->: st.spinner(): response=model_inference(model,prompt,image) st_generate_audio(tts,response) (): st.spinner(): wav_data=tts.generate_audio(text) st_autoplay(wav_data) (): b64=base64.b64encode(wav).decode() md= st.markdown(md,unsafe_allow_html=)
在这里,我使用了自动播放的 HTML“音频”控件,因此声音将在生成完成后自动开始。
之后,整个程序逻辑可以用不到20行代码写出来:
def(): st.() withst.(): model=() tts=() img_file_buffer=st.() ifimg_file_buffer: cam_image=Image.(img_file_buffer) ifst.(): (model,tts,,cam_image) ifst.(): (model,tts,,cam_image)
这里,我在用户界面添加了两个按钮 - 第一个按钮将描述图像,第二个按钮将读取图像上的文本(为了更好地为视觉障碍者服务)。LLaVA 模型可以做更多的事情;例如,我们可以尝试询问我们可以用照片中的杂货做什么样的饭菜。欢迎读者自行做更多实验。
最终结果是,我们得到了一个可以在桌面甚至智能手机上运行的 Web 应用程序:
你可以在本地网络上的 Google Chrome 中进行测试,不过测试时,必须将服务器地址添加到“视为安全源”列表中;否则,如果没有 HTTPS,网络摄像头将无法工作。
在本文中,我们制作了一个可以帮助视力障碍人士的系统Demo。借助 LLaVA 模型、相机和语音合成,我们可以分析现实世界的图像,并就其背景提出不同的问题。模型和 Web Server可以在 PC 或笔记本电脑上离线运行。
它还可以被托管在云端,这种情况下,智能手机可能是一种更便携的解决方案。在这种情况下,具有语音识别和“按住说话”按钮的定制设备可能会更好:全盲人可以使用语音与模型进行交互,并通过语音合成器获得答案。
当然,运行在云端需要额外的费用;但是,LLaVA的计算成本很高;它至少需要 8GB GPU 才能流畅运行。在这种情况下,与能够在本地运行相同模型的高端硬件相比,低成本设备和云 API 可能更便宜。
不管怎样,这个领域的进展很快,或许很快就会有更小的模型推出,我希望人工智能解决方案能让人们的生活变得更好。
| 欢迎光临 链载Ai (https://www.lianzai.com/) | Powered by Discuz! X3.5 |