VITA-1.5接近GPT4o水平的多模态模型:理解和跑通这套多模态实时交互系统

VITA-1.5:如何一步步跑通并理解这套多模态实时交互系统

大家好,继续复现GPT4高级语音模式系列。今天我想和各位分享一个非常有意思的开源项目------VITA-1.5。在这篇文章中,我会深入讲解我在跑通 VITA-1.5 系统过程中所经历的细节和思考。尤其是对于之前从未接触过多模态语音训练流程的朋友,我会尽量将一些知识点(例如 CTC、NAR、TiCodec 等)补充完整。相信能够真正帮助你理解、搭建并改造这一前沿系统。

我会先简要介绍 VITA-1.5 的背景和特点,再一步步演示如何安装依赖、准备数据、开始训练乃至推理,最后也会谈谈一些在实际使用过程中的Tips和常见问题。希望能为你搭建 VITA-1.5 提供一个详尽的指导。


什么是 VITA-1.5

从 VITA-1.0 到 VITA-1.5

VITA-1.5 是一个多模态大型语言模型 (Multimodal Large Language Model, MLLM),其特点在于可以同时处理视觉(图像、视频)、文本以及语音信息。在最初的版本 VITA-1.0 中,团队主要解决了"视觉+语音+文本"的多模态交互问题,但是语音输出依旧依赖外部的 TTS(Text-To-Speech)模块,导致推理过程中会有额外的延迟和一些可能的兼容性问题。

Source Code: https://github.com/VITA-MLLM/VITA

在 VITA-1.5 中,官方引入了一些重大改进:

  1. 大幅减少互动延迟
    • 通过内置端到端的语音解码器,免去外部 TTS 的依赖,使得语音到语音的交互时间由 4 秒降到 1.5 秒左右,几乎接近实时。
  2. 多模态性能提升
    • 在图像、视频理解等多模态任务基准上(比如 MME, MMBench, MathVista 等),性能相比 VITA-1.0 有明显提升。
  3. 改进的语音处理能力
    • 英文 ASR(语音识别)任务中,WER(Word Error Rate)从 18.4% 降到了 7.5%,同时中文 ASR 效果也大幅提升。
    • 使用端到端 TTS 机制,完全打通了从视觉/文本/语音到语音输出的闭环。
  4. 渐进式多阶段训练策略
    • 能够在训练过程中最小化不同模态间的"冲突",保留视觉-语言能力的同时,将语音能力逐步添加进去,最后又不会损害整体性能。

得益于这些改进,VITA-1.5 给大家带来了一种"轻巧却强大"的多模态实时语音交互方式,让开源社区看到了在 GPT-4o 等大厂多模态模型之外的新选择。


项目安装

根据官方 GitHub 仓库的介绍,这个项目的大致结构和流程可以简单总结如下:

  • 安装依赖:Python 3.10 + 相关 Python 包(requirements.txt) + FlashAttention 加速。
  • 数据准备
    • 包含图像(或视频)与文本对话、语音音频文件等多模态信息的 json 数据。
    • 需要分别在 config 文件中指定图像路径、音频路径、以及将它们对齐到多模态数据结构里。
  • 训练
    • 支持"持续式训练"(Continual Training),在已有的 checkpoint 上进一步微调。
    • 核心是三阶段训练:视觉-语言对齐 -> 语音输入对齐 -> 语音输出对齐
  • 推理
    • 以文本、图像、或音频作输入,输出文本或端到端语音。
    • 快速示例:python video_audio_demo.py --model_path ... --image_path ... --audio_path ...
  • 评测
    • 提供了在 MME, MMBench, Video-MME 等基准上评测的脚本示例。

除此之外,还有一个 Web Demo,可以做一个更高级的实时交互演示。我会在后面细说如何配置和启动。


技术预备知识

我知道很多朋友可能对大模型的基本架构已经比较熟悉,但对于项目中提到的一些细节却不太了解。这里我会花一定篇幅来做补充性讲解,从而让大家能够充分读懂"多阶段训练策略"是怎么回事,以及为何要有 codec 模块,NAR / AR 解码器又分别扮演什么角色。

