Qwen2-Audio-7B模型测试
import librosa from transformers import AutoProcessor, Qwen2AudioForConditionalGeneration # 模型和音频文件的本地路径 model_dir = "G:\\py_workspace\\qwen\\models\\models\\Qwen2-Audio-7B" # 从预训练模型中加载Qwen2AudioForConditionalGeneration模型,允许执行远程代码(因为模型可能包含自定义代码) model = Qwen2AudioForConditionalGeneration.from_pretrained(model_dir,device_map="auto") # 从预训练配置中加载对应的处理器,这个处理器用于准备输入数据和后处理模型输出,同样允许执行远程代码 processor = AutoProcessor.from_pretrained(model_dir) # 定义一个提示符,这个提示符用于指示模型开始生成音频内容的描述 prompt = "<|audio_bos|><|AUDIO|><|audio_eos|>这句话讲了什么意思:" # 定义音频文件的URL url = "media/5s.mp3" # 使用librosa库加载音频文件,注意这里通过urlopen读取音频文件的二进制内容,并通过BytesIO转换为适合librosa读取的对象 # 同时设置采样率为处理器中特征提取器所需的采样率 audio, sr = librosa.load(url, sr=processor.feature_extractor.sampling_rate) # 使用处理器准备输入数据,这里包括提示符、音频数据,并指定返回的数据类型为PyTorch张量 inputs = processor(text=prompt, audios=audio, return_tensors="pt") inputs.input_ids = inputs.input_ids.to("cuda") # 使用模型生成文本,设置最大长度为256个token generated_ids = model.generate(**inputs, max_length=256) # 由于生成的ID包括了提示符部分的ID,这里需要移除掉这些部分,只保留生成的文本ID generated_ids = generated_ids[:, inputs.input_ids.size(1):] # 使用处理器解码生成的ID为文本,跳过特殊token并保留原始tokenization的空间(不进行清理) response = processor.batch_decode(generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] print(response)
模型API测试
from io import BytesIO from urllib.request import urlopen from flask import Flask, jsonify import librosa from transformers import AutoProcessor, Qwen2AudioForConditionalGeneration import torch # 全局变量 model = None processor = None app = Flask(__name__) # 模型和音频文件的本地路径 model_dir = "G:\\py_workspace\\qwen\\models\\models\\Qwen2-Audio-7B" def load_model(): # 加载预训练的Qwen2-Audio-7B模型和处理器 try: global model, processor model = Qwen2AudioForConditionalGeneration.from_pretrained(model_dir) processor = AutoProcessor.from_pretrained(model_dir) print("Qwen2-Audio-7B 模型加载成功。") except Exception as e: print(f"加载模型失败: {e}") return None, None def load_audio_from_file(filename, target_sr): """从文件加载音频并转换为适合模型的格式""" # audio, sr = librosa.load(filename, sr=target_sr) url = "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-Audio/glass-breaking-151256.mp3" audio, sr = librosa.load(BytesIO(urlopen(url).read()), sr=target_sr) return audio, sr def generate_caption_from_audio(audio_data, sr, prompt): """使用 Qwen2-Audio-7B 模型从音频生成文本描述""" inputs = processor(text=prompt, audios=[audio_data], sampling_rate=sr, return_tensors="pt") print("加载文件") with torch.no_grad(): generated_ids = model.generate(**inputs, max_length=256) print("访问模型") generated_ids = generated_ids[:, inputs.input_ids.size(1):] print("处理结果") response = processor.batch_decode(generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] return response def voice_assistant_loop(audio_path): while True: try: # 加载并转换音频文件为适合模型的格式 audio_data, sr = load_audio_from_file(audio_path, target_sr=processor.feature_extractor.sampling_rate) # 生成文本描述 prompt = "<|audio_bos|><|AUDIO|><|audio_eos|>转文本:" response_text = generate_caption_from_audio(audio_data, sr, prompt) print("生成结果") return response_text except Exception as e: print(f"发生错误: {e}") continue @app.route('/') def index(): load_model() return 'Hello, World!' @app.route('/predict') def predict(): try: # 返回结果 return jsonify({'response': voice_assistant_loop('G:\\py_workspace\\qwen\media\\30s.mp3')}) except Exception as e: return jsonify({'error': str(e)}), 500 if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=5000)
小白技术分享
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix