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 中,官方引入了一些重大改进:
- 大幅减少互动延迟
- 通过内置端到端的语音解码器,免去外部 TTS 的依赖,使得语音到语音的交互时间由 4 秒降到 1.5 秒左右,几乎接近实时。
- 多模态性能提升
- 在图像、视频理解等多模态任务基准上(比如 MME, MMBench, MathVista 等),性能相比 VITA-1.0 有明显提升。
- 改进的语音处理能力
- 英文 ASR(语音识别)任务中,WER(Word Error Rate)从 18.4% 降到了 7.5%,同时中文 ASR 效果也大幅提升。
- 使用端到端 TTS 机制,完全打通了从视觉/文本/语音到语音输出的闭环。
- 渐进式多阶段训练策略
- 能够在训练过程中最小化不同模态间的"冲突",保留视觉-语言能力的同时,将语音能力逐步添加进去,最后又不会损害整体性能。
得益于这些改进,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:视觉-语言训练
-
Stage 1.1 Vision Alignment
- 先冻结大部分参数,只训练一个视觉适配器(Vision Adapter)。
- 具体做法是:把预训练好的视觉编码器(InternViT-300M)输出的图像特征,通过 MLP 等简单网络转换为可以喂给 LLM 的"视觉 token"表示。LLM 这时候并没有更新,主要是让视觉端先和语言端对齐。
- 这样可以避免一下子微调所有模块,导致视觉特征和语言特征混乱,也让 LLM 的底层语言表示基本保持不变。
-
Stage 1.2 Vision Understanding
- 在完成了适配器初步对齐后,就可以让视觉编码器 + LLM 都参与训练了,使用大量的图像描述数据(Caption Data)。
- 这一步让模型真正学会:如何从图像内容中提取语义并用自然语言表达。
- 因为前一步已经做了适配器的预热,模型在这个阶段训练会更稳定,不会出现严重的多模态冲突。
-
Stage 1.3 Vision SFT
- "SFT" 即指令微调(Supervised Fine-Tuning)。这里进一步使用视觉问答(Visual QA)数据,甚至包括一些 OCR、图表理解、数学推理等子任务。
- 让模型不仅能描述图像,还能根据特定的用户指令进行更深入的回答或推理。
- 至此,经过三步递进,VITA-1.5 已经在视觉-语言这个维度上具备较强的理解和生成能力。
阶段2:音频输入微调
-
Stage 2.1 Audio Alignment
- 这一步核心思想:让 LLM 能"听懂"语音。
- 首先单独用 CTC 对语音编码器做一次端到端训练,让它能把语音帧映射到文字序列。这个训练过程就像传统的 ASR 系统,得到一个能输出"文本 logits"的编码器。
- 之后再把这个编码器接到 LLM 前面,通过一个音频适配器(Speech Adapter)把语音特征喂给 LLM,让 LLM 输出文字转录结果。
- 在这个阶段,还会插入一些额外的可训练 token,告诉 LLM "这里是语音输入",从而让 LLM 产生正确的文本回答。
-
Stage 2.2 Audio SFT
- 有了基础的"听写"能力后,就可以让模型同时处理"语音问题"与"文本问题",并做类似 ChatGPT 式的多模态问答。
- 做法是:将一部分文本问题随机替换成语音版本,混合进训练数据,让模型能应对用户"用语音提问"的场景,并以文本形式回答。
- 同时,还在 LLM 输出端增加一个分类头,用来区分当前输入是文本还是语音,这可以让模型在推理时更精细地处理两种不同模态。
阶段3:音频输出微调
-
Stage 3.1 Codec Training
- 为了让模型能"说出"语音,而不是单纯给文字回答,需要先训练一个 codec(TiCodec)。
- 这个 codec 的作用:将 24kHz 波形映射到 40Hz 的离散 token 序列(码本大小 1024),以及反向解码。
- 训练好后,就能让模型在内部以"token"级别的方式去操纵语音表征。
-
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 个模型权重:
- VITA-1.5 checkpoint
- 如果想在已有的 VITA-1.5 上做持续训练,需要加载这个 checkpoint 作为初始模型。
- InternViT-300M-448px
- 这是视觉编码器的预训练权重,用来处理图像、视频。
- 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,后面再加语音等),来实现渐进式的多模态训练。这也是上文所说的三阶段策略:
- Stage 1 : 视觉-语言对齐:
- 首先训练视觉适配器(Vision Adapter),只让它学会把图像特征映射到 LLM 的输入空间。
- 然后让 LLM + Vision Encoder 都可训练,学习更复杂的图像描述(captioning)和 QA。
- Stage 2 : 音频输入微调:
- 先做 Audio Alignment,用 CTC 训练音频编码器,学会将语音映射为文本;
- 再做 Audio SFT,通过混合语音问题、文本问题的对话数据让模型具备"听懂语音 -> 生成文本回答"的能力。
- 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
目录下的说明。
大致做法是:
-
准备好 vLLM 或者官方推荐的 fork 版本(需要做适配)。
-
安装额外的依赖:
bashpip install -r web_demo/web_demo_requirements.txt
-
复制一份你的
VITA_ckpt
,然后根据web_demo/vllm_tools
下的脚本去修改某些 config,以兼容 vLLM。 -
最后执行:
bashpython -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 路径后,自动在各个数据集上跑推理,再交给一个打分器评估。
-
在
VLMEvalKit/vlmeval/config.py
里把vita_series = { 'vita': ... 'vita_qwen2': ...}
改成你自己的 model 路径。 -
若没有 OpenAI 的 GPT 4 API,可以使用一个本地模型做 judge。官方示例用 Qwen1.5-1.8B-Chat 作为打分器。
-
最后执行:
bashCUDA_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 就能"看"这些帧并给出回答。
常见问题与经验分享
- 训练很慢怎么办?
- 多模态大模型确实比较消耗资源。官方建议如果你只做小规模测试,可以减少训练数据或减小 batch size,先确保流程 OK。真要复现整套指标,可能需要多卡甚至集群资源。
- CTC 搭建时出现"报错不能编译"
- 一些 PyTorch 版本内置了 warp-ctc 或者要安装第三方包。仔细查看日志是否是编译器版本问题、或者是 CUDA 驱动版本问题。
- 推理时显存不足
- 可以尝试 8-bit 或 4-bit 量化,但官方暂未提供现成的量化脚本。
- 另外也可以把
max_dynamic_patch
这种限制调小,让视觉 token 不要太多。
- 如何更换自己的数据
- 需要注意你自己的图像/视频/语音路径和实际 json 的
image
,audio
字段匹配上; - 如果想在训练中混合"自己的语音+文本+图像",要仔细配置
DataConfig
里的各种路径字典。
- 需要注意你自己的图像/视频/语音路径和实际 json 的
- 如何持续升级到 VITA-2.0
- 根据团队的新闻,后续可能还会有更多版本;如果你打算自己对语音解码器做改进,可以参照他们在 Stage 3.2 的训练代码,先把 LLM 冻结只训练 AR/NAR 解码器,就不破坏已有多模态能力。
总结:从 VITA-1.5 看多模态实时交互的未来
个人理解的这篇论文的重点内容:
- 三阶段训练
- 先学视觉,再学语音输入,最后加语音输出,循序渐进地融合不同模态,最大程度保留各自性能而减少冲突。
- 端到端语音
- 不再依赖外部 TTS 模块,而是直接在模型内部实现了语音 token 的生成与解码,通过 TiCodec 还原为波形,降低延迟、增强了实时交互体验。
- 快速推理
- 从之前的 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的高级语言能力,请持续关注。