1. ASR 的 CTC 机制

在"阶段2:语音输入对齐"部分,官方说到会用 CTC(Connectionist Temporal Classification)来训练语音编码器,以完成语音到文本的对齐。CTC 是一种经典的语音识别训练准则,针对的是"输入长度和输出长度不一致"的序列学习问题。

  • 为什么叫 CTC?
    • CTC 尝试解决在语音序列中寻找一条最优的对齐路径,使得声学特征与输出文本的对齐概率最大化。
  • 简单原理
    • 你可以把它理解为一种"所有可能对齐方式的联合",让网络自动学习到"在时间步 t 上对应的音素/文字是什么"。
  • 和常见的 seq2seq 有什么区别?
    • 传统 seq2seq 的注意力机制也可以对齐,但 CTC 不需要显式对齐标签,而是通过在网络输出层插入一个额外的空白标签(blank),并统计所有可能的路径。
    • CTC 往往用于端到端 ASR,需要对模型的输出做"路径压缩"来获取最终的文字序列。

在 VITA-1.5 中,"阶段2.1"的第一步会训练一个语音编码器,使之能够输出对齐的文本 logits(虽然最终并不一定需要直接使用 CTC 的输出,但这个过程帮助语音编码器学会"听出文字")。

2. 非自回归(NAR)与自回归(AR)解码器

VITA-1.5 在语音解码端有两种模块:NAR Speech Decoder 和 AR Speech Decoder。它们分别是非自回归自回归的语音解码器,用来把文本表征或语音表征最终生成离散的语音 token。

  • 非自回归(NAR)
    • 一次性预测整句语音 token 的分布,不依赖前面已经生成的 token,速度快,但是准确性或自然度可能相对低一些。
    • 在 VITA-1.5 中,NAR 模块的作用是快速生成一个"语义初步对齐"的语音 token 分布,给后续 AR 解码器参考。
  • 自回归(AR)
    • 类似于传统的语言模型,每生成一个 token 的时候,都会依赖之前已经生成的 token。这样生成质量更高,但速度更慢。
    • 在 VITA-1.5 中,AR 模块会在 NAR 初步生成的语义表征基础上,进一步 refine(精修)语音 token,从而得到更逼真的语音输出。

这种 "NAR + AR" 组合在现代一些端到端 TTS 或音频生成系统里并不罕见,既能保证一定的速度优势,也能兼顾输出质量。

3. TiCodec:如何把音频变成离散 token

VITA-1.5 中提到的 TiCodec 模块,提供了将连续语音波形编码成离散 token(以及反向解码成波形)的能力。

  • 传统 TTS 需要在频谱/声码器层面生成语音;
  • 现在很多大模型希望能用离散 token形式来做统一建模:音频也被切成 40Hz 一帧的序列,每一帧对应一个从 0~1023 的离散索引(因为 codebook 大小是 1024),就像在做文本 token 一样。
  • 然后再靠 TiCodec 的 decoder,把这些离散 token 还原回 24kHz 的波形。它跟常见的 EnCodec、SoundStream 等原理相通,只不过这里是一个自定义的 codebook。

这样做最大的好处,就是语音与文本可以"串联"在同一个序列空间中了,利于在 LLM 层面上做多模态的统一处理。


论文原理讲解:三阶段训练架构设计与方案

在 VITA-1.5 的论文中,作者强调了一个核心理念:多模态融合并非"一次性"就能做到 ,而是要通过"渐进式"方式,让各个模态能够循序渐进地对齐到同一个大型语言模型里。否则,如果把语音和视觉数据一下子都灌进去,很容易出现不同模态间相互干扰,从而导致训练不稳定或性能下降。VITA-1.5 主要分为以下三个阶段(Stage 1 ~ 3):

阶段1:视觉-语言训练

  1. Stage 1.1 Vision Alignment

    • 先冻结大部分参数,只训练一个视觉适配器(Vision Adapter)。
    • 具体做法是:把预训练好的视觉编码器(InternViT-300M)输出的图像特征,通过 MLP 等简单网络转换为可以喂给 LLM 的"视觉 token"表示。LLM 这时候并没有更新,主要是让视觉端先和语言端对齐。
    • 这样可以避免一下子微调所有模块,导致视觉特征和语言特征混乱,也让 LLM 的底层语言表示基本保持不变。
  2. Stage 1.2 Vision Understanding

    • 在完成了适配器初步对齐后,就可以让视觉编码器 + LLM 都参与训练了,使用大量的图像描述数据(Caption Data)。
    • 这一步让模型真正学会:如何从图像内容中提取语义并用自然语言表达
    • 因为前一步已经做了适配器的预热,模型在这个阶段训练会更稳定,不会出现严重的多模态冲突。
  3. Stage 1.3 Vision SFT

    • "SFT" 即指令微调(Supervised Fine-Tuning)。这里进一步使用视觉问答(Visual QA)数据,甚至包括一些 OCR、图表理解、数学推理等子任务。
    • 让模型不仅能描述图像,还能根据特定的用户指令进行更深入的回答或推理。
    • 至此,经过三步递进,VITA-1.5 已经在视觉-语言这个维度上具备较强的理解和生成能力。

阶段2:音频输入微调

  1. Stage 2.1 Audio Alignment

    • 这一步核心思想:让 LLM 能"听懂"语音
    • 首先单独用 CTC 对语音编码器做一次端到端训练,让它能把语音帧映射到文字序列。这个训练过程就像传统的 ASR 系统,得到一个能输出"文本 logits"的编码器。
    • 之后再把这个编码器接到 LLM 前面,通过一个音频适配器(Speech Adapter)把语音特征喂给 LLM,让 LLM 输出文字转录结果。
    • 在这个阶段,还会插入一些额外的可训练 token,告诉 LLM "这里是语音输入",从而让 LLM 产生正确的文本回答。
  2. Stage 2.2 Audio SFT

    • 有了基础的"听写"能力后,就可以让模型同时处理"语音问题"与"文本问题",并做类似 ChatGPT 式的多模态问答。
    • 做法是:将一部分文本问题随机替换成语音版本,混合进训练数据,让模型能应对用户"用语音提问"的场景,并以文本形式回答。
    • 同时,还在 LLM 输出端增加一个分类头,用来区分当前输入是文本还是语音,这可以让模型在推理时更精细地处理两种不同模态。

阶段3:音频输出微调

  1. Stage 3.1 Codec Training

    • 为了让模型能"说出"语音,而不是单纯给文字回答,需要先训练一个 codec(TiCodec)。
    • 这个 codec 的作用:将 24kHz 波形映射到 40Hz 的离散 token 序列(码本大小 1024),以及反向解码。
    • 训练好后,就能让模型在内部以"token"级别的方式去操纵语音表征。
  2. Stage 3.2 NAR + AR Decoder Training

    • 接着要训练两种解码器:NAR(非自回归)和 AR(自回归),让模型学会如何从文本 embedding 生成对应的语音 token。
    • 在这个阶段,LLM 本身是冻结的,只更新解码器(以及 codec 的一部分),避免破坏之前视觉-语言-音频输入已经学到的能力。
    • 最终就能实现"从文本到语音 token 再到波形"------也就是端到端 TTS 的闭环。

经过这三大阶段的训练,VITA-1.5 在视觉、语言、语音三大模态下都相互对齐,相互融合,形成了一个真正能"看、听、说、理解"的多模态大模型。


我是如何在本地跑通 VITA-1.5 的

下面我将"从零开始",把我在本地机器上跑通 VITA-1.5 的详细步骤进行分享。包含安装依赖、数据准备、训练脚本配置、推理流程,以及中间的一些常见踩坑点。

环境安装

1. 克隆仓库并创建 Conda 环境

假设你的机器上已经安装了 conda 或者 miniconda,那么我建议新建一个名为 vita 的虚拟环境。执行如下命令:

bash 复制代码
git clone https://github.com/VITA-MLLM/VITA
cd VITA
conda create -n vita python=3.10 -y
conda activate vita
pip install --upgrade pip
pip install -r requirements.txt
pip install flash-attn --no-build-isolation

