ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">文章翻译自toward_data_scienceingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">现在,大型多模态模型 (LMM) 不仅可以处理文本,还可以处理不同类型的数据(图片、视频)。“一图胜千言”,这个功能在与现实世界的交互过程中至关重要。在这个“周末AI项目”中,我将使用免费的LLaVA[1](大型语言和视觉助手)模型、相机和语音合成器制作一个人工智能助手,它可以帮助有视力障碍的人“看到”世界。所有组件都将完全离线运行,无需任何云成本。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">
ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 20px;font-weight: bold;margin-top: 40px;margin-right: auto;margin-bottom: 40px;width: fit-content;text-align: left;color: rgb(63, 63, 63);">成分ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">在这个项目中,我将使用几个组件:ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;vertical-align: baseline;text-wrap: wrap;color: rgb(63, 63, 63);margin-bottom: 8px;" class="list-paddingleft-1">LLaVA模型:LLaVA借助特殊的Embedding矩阵将大型语言模型和视觉编码器结合在一起,这使得模型不仅可以理解文本,还可以理解图像提示。我将使用LlamaCpp库来运行模型,虽然它被叫做“Llama”cpp,但它也可以运行 LLaVA 模型
Streamlit库:允许我们制作交互式 UI。使用相机,我们可以拍摄图像并向 LMM 询问有关它的不同问题(例如,我们可以要求模型描述图像)。
TTS (文本转语音)模型会将 LMM 的答案转换为语音,以便视力障碍的人可以收听。对于文本转换,我将使用Facebook 制作的MMS-TTS (大规模多语言语音 TTS)模型。[2]
ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">所有列出的组件都是免费使用的,不需要任何云 API,并且可以完全离线工作。从硬件角度来看,该模型可以在任何 Windows 或 Linux 笔记本电脑或平板电脑上运行(建议使用 8 GB GPU,但不是必需的),并且 UI 可以在任何浏览器中运行,甚至可以在智能手机上运行。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">现在,让我们开始吧。ingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 20px;font-weight: bold;margin-top: 40px;margin-right: auto;margin-bottom: 40px;width: fit-content;text-align: left;color: rgb(63, 63, 63);">LLaVAingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-top: 10px;margin-bottom: 10px;letter-spacing: 0.1em;white-space: pre-line;color: rgb(63, 63, 63);font-size: 15px;">LLaVA是一种开源大型多模态模型,结合了视觉编码器和用于视觉和语言理解的LLM。如前所述,我将使用LlamaCpp[3]来加载模型。这个库非常适合在不同的硬件上使用语言模型:它支持量化,并且可以在 CPU、CUDA 和 Mac Silicon 上的任何地方运行。第一步,我们从 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)
对于免费的开源模型来说,结果还不错!这部分生效了,我们可以更进一步。
文本转语音 (TTS)
从模型收到文本后,我们希望将其作为音频播放。为了从文本生成音频,我将使用 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
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 可能更便宜。
不管怎样,这个领域的进展很快,或许很快就会有更小的模型推出,我希望人工智能解决方案能让人们的生活变得更好。