前言
随着GPT-4o的发布,在语音界面的Voice-Chat越来越受到大家的关注,对于低延迟,高准确性模型的speech-to-speech的需求日益增长,来自中科院计算所NLP组的LLaMA-Omni 有效的解决了这样的需求,该模型整合了预训练的语音编码器、语音adapter、LLM和流式语音解码器,并消除了对文本输出后再语音转录的需求,能够直接从语音指令中同时生成文本和语音响应。
研究团队使用最新的Llama-3.1-8B-Instruct模型构建了Llama-3.1-8B-Omni,同时构建了一个名为“InstructS2S-200K”的数据集,其中包含20万个语音指令及其对应的语音响应。实验结果表明,相比于之前的语音语言模型,LLaMA-Omni在内容和风格上提供了更好的响应,并且具有极低的响应延迟,仅为226毫秒。此外,训练LLaMA-Omni仅需要不到3天的时间,在只有4个GPU的情况下进行,为未来高效开发语音语言模型铺平了道路。
LLaMA-Omni 主要特点和进步:
高质量问答
基于LLaMA-3.1-8B训练,LLaMA-3.1-8B是同尺寸大小的比较领先的大语言模型,来确保回应质量高
同时语音和文本响应
LLaMA-Omni 能够根据用户语音输入生成语音和文本响应(如下图)。这使其成为语音助手或交互式代理等实时应用的理想选择。响应是同时生成的,无需繁琐的中间转录步骤,从而提高了对话的速度和流畅度。
低延迟
LLaMA-Omni 最令人印象深刻的功能是低延迟,其响应时间低至226 毫秒。这使其成为目前最快的语音对语音交互模型之一,可确保用户体验近乎即时的反馈。和传统的方式不同之处在于输出的时候不是先输出完文本再把文本转换成语音,而是流式的边输出文本边输出语音,类似人的同声传译,大幅度降低了延迟。
高效训练
LLaMA-Omni 不仅延迟低,开发效率也高,训练LLaMA-Omni仅需要不到3天的时间,在只有4个GPU的情况下进行,为未来高效开发语音语言模型铺平了道路,凸显了其对各类 AI 开发者和研究人员的可扩展性和可访问性。
优化数据集
构建了一个名为“InstructS2S-200K”的数据集,其中包含20万个语音指令及其对应的语音响应。此数据集确保模型高度适应处理各种语音输入并生成适当的上下文感知响应。
模型是来自modelscop的,可以参考地址,论文地址,代码仓库
模型体验
基于modelscop服务,可以在开放平台上构建自己的环境,创建空间体验连击
模型使用
下载代码
$ git clone https://github.com/ictnlp/LLaMA-Omni
$ cd LLaMA-Omni
创建空间环境
$ conda create --name llama_omni python=3.10
.....
$ conda activate llama_omni
安装Omni包
$ pip install pip==24.0
$ pip install -e .
安装fairseq
$ git clone https://github.com/pytorch/fairseq
$ cd fairseq
$ pip install -e . --no-build-isolation
安装flash-attention
$ pip install flash-attn --no-build-isolation
模型下载
下载Llama-3.1-8B-Omni
$ modelscope download --model=ICTNLP/Llama-3.1-8B-Omni --local_dir ./Llama-3.1-8B-Omni
下载whisper-large-v3
$ wget "https://modelscope.cn/models/ai-modelscope/large-v3.pt/resolve/master/large-v3.pt" -P models/speech_encoder/
下载HiFi-GAN vocoder.
$ wget https://dl.fbaipublicfiles.com/fairseq/speech_to_speech/vocoder/code_hifigan/mhubert_vp_en_es_fr_it3_400k_layer11_km1000_lj/g_00500000 -P vocoder/
$ wget https://dl.fbaipublicfiles.com/fairseq/speech_to_speech/vocoder/code_hifigan/mhubert_vp_en_es_fr_it3_400k_layer11_km1000_lj/config.json -P vocoder/
演示如下
- 启动控制器
$ python -m omni_speech.serve.controller --host 0.0.0.0 --port 10000
- 启动gradio网络服务
$ python -m omni_speech.serve.gradio_web_server --controller http://localhost:10000 --port 8000 --model-list-mode reload --vocoder vocoder/g_00500000 --vocoder-cfg vocoder/config.json
- 开启活动
$ python -m omni_speech.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path Llama-3.1-8B-Omni --model-name Llama-3.1-8B-Omni --s2s
- 访问http://localhost:8000/并与模型LLama-3.1-8B-Omni互动
注意:由于gradio中流不稳定,最好在启动之前关闭代理VPN
模型推理
要进行本地推理,请按照 omni_speech/infer/examples 目录中的格式组织语音指令文件,然后参考以下脚本。
bash omni_speech/infer/run.sh omni_speech/infer/examples
模型微调
我们使用ms-swift对Llama3.1-8B-Omni进行微调。ms-swift是魔搭社区官方提供的大模型与多模态大模型微调部署框架。
ms-swift开源地址,这里展示可运行的demo,自定义数据集可以查看这里
使用 aishell1-zh-mini 测试数据集,进行微调。微调的脚本如下:
# 默认:微调LLM和projector, 冻结vision encoder和generator
$ CUDA_VISIBLE_DEVICES=0 swift sft \
--model_type llama3_1-8b-omni \
--model_id_or_path ICTNLP/Llama-3.1-8B-Omni \
--sft_type lora \
--dataset aishell1-zh-mini#5000
# Deepspeed ZeRO2
$ NPROC_PER_NODE=4 \
CUDA_VISIBLE_DEVICES=0,1,2,3 swift sft \
--model_type llama3_1-8b-omni \
--model_id_or_path ICTNLP/Llama-3.1-8B-Omni \
--sft_type lora \
--dataset aishell1-zh-mini#5000 \
--deepspeed default-zero2
训练显存占用:
如果要使用自定义数据集,只需按以下方式进行指定:
# val_dataset可选,如果不指定,则会从dataset中切出一部分数据集作为验证集
--dataset train.jsonl \
--val_dataset val.jsonl \
自定义数据集格式如下,分别代表单音频、多音频和纯文本的格式:
{"query": "<audio>55555", "response": "66666", "audios": ["audio_path"]}
{"query": "<audio><audio>eeeee", "response": "fffff", "history": [], "audios": ["audio_path1", "audio_path2"]}
{"query": "query3", "response": "response3", "history": [["query1", "response1"], ["query2", "response2"]]}
训练loss图如下:
微调后推理脚本如下,这里的ckpt_dir需要修改为训练生成的last_checkpoint文件夹。
$ CUDA_VISIBLE_DEVICES=0 swift infer \
--ckpt_dir output/llama3_1-8b-omni/vx-xxx/checkpoint-xxx \
--load_dataset_config true
# or merge-lora & infer
$ CUDA_VISIBLE_DEVICES=0 swift infer \
--ckpt_dir output/llama3_1-8b-omni/vx-xxx/checkpoint-xxx \
--load_dataset_config true --merge_lora true