为什么要安装 flash-attn?

因为现在很多大模型都会用到可选的加速库 FlashAttention 来减少显存占用与提高训练速度。如果你没有这个需求,也可以不装,但官方建议还是安装以获得更好的效率。

2. 检查 cuda / pytorch 版本

确保你的 CUDA 版本、PyTorch 版本都和 requirements.txt 中对应得上。若不匹配,有可能导致无法编译或者 CUDA kernel 加速失效。

数据准备

根据官方的指引,我们要准备一个 json 列表文件,里面每一条数据都包含了对应的"图像路径"、"语音路径"和一个多轮对话的列表结构。以下是一个简化示例:

jsonc 复制代码
[
    {
        "set": "sharegpt4",
        "id": "000000000164",
        "conversations": [
            {
                "from": "human",
                "value": "<image>\n<audio>\n"
            },
            {
                "from": "gpt",
                "value": "This is a well-organized kitchen with a clean, modern aesthetic..."
            }
        ],
        "image": "coco/images/train2017/000000000164.jpg",
        "audio": [
            "new_value_dict_0717/output_wavs/f61cf238b7872b4903e1fc15dcb5a50c.wav"
        ]
    },
    ...
]
  • set 用来区分数据来源,比如这里是 sharegpt4
  • image 字段指定图片路径,audio 是一个列表,可能包含多个 wav 文件路径;
  • conversations 字段里 "human" 对应用户输入,"gpt" 对应模型输出。

然后在 ./vita/config/dataset_config.py 中,你需要相应地配置:

python 复制代码
AudioFolder = "/absolute/path/to/audio/files/"
FolderDict = {
    "sharegpt4": "/absolute/path/to/sharegpt4/images"
}

ShareGPT4V = {"chat_path": "/absolute/path/to/your/train_data.json"}

DataConfig = {
    "Pretrain_video": [ShareGPT4V],
}

一旦完成这些配置,训练脚本就能根据 DataConfig 去读取你指定的 json 文件,然后在数据加载阶段将图像、语音、文本三者融合。

注意 :官方示例里把数据分得很细,比如 OCR、Caption、Video 等不同类型。对第一次尝试的同学而言,你只要先做好小规模的示例数据就行,确保能跑通流程再继续扩充数据集。


训练过程详解

1. 下载预训练权重

官方建议你需要准备 3 个模型权重:

  1. VITA-1.5 checkpoint
    • 如果想在已有的 VITA-1.5 上做持续训练,需要加载这个 checkpoint 作为初始模型。
  2. InternViT-300M-448px
    • 这是视觉编码器的预训练权重,用来处理图像、视频。
  3. Audio encoder
    • 这是阶段2 音频-语言对齐时训练好的"语音编码器"权重。如果你想直接在 VITA-1.0 或其他 checkpoint 上微调语音部分,也可以用它来初始化。

你需要在训练脚本(如 ./script/train/finetuneTaskNeg_qwen_nodes.sh)里修改这些路径。例如:

bash 复制代码
--model_name_or_path /path/to/VITA1.5_ckpt
--vision_tower /path/to/InternViT-300M-448px
--audio_encoder /path/to/audio-encoder-Qwen2-7B-1107-weight-base-11wh-tunning

2. 运行训练脚本

官方脚本大概长这样:

bash 复制代码
export PYTHONPATH=./
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
OUTPUT_DIR=/mnt/cfs/lhj/videomllm_ckpt/outputs/vita_video_audio

bash script/train/finetuneTaskNeg_qwen_nodes.sh ${OUTPUT_DIR}

你可以把 OUTPUT_DIR 改到你想要的输出目录。

