前言
本文将给大家分享Qwen2_Audio相关信息和实操部署该语音大模型并提供多个案例展示包含语音内容分析、扮演翻译官、扮演情感师等等,下面进入今天的主题~
本文目录
-
理论篇: Qwen2_Audio语音大模型介绍
-
阿里重磅开源Qwen2_Audio语音大模型
-
Qwen2_Audio语音大模型网络架构介绍
-
Qwen2_Audio语音大模型性能表现
-
部署篇: 手把手实操部署Qwen2_Audio语音大模型进行推理效果展示
-
配置对应的运行环境
-
采用int4类型来加载Qwen2-Audio-7B-Instruct模型权重
-
Qwen2_Audio语音大模型的输入结构介绍
-
语音内容识别-进行推理效果展示
-
多batch批量推理-音频文件效果展示
-
实战篇: 利用Qwen2_Audio语音大模型搭建AI语音助手
-
扮演翻译官: 直接使用语音来让Qwen2_Audio语音大模型进行翻译
-
扮演情感师: 让Qwen2_Audio语音大模型扮演情感师-对说话人进行安抚
-
参考链接
理论篇: Qwen2_Audio语音大模型介绍
阿里重磅开源Qwen2_Audio语音大模型
最近阿里基于Qwen2系列陆续开源一系列垂直领域的大模型,例如Qwen2_Math数学大模型[阿里重磅开源Qwen2_Math! 实操利用onnxocr+Qwen2_Math打造【AI数学老师助手】来给小孩辅导数学作业!]。在8月9号,阿里又重磅开源了Qwen2-Audio语音大模型,它能够接受音频和文本输入并生成文本输出。Qwen2-Audio具有以下特点:
1.语音聊天:用户可以使用语音向音频-语言模型发出指令,无需自动语音识别(ASR)模块。
2.音频分析:模型能够分析包括语音、声音、音乐等在内的音频信息,并且可以根据文本指令进行操作。
3.多语言:模型支持超过8种语言和方言,例如中文、英语、粤语、法语、意大利语、西班牙语、德语和日语。
Qwen2_Audio语音大模型网络架构介绍
下图是Qwen2_Audio语音大模型的训练架构示意图。具体来说,利用Qwen语言模型和音频编码器作为基础模型,依次顺序地应用多任务预训练进行音频语言对齐,以及监督微调和直接偏好优化,以便能够掌握下游任务的能力和模型的人类偏好。
Qwen2_Audio语音大模型性能表现
上面是Qwen2-Audio在多个基准数据集上的性能测试结果。通过与先前的Qwen-Audio模型以及各个任务中的最新技术(SOTA)模型进行比较,Qwen2-Audio在所有测试任务中都显著地超越了它们。下面的图表是Qwen2-Audio相对于竞争对手模型的性能对比表格;
接下来,我将给大家手把手实操部署Qwen2_Audio语音大模型进行语音推理~
部署篇: 手把手实操部署Qwen2_Audio语音大模型进行推理效果展示
配置对应的运行环境
from IPython.display import Video,clear_output,Audio,Image
!pip install git+https://github.com/huggingface/transformers # 需要安装最新版的transformers
!pip install bitsandbytes==0.41.3
clear_output()
采用int4类型来加载Qwen2-Audio-7B-Instruct模型权重
通过对模型采用4位量化,可以极大地节约显存,只需要8g左右的显存。就可以轻松运行
from io import BytesIO
from urllib.request import urlopen
import librosa
from transformers import Qwen2AudioForConditionalGeneration, AutoProcessor, BitsAndBytesConfig
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-Audio-7B-Instruct")
bnb_config=BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True, #QLoRA 设计的 Double Quantization
bnb_4bit_quant_type="nf4", #QLoRA 设计的 Normal Float 4 量化数据类型
llm_int8_threshold=6.0,
llm_int8_has_fp16_weight=False,
)
model = Qwen2AudioForConditionalGeneration.from_pretrained("Qwen/Qwen2-Audio-7B-Instruct",
quantization_config=bnb_config,
torch_dtype=torch.float16,
low_cpu_mem_usage=True,
trust_remote_code=True).eval()
model
可以看出有三部分组成;
1.audio_tower模块对音频进行编码;
2.multi_modal_projector模块: 主要是多语言映射模块。
3.Qwen2_7B模型进行整体建模预测;
完整的网络模型结果如下:
Qwen2_Audio语音大模型的输入结构介绍
注意下面的关键词audio、role、content、audio_url不能随意修改。
conversation = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{"role": "user", "content": [
{"type": "audio", "audio_url": "glass-breaking-151256.mp3"},
{"type": "text", "text": "What's that sound?"},
]},
{"role": "assistant", "content": "It is the sound of glass shattering."},
{"role": "user", "content": [
{"type": "text", "text": "What can you do when you hear that?"},
]},
{"role": "assistant", "content": "Stay alert and cautious, and check if anyone is hurt or if there is any damage to property."},
{"role": "user", "content": [
{"type": "audio", "audio_url": "1272-128104-0000.flac"},
{"type": "text", "text": "What does the person say?"},
]},
]
对应输入语音大模型中的文本编码内容如下:
音频内容如下:
进行推理效果展示
准备测试音频文件-素材一
!wget https://demo-r2.speech.fish.audio/v1.1-sft-large/zh/0_output.wav
import torchaudio
from IPython.display import Audio
waveform, sample_rate = torchaudio.load("0_output.wav")
print(sample_rate)
Audio(waveform, rate=sample_rate, autoplay=True)
素材一音频文件展示:
推理效果展示-识别语音文件内容
这是针对音频素材一进行内容识别,对应的代码
%%time
conversation = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{"role": "user", "content": [
{"type": "audio", "audio_url": "0_output.wav"},
{"type": "text", "text": "这个人说了什么内容?"},
]},
]
text = processor.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False)
audios = []
for message in conversation:
if isinstance(message["content"], list):
for ele in message["content"]:
if ele["type"] == "audio":
audios.append(librosa.load(ele['audio_url'],
sr=processor.feature_extractor.sampling_rate)[0]
)
inputs = processor(text=text, audios=audios, return_tensors="pt", padding=True)
inputs.input_ids = inputs.input_ids.to("cuda")
generate_ids = model.generate(**inputs, max_length=256)
generate_ids = generate_ids[:, inputs.input_ids.size(1):]
response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
print(response)
语音模型输出的效果:
多batch批量推理-音频文件效果展示
支持多个不同对话音频内容打包成同一批次进行模型推理预测,下面是我的测试代码。
%%time
conversation1 = [
{"role": "user", "content": [
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/glass-breaking-151256.mp3"},
{"type": "text", "text": "What's that sound?"},
]},
{"role": "assistant", "content": "It is the sound of glass shattering."},
{"role": "user", "content": [
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/f2641_0_throatclearing.wav"},
{"type": "text", "text": "What can you hear?"},
]}
]
conversation2 = [
{"role": "user", "content": [
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/1272-128104-0000.flac"},
{"type": "text", "text": "What does the person say?"},
]},
]
conversations = [conversation1, conversation2]
text = [processor.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False) for conversation in conversations]
audios = []
for conversation in conversations:
for message in conversation:
if isinstance(message["content"], list):
for ele in message["content"]:
if ele["type"] == "audio":
audios.append(
librosa.load(
BytesIO(urlopen(ele['audio_url']).read()),
sr=processor.feature_extractor.sampling_rate)[0]
)
inputs = processor(text=text, audios=audios, return_tensors="pt", padding=True)
inputs['input_ids'] = inputs['input_ids'].to("cuda")
inputs.input_ids = inputs.input_ids.to("cuda")
generate_ids = model.generate(**inputs, max_length=256)
generate_ids = generate_ids[:, inputs.input_ids.size(1):]
response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)
print(response)
输出的效果:
可以看出语音大模型轻松识别音频的内容。下面我将继续深入给大家介绍语音大模型的用法~
实战篇: 利用Qwen2_Audio语音大模型搭建AI语音助手
扮演翻译官: 直接使用语音来让Qwen2_Audio语音大模型进行翻译
下面我将展示Qwen2_Audio的语言翻译能力;这是对应的音频素材二展示
%%time
conversation = [
{"role": "user", "content": [
{"type": "audio", "audio_url": "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen2-Audio/audio/translate_to_chinese.wav"},
]},
]
text = processor.apply_chat_template(conversation, add_generation_prompt=True, tokenize=False)
audios = []
for message in conversation:
if isinstance(message["content"], list):
for ele in message["content"]:
if ele["type"] == "audio":
audios.append(librosa.load(
BytesIO(urlopen(ele['audio_url']).read()),
sr=processor.feature_extractor.sampling_rate)[0]
)
inputs = processor(text=text, audios=audios, return_tensors="pt", padding=True)
inputs.input_ids = inputs.input_ids.to("cuda")
generate_ids = model.generate(**inputs, max_length=256)
generate_ids = generate_ids[:, inputs.input_ids.size(1):]
response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
print(response)
输出的结果:
可以看出翻译的非常准确!
扮演情感师: 让Qwen2_Audio语音大模型扮演情感师-对说话人进行安抚
下面我找了一段说话人情绪比较激动的音频素材三,让Qwen2_Audio语音大模型扮演情感师对说话人进行安抚。
!wget https://demo-r2.speech.fish.audio/v1.1-sft-large/zh/7_output.wav
import torchaudio
from IPython.display import Audio
x, sample_rate = torchaudio.load("7_output.wav")
Audio(x, rate=sample_rate, autoplay=True)
音频素材三展示:
%%time
prompt = """<|im_start|>system
你是一名情感师,你需要充分理解说话人的内容和情绪,并给出对应的内容来安抚说话人.<|im_end|>
<|im_start|>user
Audio 1: <|audio_bos|><|AUDIO|><|audio_eos|>
理解说话人的内容,同时判断识别说话人的情绪,并给出对应的安抚建议。<|im_end|>
<|im_start|>assistant"""
url = "7_output.wav"
audio, sr = librosa.load(url, sr=processor.feature_extractor.sampling_rate)
inputs = processor(text=prompt, audios=audio, return_tensors="pt")
generated_ids = model.generate(**inputs, max_length=256)
generated_ids = generated_ids[:, inputs.input_ids.size(1):]
response = processor.batch_decode(generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
print(response)
语音大模型输出的效果:可以看出语音大模型能够准确的识别说话人的情绪和内容,并给出对应的建议。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。