Stream-Omni:开启多模态交互新时代
在人工智能快速发展的今天,我们正见证着一个全新的多模态交互时代的到来。Stream-Omni,这个融合了语言、视觉和语音的大型模型,正在重新定义我们与机器交互的方式。本文将深入探讨 Stream-Omni 的技术原理、应用场景以及如何搭建和使用这一前沿技术。
一、Stream-Omni 是什么?
Stream-Omni 是一个能够同时支持多种模态组合交互的大型语言 – 视觉 – 语音模型。它就像是一个全能的沟通桥梁,可以处理文本、图像和语音等多种输入形式,并生成相应的文本或语音响应。更重要的是,它能在语音交互过程中同步输出中间文本结果,比如自动语音识别(ASR)转录和模型响应,为我们带来无缝的“边看边听”体验。
二、Stream-Omni 的核心技术原理
(一)模态对齐:让不同数据类型“心意相通”
Stream-Omni 的核心优势在于其高效的模态对齐技术。它采用了两种主要的对齐方式:
-
序列维度拼接(Sequence-dimension Concatenation) :对于视觉信息,Stream-Omni 将视觉编码器提取的特征与文本特征进行序列维度上的拼接。这种方式充分利用了文本和图像在语义上的互补性,让模型能够同时理解图片中的视觉元素和相关文本描述。 -
层维度映射(Layer-dimension Mapping) :对于语音信息,Stream-Omni 引入了基于连接时序分类(CTC)的层维度映射。它在大型语言模型(LLM)的底层和顶层分别添加了语音层,通过 CTC 解码器实现语音到文本的精准映射。这就像是给语音和文本搭建了一个直通的隧道,使得语音能够高效地借用 LLM 的文本能力,即便在有限的语音数据下也能实现出色的语音交互。
(二)训练策略:用少量数据激发巨大潜力
Stream-Omni 的训练过程采用了三阶段策略:
-
第一阶段:视觉 – 文本对齐 :利用视觉导向型多模态模型的训练方法,让模型学会理解图像和相关文本之间的关系。 -
第二阶段:语音 – 文本对齐 :通过结合 CTC 损失和交叉熵损失来训练底部和顶部的语音层,使语音能够与文本实现精准对齐。 -
第三阶段:文本 – 视觉 – 语音对齐 :使用构造的三模态数据,通过多任务学习来训练 LLM 主干网络,让模型能够灵活支持各种模态组合的交互。
三、Stream-Omni 的应用场景
(一)视觉问答:看图解惑的高手
在视觉问答领域,Stream-Omni 表现出色。它可以准确理解图像内容,并结合文本问题给出恰当回答。例如,当我们上传一张建筑平面图并询问地下室楼梯是否能直达二楼时,Stream-Omni 能基于图像给出准确判断。
(二)语音交互:畅快交流的伙伴
对于语音交互,Stream-Omni 同样展现出强大的能力。无论是将语音转化为文本进行回答,还是直接生成语音回应,它都能出色完成任务。比如,我们可以通过语音询问一个设备的用途,Stream-Omni 能准确识别语音并给出详细解释。
四、如何搭建和使用 Stream-Omni?
(一)环境准备
-
创建 Python 环境 :推荐使用 Conda 创建一个 Python 3.10 的环境,确保软件包的一致性和兼容性。
- ▸
conda create -n streamomni python=3.10 -y
- ▸
conda activate streamomni
- ▸
-
安装依赖包 :使用 pip 安装项目所需的依赖包,包括 flash-attn 以及 CosyVoice 的相关依赖。
- ▸
pip install -e .
- ▸
pip install flash-attn --no-build-isolation
- ▸
pip install -r requirements.txt
- ▸
pip install -r CosyVoice/requirements.txt
- ▸
(二)模型和工具下载
-
下载 Stream-Omni 模型 :从 Huggingface 网站下载 Stream-Omni 模型,并将其放置在指定目录(如 ${STREAMOMNI_CKPT}
)。 -
下载 CosyVoice(Tokenizer & Flow Model) :从 ModelScope 网站下载 CosyVoice 模型,并将其放置在指定目录(如 COSYVOICE_CKPT=./CosyVoice-300M-25Hz
)。
(三)启动服务
-
启动控制器 :运行控制器脚本,设置主机为
0.0.0.0
,端口为10000
。- ▸
python stream_omni/serve/controller.py --host 0.0.0.0 --port 10000
- ▸
-
启动 CosyVoice 工作进程 :设置 CosyVoice 模型路径和音频保存目录,然后启动工作进程。
- ▸
COSYVOICE_CKPT=path_to_CosyVoice-300M-25Hz
- ▸
WAV_DIR=path_to_save_generated_audio
- ▸
CUDA_VISIBLE_DEVICES=0 PYTHONPATH=CosyVoice/third_party/Matcha-TTS python ./CosyVoice/cosyvoice_worker.py --port 21003 --model ${COSYVOICE_CKPT} --wav_dir ./gen_wavs/
- ▸
-
启动 Stream-Omni 工作进程 :设置 Stream-Omni 模型路径,然后启动工作进程。如果显存小于 32GB,可以添加
--load-8bit
参数以降低显存占用。- ▸
STREAMOMNI_CKPT=path_to_stream-omni-8b
- ▸
CUDA_VISIBLE_DEVICES=1 python ./stream_omni/serve/model_worker.py --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path ${STREAMOMNI_CKPT} --model-name stream-omni
- ▸
-
启动交互界面 :运行 Gradio Web 脚本,通过浏览器访问
http://localhost:7860
进行交互。- ▸
python stream_omni/serve/gradio_web.py --controller http://localhost:10000 --model-list-mode reload --port 7860
- ▸
(四)命令行交互示例
以下是一个简单的命令行交互示例,展示如何使用 Stream-Omni 进行视觉导向的语音交互:
export CUDA_VISIBLE_DEVICES=0
export PYTHONPATH=CosyVoice/third_party/Matcha-TTS
STREAMOMNI_CKPT=path_to_stream-omni-8b
# 在 run_stream_omni.py 中替换 CosyVoice 模型路径(例如,cosyvoice = CosyVoiceModel('./CosyVoice-300M-25Hz'))
# 如果显存小于 32GB,添加 --load-8bit 参数
python ./stream_omni/eval/run_stream_omni.py \
--model-path ${STREAMOMNI_CKPT} \
--image-file ./stream_omni/serve/examples/cat.jpg --conv-mode stream_omni_llama_3_1 --model-name stream-omni \
--query ./stream_omni/serve/examples/cat_color.wav
运行上述脚本后,你将得到以下输出:
ASR 输出:
这只猫是什么颜色的
LLM 输出:
这只猫是灰色和黑色的。
语音令牌:
<Audio_2164><Audio_2247><Audio_671><Audio_246><Audio_2172><Audio_1406><Audio_119><Audio_203><Audio_2858><Audio_2099><Audio_1716><Audio_22><Audio_1736><Audio_1038><Audio_4082><Audio_1655><Audio_2409><Audio_2104><Audio_571><Audio_2255><Audio_73><Audio_760><Audio_822><Audio_701><Audio_2583><Audio_1038><Audio_2203><Audio_1185><Audio_2103><Audio_1718><Audio_2610><Audio_1883><Audio_16><Audio_792><Audio_8><Audio_8><Audio_535><Audio_67>
语音输出:
音频已保存至 ./output_893af1597afe2551d76c37a75c813b16.wav
(五)不同模态组合的交互方式
Stream-Omni 支持多种模态组合的交互,以下是几种常见的交互方式及其对应的脚本:
你可以在model.generate()
中通过设置inference_type
参数(可选值包括text_to_text
、text_to_speech
、speech_to_text
、speech_to_speech
)来控制交互模式。
五、Stream-Omni 的性能表现
(一)视觉理解能力
在多个视觉理解基准测试中,Stream-Omni 展现出强大的性能。例如,在 VQA-v2、GQA 等 11 个基准测试中,它与先进的视觉导向型多模态模型(如 LLaVA 系列)相比毫不逊色。这表明 Stream-Omni 能够在处理视觉信息时保持高度的准确性,为用户提供更可靠的视觉问答服务。
(二)语音交互能力
在知识导向型语音交互测试中,Stream-Omni 仅使用 23,000 小时的语音数据,就在 Llama Questions 和 Web Questions 等基准测试中取得了优异的成绩。与依赖大量语音数据预训练的离散语音单元的语音导向型 LMM 模型(如 SpeechGPT、Moshi、GLM-4-Voice 等)相比,Stream-Omni 凭借其基于 CTC 的语音 – 文本映射,更高效地将 LLM 的文本知识转移到语音模态,实现了知识导向型语音交互。
(三)基于视觉的语音交互能力
为了更贴近实际应用场景,研究团队基于 VisIT-Bench 构建了 SpokenVisIT 基准测试,用于评估多模态模型的基于视觉的语音交互能力。在这个测试中,Stream-Omni 凭借其出色的视觉理解和语音生成能力,相较于 VITA-1.5 等模型展现出更强的基于视觉的语音交互能力,为用户带来更丰富的多模态交互体验。
六、Stream-Omni 的优势与局限性
(一)优势
-
高效的数据利用 :Stream-Omni 在训练过程中仅使用了 23,000 小时的语音数据,相较于其他模型(如 TWIST 使用 150,000 小时、SpeechGPT 使用 60,000 小时等),在数据效率上具有显著优势。 -
卓越的多模态交互能力 :无论是视觉问答还是语音交互,Stream-Omni 都能提供高质量的响应,并且能够同步输出中间文本结果,提升用户体验。 -
灵活的模态组合支持 :它支持多种模态组合的交互方式,能够满足不同场景下的需求。
(二)局限性
尽管 Stream-Omni 在多模态交互方面取得了显著的成果,但它也存在一些局限性。例如,它在语音的表现力和类人性方面还有待进一步提升。这些因素对于高质量的多模态交互体验也至关重要,将是未来研究和改进的方向。
七、Stream-Omni 的实际案例分析
(一)视觉细节理解案例
在 SpokenVisIT 基准测试的一个案例中,Stream-Omni 准确理解了图像中楼梯的结构,并给出了与 GPT-4V 相似的回答。而 VITA-1.5 在面对文本和语音不同输入模态时,产生了矛盾的回答。这凸显了 Stream-Omni 在语音 – 文本语义对齐方面的优势,使其无论面对哪种输入模态,都能保持回答的一致性。
(二)长语音生成案例
在另一个案例中,Stream-Omni 展现出了出色的长语音生成能力,生成了长达 30 秒的高质量语音输出。并且,生成的语音与对应的文本输出高度一致,这充分证明了其基于对齐融合模块的有效性,实现了高质量的基于视觉的语音交互。
八、总结与展望
Stream-Omni 作为一款先进的多模态交互模型,通过创新的模态对齐技术和高效的训练策略,在视觉理解、语音交互以及基于视觉的语音交互等多个领域都取得了卓越的成果。它的出现为多模态交互技术的发展注入了新的活力,也为未来更加智能、更加自然的人机交互模式提供了新的思路和方向。随着技术的不断进步和完善,我们有理由相信,Stream-Omni 将在更多的应用场景中发挥其巨大的潜力,为我们的生活和工作带来更多的便利和创新体验。
如果你在使用 Stream-Omni 的过程中有任何问题,或者想了解更多关于 Stream-Omni 的信息,可以通过 GitHub 仓库 或 Huggingface 页面 进一步探索。