如果一切正常,训练就会开始。在不同的阶段里,官方会设定不同的数据采样规则(比如先只用 caption,后面再加 QA,后面再加语音等),来实现渐进式的多模态训练。这也是上文所说的三阶段策略:

  1. Stage 1 : 视觉-语言对齐:
    • 首先训练视觉适配器(Vision Adapter),只让它学会把图像特征映射到 LLM 的输入空间。
    • 然后让 LLM + Vision Encoder 都可训练,学习更复杂的图像描述(captioning)和 QA。
  2. Stage 2 : 音频输入微调:
    • 先做 Audio Alignment,用 CTC 训练音频编码器,学会将语音映射为文本;
    • 再做 Audio SFT,通过混合语音问题、文本问题的对话数据让模型具备"听懂语音 -> 生成文本回答"的能力。
  3. Stage 3 : 音频输出微调:
    • 训练 TiCodec + (NAR, AR) 语音解码器,使模型实现端到端语音生成。

官方仓库里已经把这三阶段拆分好了对应的超参配置和数据集合。你可以只跑其中一个阶段,也可以全部串起来跑。如果你想完全复现论文效果,建议按照官方顺序逐阶段训练。


推理与 Demo

1. 快速开始:video_audio_demo.py

在仓库根目录下,有一个 video_audio_demo.py 脚本,可以让你对单张图片 + 单段音频进行推理测试。比如:

bash 复制代码
CUDA_VISIBLE_DEVICES=2 python video_audio_demo.py \
    --model_path /path/to/vita_model \
    --image_path asset/vita_newlog.jpg \
    --model_type qwen2p5_instruct \
    --conv_mode qwen2p5_instruct \
    --question "Describe this image."

或者用语音输入的方式(比如 --audio_path asset/q1.wav)让模型去识别音频内容,然后生成回答。

2. 低噪语音 / 高噪语音示例

官方还给了一个 --audio_path asset/q2.wav 的示例,意思是测试模型对高噪声或比较挑战的音频输入的鲁棒性。

3. Web 实时 Demo

如果你想做一个 Web 界面的实时交互 Demo,那么就可以参考 ./web_demo 目录下的说明。

大致做法是:

  1. 准备好 vLLM 或者官方推荐的 fork 版本(需要做适配)。

  2. 安装额外的依赖:

    bash 复制代码
    pip install -r web_demo/web_demo_requirements.txt
  3. 复制一份你的 VITA_ckpt,然后根据 web_demo/vllm_tools 下的脚本去修改某些 config,以兼容 vLLM。

  4. 最后执行:

    bash 复制代码
    python -m web_demo.web_ability_demo /path/to/demo_VITA_ckpt/

    就可以打开一个网页,进行基本的多模态对话。

若你想要真正实现"语音检测+唤醒+实时对话",还需要准备一个 VAD(Voice Activity Detection)模块,比如 silero_vad.onnx;然后将 max_dynamic_patch 调小一些(官方建议设成 1),这样可以让模型在推理时不用切成太多 patch,从而缩短语音对话的延迟。


评测:怎样在 MME 等多模态基准上测试

VLMEvalKit

多模态模型经常需要跑一堆基准,如 MMBench、MMStar、MMMU、MathVista、OCRBench 等。官方推荐用一个名为 VLMEvalKit 的工具,可以让你配置好 model 路径后,自动在各个数据集上跑推理,再交给一个打分器评估。

  1. VLMEvalKit/vlmeval/config.py 里把 vita_series = { 'vita': ... 'vita_qwen2': ...} 改成你自己的 model 路径。

  2. 若没有 OpenAI 的 GPT 4 API,可以使用一个本地模型做 judge。官方示例用 Qwen1.5-1.8B-Chat 作为打分器。

  3. 最后执行:

    bash 复制代码
    CUDA_VISIBLE_DEVICES=0 python run.py \
       --data MMBench_TEST_EN_V11 MMBench_TEST_CN_V11 ... \
       --model vita_qwen2 --verbose

    即可在多个英文/中文测试集上做评测,看看VITA-1.5表现如何。

Video-MME

专门测视频理解能力的基准,比如 Video-MME,需要先把视频拆帧成若干图像文件,再把它们组织好给到模型做推理。官方给了脚本 yt_video_inference_qa_imgs.py,你需要指定:

  • --model-path /path/to/vita
  • --video_dir /path/to/video_frames
  • --use_subtitles (可选,代表是否使用字幕信息)

