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)
复制代码

 

posted @   过氧化氢  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示