微信扫码
与创始人交个朋友
我要投稿
文章翻译自toward_data_science
现在,大型多模态模型 (LMM) 不仅可以处理文本,还可以处理不同类型的数据(图片、视频)。“一图胜千言”,这个功能在与现实世界的交互过程中至关重要。在这个“周末AI项目”中,我将使用免费的LLaVA[1](大型语言和视觉助手)模型、相机和语音合成器制作一个人工智能助手,它可以帮助有视力障碍的人“看到”世界。所有组件都将完全离线运行,无需任何云成本。
在这个项目中,我将使用几个组件:
LLaVA模型:LLaVA借助特殊的Embedding矩阵将大型语言模型和视觉编码器结合在一起,这使得模型不仅可以理解文本,还可以理解图像提示。我将使用LlamaCpp库来运行模型,虽然它被叫做“Llama”cpp,但它也可以运行 LLaVA 模型
Streamlit库:允许我们制作交互式 UI。使用相机,我们可以拍摄图像并向 LMM 询问有关它的不同问题(例如,我们可以要求模型描述图像)。
TTS (文本转语音)模型会将 LMM 的答案转换为语音,以便视力障碍的人可以收听。对于文本转换,我将使用Facebook 制作的MMS-TTS (大规模多语言语音 TTS)模型。[2]
所有列出的组件都是免费使用的,不需要任何云 API,并且可以完全离线工作。从硬件角度来看,该模型可以在任何 Windows 或 Linux 笔记本电脑或平板电脑上运行(建议使用 8 GB GPU,但不是必需的),并且 UI 可以在任何浏览器中运行,甚至可以在智能手机上运行。
现在,让我们开始吧。
LLaVA是一种开源大型多模态模型,结合了视觉编码器和用于视觉和语言理解的LLM。如前所述,我将使用LlamaCpp[3]来加载模型。这个库非常适合在不同的硬件上使用语言模型:它支持量化,并且可以在 CPU、CUDA 和 Mac Silicon 上的任何地方运行。
第一步,我们从 HuggingFace 下载模型:
huggingface-cli download jartine/llava-v1.-B-GGUF llava-v1.-b-Q4_K.gguf ---dir . ---dir--symlinks False huggingface-cli download jartine/llava-v1.-B-GGUF llava-v1.-b-mmproj-f16.gguf ---dir . ---dir--symlinks False huggingface-cli download PsiPi/liuhaotian_llava-v1.-b-GGUF llava-v1.-b-Q5_K_M.gguf ---dir . ---dir--symlinks False huggingface-cli download PsiPi/liuhaotian_llava-v1.-b-GGUF mmproj-model-f16.gguf ---dir . ---dir--symlinks False
这里,我们可以根据自己的硬件能力选择7B或13B型号。截至撰写本文时,HuggingFace 上约有 350 个“LLaVA”模型,因此选择范围很广,欢迎读者自行测试其他模型。
下载完成后,加载模型及其投影矩阵:
llama_cpp Llama llama_cpp.llama_chat_format Llava15ChatHandler 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 格式:
PIL Image io BytesIO () -> : 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 = r out_stream: data = r[][][] data: (data[], end=) sys.stdout.flush() output += data[] output
这里我也是使用流式传输,这样更方便调试;我们可以在控制台上看到输出。作为测试,让我们要求模型描述该图像:
为此,我们只需要两行代码:
img = Image.() model_inference(model, , img)
对于免费的开源模型来说,结果还不错!这部分生效了,我们可以更进一步。
从模型收到文本后,我们希望将其作为音频播放。为了从文本生成音频,我将使用 Facebook 的 MMS-TTS(大规模多语言语音)项目。我们只需要几行代码:
from transformers import VitsModel, VitsTokenizer model = VitsModel.from_pretrained() tokenizer = VitsTokenizer.from_pretrained() text = inputs = tokenizer(text, return_tensors=) with torch.no_grad(): data = model(**inputs).waveform.cpu().numpy()
该代码生成采样率为 16,000 KHz 的原始音频数据。要在网络浏览器中播放它,我们需要将此数据转换为 WAV 格式:
from ioimport BytesIO 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 应用程序。首先,我们创建两个方法来加载和缓存模型:
streamlit st 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.() with st.(): model = () tts = () img_file_buffer = st.() if img_file_buffer: cam_image = Image.(img_file_buffer) if st.(): (model, tts, , cam_image) if st.(): (model, tts, , cam_image)
这里,我在用户界面添加了两个按钮 - 第一个按钮将描述图像,第二个按钮将读取图像上的文本(为了更好地为视觉障碍者服务)。LLaVA 模型可以做更多的事情;例如,我们可以尝试询问我们可以用照片中的杂货做什么样的饭菜。欢迎读者自行做更多实验。
最终结果是,我们得到了一个可以在桌面甚至智能手机上运行的 Web 应用程序:
你可以在本地网络上的 Google Chrome 中进行测试,不过测试时,必须将服务器地址添加到“视为安全源”列表中;否则,如果没有 HTTPS,网络摄像头将无法工作。
在本文中,我们制作了一个可以帮助视力障碍人士的系统Demo。借助 LLaVA 模型、相机和语音合成,我们可以分析现实世界的图像,并就其背景提出不同的问题。模型和 Web Server可以在 PC 或笔记本电脑上离线运行。
它还可以被托管在云端,这种情况下,智能手机可能是一种更便携的解决方案。在这种情况下,具有语音识别和“按住说话”按钮的定制设备可能会更好:全盲人可以使用语音与模型进行交互,并通过语音合成器获得答案。
当然,运行在云端需要额外的费用;但是,LLaVA的计算成本很高;它至少需要 8GB GPU 才能流畅运行。在这种情况下,与能够在本地运行相同模型的高端硬件相比,低成本设备和云 API 可能更便宜。
不管怎样,这个领域的进展很快,或许很快就会有更小的模型推出,我希望人工智能解决方案能让人们的生活变得更好。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-05-28
2024-04-12
2024-04-25
2024-05-14
2024-08-13
2024-07-18
2024-05-06