跑完后用 parse_answer.py 分析结果即可。实际上,这背后就是把视频 当成多帧图像来处理,然后每次把这些帧拼在一起过模型。根据阶段1和阶段2学到的视觉特征,VITA-1.5 就能"看"这些帧并给出回答。


常见问题与经验分享

  1. 训练很慢怎么办?
    • 多模态大模型确实比较消耗资源。官方建议如果你只做小规模测试,可以减少训练数据或减小 batch size,先确保流程 OK。真要复现整套指标,可能需要多卡甚至集群资源。
  2. CTC 搭建时出现"报错不能编译"
    • 一些 PyTorch 版本内置了 warp-ctc 或者要安装第三方包。仔细查看日志是否是编译器版本问题、或者是 CUDA 驱动版本问题。
  3. 推理时显存不足
    • 可以尝试 8-bit 或 4-bit 量化,但官方暂未提供现成的量化脚本。
    • 另外也可以把 max_dynamic_patch 这种限制调小,让视觉 token 不要太多。
  4. 如何更换自己的数据
    • 需要注意你自己的图像/视频/语音路径和实际 json 的 image, audio 字段匹配上;
    • 如果想在训练中混合"自己的语音+文本+图像",要仔细配置 DataConfig 里的各种路径字典。
  5. 如何持续升级到 VITA-2.0
    • 根据团队的新闻,后续可能还会有更多版本;如果你打算自己对语音解码器做改进,可以参照他们在 Stage 3.2 的训练代码,先把 LLM 冻结只训练 AR/NAR 解码器,就不破坏已有多模态能力。

总结:从 VITA-1.5 看多模态实时交互的未来

个人理解的这篇论文的重点内容:

  1. 三阶段训练
    • 先学视觉,再学语音输入,最后加语音输出,循序渐进地融合不同模态,最大程度保留各自性能而减少冲突。
  2. 端到端语音
    • 不再依赖外部 TTS 模块,而是直接在模型内部实现了语音 token 的生成与解码,通过 TiCodec 还原为波形,降低延迟、增强了实时交互体验。
  3. 快速推理
    • 从之前的 4 秒降到 1.5 秒,已经算是可以接受的近实时语音对话。

就像 VITA-1.5 的论文里所说,它为多模态交互提供了一条很有前景的思路:在同一个 LLM 框架内做"统一建模",不再拆分成独立的 ASR、TTS、视觉识别等模块,而是通过 Token 化的方式把音频和图片都融入同一个 Transformer。未来若再加入更多模态(比如动作捕捉、体感信号等),可能也只是"再加一些 token 的事情",大模型会愈发成为一个真正能"看、听、说、理解"的全能 AI 中枢。


预告

本博主准备结合众多开源项目与社区的开源工作:LLaVA-1.5, Bunny, ChatUnivi, InternVL, InternViT, Qwen-2.5, VLMEvalkit, Mixtral 8*7B等尝试复现ChatGPT4O的高级语言能力,请持续关注。

相关推荐
HUIBUR科技1 小时前
量子计算遇上人工智能:突破算力瓶颈的关键?
人工智能·量子计算
CES_Asia1 小时前
CES Asia 2025聚焦量子与空间技术
人工智能·科技·数码相机·金融·量子计算·智能手表
程序猿阿伟1 小时前
《量子比特:解锁人工智能并行计算加速的密钥》
人工智能·量子计算
盖丽男2 小时前
机器学习的组成
人工智能·机器学习
风一样的树懒3 小时前
Python使用pip安装Caused by SSLError:certificate verify failed
人工智能·python
9命怪猫3 小时前
AI大模型-提示工程学习笔记5-零提示
人工智能·笔记·学习·ai·提示工程
Felix_12153 小时前
2025 西电软工数据结构机考 Tip (By Felix)
算法
cnbestec4 小时前
GelSight Mini视触觉传感器凝胶触头升级:增加40%耐用性,拓展机器人与触觉AI 应用边界
人工智能·机器人
bohu834 小时前
ros2-4.2 用python实现人脸识别
人工智能·opencv·人脸识别·ros2·服务调用
Loving_enjoy4 小时前
ChatGPT 数据分析与处理使用详解
大数据·人工智能