AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Llava 模型、相机和语音合成器制作一个人工智能助手
发布日期:2024-04-16 06:50:08 浏览次数: 2159 来源:苏坡爱豆


文章翻译自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

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)

对于免费的开源模型来说,结果还不错!这部分生效了,我们可以更进一步。

文本转语音 (TTS)

从模型收到文本后,我们希望将其作为音频播放。为了从文本生成音频,我将使用 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

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+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询