❤️ 如果你也关注 AI 的发展现状,且对 AI 应用开发感兴趣,我会每日分享大模型与 AI 领域的开源项目和应用,提供运行实例和实用教程,帮助你快速上手AI技术!
🥦 AI 在线答疑 -> 智能检索历史文章和开源项目 -> 尽在微信公众号 -> 搜一搜:蚝油菜花 🥦
🎙️ “还在用Whisper单纯转文字?西工大开源模型让语音会「读心」:语音识别+情绪识别+说话人分析+年龄预测等8大任务自由切换!”
大家好,我是蚝油菜花。当你还在为这些场景头疼时——
- 👉 客服录音分析要跑3个模型:先转文字,再情感分析,最后统计性别比例
- 👉 医疗问诊录音转录后,还要手动标记咳嗽声和患者情绪波动
- 👉 语音助手指令识别准确,却听不懂用户语气中的紧急程度...
西北工业大学音频实验室刚刚开源的 OSUM模型 ,正在重新定义语音理解!这个基于Whisper+Qwen2的「多面手」,单次推理即可输出带情感标签、说话人属性的转录文本。开发者实测显示,在智能客服场景中处理效率提升400%,错误率降低62%——这可能是2025年最实用的语音处理基础设施。
🚀 快速阅读
OSUM 是一款结合 Whisper 编码器和 Qwen2 LLM 的开源语音理解模型。
- 核心功能:支持语音识别、情感分析、说话者性别分类等多任务处理。
- 技术原理:采用 ASR+X 多任务训练策略,通过模态对齐优化提升泛化能力。
OSUM 是什么
OSUM(Open Speech Understanding Model)是由西北工业大学计算机学院音频、语音与语言处理研究组开发的开源语音理解模型。它结合了 Whisper 编码器和 Qwen2 LLM,旨在探索学术资源有限条件下语音理解模型的潜力。
OSUM 基于“ASR+X”多任务训练策略,利用约 5 万小时的多样化语音数据进行训练,在中文语音识别和多任务泛化能力方面表现优异。该模型不仅支持多种语音任务,还强调透明性,提供了公开的数据准备和训练方法,为学术界提供了宝贵的参考。
OSUM 的主要功能
- 语音识别:将语音转换为文本,支持多种语言和方言。
- 带时间戳的语音识别:输出每个单词或短语的时间起止点。
- 语音事件检测:识别特定事件如笑声、咳嗽、背景噪音等。
- 语音情感识别:分析语音中的情感状态(如高兴、悲伤、愤怒等)。
- 说话风格识别:判断说话者的风格(如新闻播报、客服对话、日常口语等)。
- 说话者性别分类:预测说话者的性别(男性或女性)。
- 说话者年龄预测:估计说话者的年龄范围(如儿童、成年人、老年人)。
- 语音转文本聊天:将语音输入转化为自然语言回复,用于对话系统。
OSUM 的技术原理
- Speech Encoder:使用 Whisper-Medium 模型(769M 参数),负责将语音信号编码为特征向量。
- Adaptor:包含 3 层卷积和 4 层 Transformer,适配语音特征与语言模型输入。
- LLM(语言模型):基于 Qwen2-7B-Instruct,使用 LoRA(Low-Rank Adaptation)微调以适应多任务需求。
- 多任务训练策略:采用 ASR+X 训练范式,同时优化语音识别任务和附加任务(如情感识别、性别分类等)。
- 自然语言 Prompt:通过不同的提示引导模型执行不同任务。
如何运行 OSUM
准备环境
在开始之前,请确保您的 Python 环境已经准备好。以下是推荐的操作流程。我们假设您已经在计算机上安装了 Conda 软件。如果没有,请参考:Linux 上 Miniconda 一键安装
。我们强烈建议您在 Linux 系统的计算机上运行我们的代码。
- Linux 上 Miniconda 一键安装:https://blog.csdn.net/qq_41636123/article/details/130266232
# 创建一个新的 Conda 环境
conda create -n OSUM python=3.10
# 激活新创建的环境
conda activate OSUM
# 下载我们的代码并安装所需的 Python 包
git clone https://github.com/ASLP-lab/OSUM.git
cd OSUM
# 如果您在 GPU 上进行训练,请首先删除 requirements.txt 中的 torch_npu 条目。如果您使用的是 NPU,则无需操作。
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
推理
首先,让我们看看如何执行推理。主要使用文件:OSUM/examples/osum/infer.sh
下载检查点
从我们的 Hugging Face 仓库下载模型检查点。您可以使用 Python 下载:
# 从 Hugging Face 下载 .pt 文件
from huggingface_hub import hf_hub_download
pt_file_path = hf_hub_download(repo_id="ASLP-lab/OSUM", filename="infer.pt") # 此时,pt_file_path 是下载的检查点的具体路径。
或者从 Hugging Face 网站下载:https://huggingface.co/ASLP-lab/OSUM
然后在 infer.sh
中设置 ckpt
变量:
ckpt_path=***/infer.sh
准备数据
我们支持两种类型的数据进行推理(遵循wenet
开源框架的规范):
- wenet:https://github.com/wenet-e2e/wenet
- Raw 格式:您需要传入一个 JSONL 格式的文件,其中每一行是一个 JSON 字典格式。字典键值包括 "key":音频的唯一标识符,"wav":音频的具体路径(不限于 WAV 格式),以及 "txt":与音频对应的文本。在实际推理场景中,它可以是任何值,但请尽量确保该键值的存在以避免可能的代码级别错误。
具体示例:
{
<!-- -->"key": "BAC009S0764W0122", "wav": "***/wav/BAC009S0764W0122.wav", "txt": "一线城市和二线城市也在进行调整"}
- Shard_full_data 格式:更常用于训练以加速机器读取文件的速度,也可以用于推理。它将多个音频文件(例如,1000 个文件)保存在一个 tar 包中,并且 "key" 的内容作为文件名。以上述音频条目为例,在其 tar 包中,应将其转换为以下两个文件:
BAC009S0764W0122.txt
和BAC009S0764W0122.wav
。文件后缀是其对应的变量值,文件名是音频的唯一标识符。
当您准备好数据列表文件后,在 infer.sh
中设置数据文件变量:
data_path=***/data.jsonl
选择合适的任务
当前开源版本的 OSUM 支持多种任务。您可以根据 OSUM/examples/osum/conf/prompt_config.yaml
文件中的任务标签选择要推理的任务,并在 OSUM/examples/osum/infer.sh
中填写要推理的任务标签。同时,请注意 prompt_config.yaml
中的标签包含空格,infer.sh
中填写的标签需要手动删除空格(由于 shell 语法的限制)。
具体示例:
task="" # 此标签用于 ASR + 性别任务
选择合适的 GPU/NPU
OSUM 模型是在华为 Ascend 910B 上训练的,但训练和推理代码同时支持 GPU 和 NPU。
该项目的推理大致需要 20G 的显存。如果您的机器上有这样的显卡,请设置要执行推理的显卡的序列号:
gpu_id=3
开始推理!
以下是 infer.sh
的完整示例:
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
lang=zh
prompt_file=conf/prompt_stage4.yaml
ckpt_path=./infer.sh
data_path=./data/aishell/data.list
data_type="raw"
gpu_id=3
output_dir=./output/aishell
task=""
bash decode/do_docode.sh --output_dir $output_dir --task $task --data_type $data_type --data_path $data_path --gpu_id $gpu_id --ckpt_path $ckpt_path --lang $lang --prompt_file $prompt_file
如何更直接地执行推理?
- 单个音频文件的推理
# 在此文件中设置 checkpoint_path 变量为本地下载的 ckpt,然后在主函数中设置相应的音频路径和提示
python OSUM/examples/osum/runtime/infer_runtime.py
- 部署并执行基于 Web 的推理
# 部署并启动服务,将在 localhost 127.0.0.1:7860 上部署一个测试网页。您还需要首先设置 checkpoint_path 变量。
python OSUM/examples/osum/runtime/web.py
训练
接下来,让我们看看如何进行训练。
主要涉及的文件有:OSUM/examples/osum/run_huawei_2p_master.sh
、OSUM/examples/osum/run_huawei_2p_rank1.sh
和 OSUM/examples/osum/run_huawei_2p_rank2.sh
该项目默认支持多机训练。如果当前代码未修改,默认将执行 3 机 8 卡训练。
检查点下载
与推理部分的介绍相同。
数据准备
我们强烈建议使用 shard_full_data
格式以最大限度地减少加载数据所消耗的时间。单个 tar
文件中包含的音频文件数量建议为 1000
。
数据准备完成后,您需要将数据列表写入 OSUM/examples/osum/conf/data_config_huawei.yaml
文件。data_config_huawei.yaml
的具体内容如下:
data_name1:
path: "***/shards_list.txt"
weight: 3 # 权重,此数据列表文件中的数据量将增加三倍
data_name2:
path: "***/shards_list.txt"
weight: 1
shards_list.txt
的具体示例:
***/***/0001.tar
***/***/0002.tar
***/***/0003.tar
***/***/0004.tar
......
多机多卡训练
多台机器需要多个启动文件,并且需要将一台机器设置为协调机。对于当前代码,我们在协调机上执行文件 OSUM/examples/osum/run_huawei_2p_master.sh
,并在其他机器上分别执行 OSUM/examples/osum/run_huawei_2p_rank1.sh
和 OSUM/examples/osum/run_huawei_2p_rank2.sh
。
我们应该确保这三个文件的内容几乎相同,除了这里的 node_rank
:
torchrun --nnodes=$num_nodes --nproc_per_node=$num_gpus --node_rank=0 \
--master_addr=$HOST_NODE_ADDR --master_port=$HOST_PORT \
在 run_huawei_2p_master.sh
中,您需要将 node_rank
设置为 0
,而在其他机器上,它应依次为 1、2、3、4、...
。
其他配置包括:
- 机器数量
num_nodes=3
- 协调机的 IP 地址
HOST_NODE_ADDR=192.168.0.15
- 其他变量
checkpoint=*** # 如果为空,则将随机初始化
data=*** # 数据存储的目录
dir=*** # 新检查点将存储的位置
单机训练
您只需将 OSUM/examples/osum/run_huawei_2p_master.sh
中的机器数量设置为 1
,并将协调机 IP 设置为本地机器 IP。
在单机训练期间,如果您想修改训练机器的数量,只需灵活修改:
export CUDA_VISIBLE_DEVICES="0,1,2,3,4,5,6,7"
训练超参数
具体参数设置在以下文件中:https://github.com/ASLP-lab/OSUMOSUM/examples/osum/conf/config_llm_huawei_base-version.yaml
资源
- GitHub 仓库:https://github.com/ASLP-lab/OSUM
❤️ 如果你也关注 AI 的发展现状,且对 AI 应用开发感兴趣,我会每日分享大模型与 AI 领域的开源项目和应用,提供运行实例和实用教程,帮助你快速上手AI技术!
🥦 AI 在线答疑 -> 智能检索历史文章和开源项目 -> 尽在微信公众号 -> 搜一搜:蚝油菜花 🥦
发表评论 取消回复