大数跨境
0
0

【Qwen-Omni】:全模态大模型快速上手

【Qwen-Omni】:全模态大模型快速上手 我爱数据科学
2025-11-23
2
导读:Qwen-Omni 全模型能够接收文本与单一其他模态(图片、音频、视频)的组合输入,并生成文本或语音形式的回复

Qwen-Omni 全模型能够接收文本与单一其他模态(图片、音频、视频)的组合输入,并生成文本或语音形式的回复, 提供多种拟人音色,支持多语言和方言的语音输出,可应用于文本创作、视觉识别、语音助手等场景。

1、快速开始

前提条件

  • 已配置 API Key并配置API Key到环境变量。
  • Qwen-Omni 模型仅支持 OpenAI 兼容方式调用,需要安装最新版SDK。OpenAI Python SDK 最低版本为 1.52.0, Node.js SDK 最低版本为 4.68.0。

调用方式:Qwen-Omni 目前仅支持以流式输出的方式进行调用,stream参数必须设置为True,否则会报错。

以下示例将一段文本发送至 Qwen-Omni的API接口,并流式返回文本和音频的回复。

import os
from dotenv import load_dotenv
# 加载.env文件,确保API Key受到保护
load_dotenv()
# 魔搭社区
ms_api_key = os.getenv("ms_api_key") # 读取 MODELSCOPE_API_KEY
ms_base_url = os.getenv("ms_base_url") # 读取 MODELSCOPE_BASE_URL
# 阿里云
dash_api_key = os.getenv("dash_api_key") # 读取 DASHSCOPE_API_KEY
dash_base_url = os.getenv("dash_base_url") # 读取 DASHSCOPE_BASE_URL
# 运行下列命令安装第三方依赖
# pip install numpy soundfile openai

import base64
import soundfile as sf
import numpy as np
from openai import OpenAI

import base64
import soundfile as sf
import numpy as np
from openai import OpenAI

# 1. 初始化客户端
# 创建OpenAI客户端实例,配置API密钥和基础URL
client = OpenAI(
    api_key = dash_api_key,  # 使用预先定义的dash_api_key,确保已正确设置
    base_url = dash_base_url,  # 使用预先定义的dash_base_url,指向API服务地址
)

# 2. 发起请求
try:
    # 创建聊天补全请求,使用流式传输
    completion = client.chat.completions.create(
        model="qwen3-omni-flash",  # 指定使用的模型名称
        messages=[{"role": "user", "content": "你是谁"}],  # 用户输入的消息内容
        modalities=["text", "audio"],  # 指定输出模式:同时返回文本和音频
        audio={"voice": "Cherry", "format": "wav"},  # 音频配置:使用Cherry音色,WAV格式
        stream=True,  # 启用流式传输,必须设置为True以逐步接收响应
        stream_options={"include_usage": True},  # 流式选项:包含使用量统计信息
    )

    # 3. 处理流式响应并解码音频
    print("模型回复:")
    audio_base64_string = ""  # 初始化字符串,用于累积音频的base64数据

    # 遍历流式响应的每个数据块
    for chunk in completion:
        # 处理文本部分:如果数据块包含文本内容则打印
        if chunk.choices and chunk.choices[0].delta.content:
            print(chunk.choices[0].delta.content, end="")  # 逐字打印文本,不换行

        # 收集音频部分:如果数据块包含音频数据则累积
        if chunk.choices and hasattr(chunk.choices[0].delta, "audio") and chunk.choices[0].delta.audio:
            # 从音频数据中获取base64编码的字符串并拼接
            audio_base64_string += chunk.choices[0].delta.audio.get("data", "")

    # 4. 保存音频文件
    if audio_base64_string:
        # 将base64字符串解码为字节数据
        wav_bytes = base64.b64decode(audio_base64_string)
        # 将字节数据转换为numpy数组,使用16位整数格式(WAV标准格式)
        audio_np = np.frombuffer(wav_bytes, dtype=np.int16)
        # 使用soundfile库将音频数据保存为WAV文件
        # 参数:文件名、音频数据、采样率(24kHz)
        sf.write("audio_assistant.wav", audio_np, samplerate=24000)
        print("\n音频文件已保存至:audio_assistant.wav")
    else:
        print("\n未接收到音频数据")

except Exception as e:
    # 异常处理:捕获并打印任何可能的错误信息
    print(f"请求失败: {e}")

输出为:

模型回复:
我是Qwen-Omni,是阿里巴巴集团旗下的通义实验室自主研发的多模态超大规模语言模型,有什么我可以帮助你的吗?
音频文件已保存至:audio_assistant.wav

您的浏览器不支持音频元素。

接下来,我们将上面的代码封装为函数,方便后续使用。

def chat_with_voice(client, user_message, voice="Cherry", audio_format="wav", 
                   save_audio=True, audio_filename="audio_assistant.wav", 
                   print_text=True, samplerate=24000):
    """
    与语音模型进行对话并获取文本和音频回复

    参数:
        client: OpenAI客户端实例
        user_message (str): 用户输入的消息
        voice (str): 语音类型,默认为"Cherry"
        audio_format (str): 音频格式,默认为"wav"
        save_audio (bool): 是否保存音频文件,默认为True
        audio_filename (str): 音频文件名,默认为"audio_assistant.wav"
        print_text (bool): 是否打印文本回复,默认为True
        samplerate (int): 音频采样率,默认为24000

    返回:
        dict: 包含文本回复和音频数据的字典
    """

    try:
        # 发起聊天补全请求
        completion = client.chat.completions.create(
            model="qwen3-omni-flash",
            messages=[{"role": "user", "content": user_message}],
            modalities=["text", "audio"],
            audio={"voice": voice, "format": audio_format},
            stream=True,
            stream_options={"include_usage": True},
        )

        # 初始化变量
        text_response = ""  # 存储完整的文本回复
        audio_base64_string = ""  # 存储音频的base64数据

        if print_text:
            print("模型回复:")

        # 处理流式响应
        for chunk in completion:
            # 处理文本部分
            if chunk.choices and chunk.choices[0].delta.content:
                chunk_text = chunk.choices[0].delta.content
                text_response += chunk_text
                if print_text:
                    print(chunk_text, end="")

            # 收集音频部分
            if chunk.choices and hasattr(chunk.choices[0].delta, "audio") and chunk.choices[0].delta.audio:
                audio_base64_string += chunk.choices[0].delta.audio.get("data", "")

        # 保存音频文件
        audio_data = None
        if audio_base64_string and save_audio:
            wav_bytes = base64.b64decode(audio_base64_string)
            audio_data = np.frombuffer(wav_bytes, dtype=np.int16)
            sf.write(audio_filename, audio_data, samplerate=samplerate)
            if print_text:
                print(f"\n音频文件已保存至:{audio_filename}")

        # 返回结果
        result = {
            "text": text_response,
            "audio_base64": audio_base64_string,
            "audio_data": audio_data,
            "audio_saved": save_audio and audio_base64_string != "",
            "audio_filename": audio_filename if save_audio else None
        }

        return result

    except Exception as e:
        print(f"请求失败: {e}")
        return {
            "text": "",
            "audio_base64": "",
            "audio_data": None,
            "audio_saved": False,
            "audio_filename": None,
            "error": str(e)
        }

示例1:讲一个简短的通话故事

# 初始化客户端
client = OpenAI(
    api_key=dash_api_key,
    base_url=dash_base_url,
)

result1 = chat_with_voice(
    client=client,
    user_message="讲一个简短的童话故事",
    voice="Cherry",  # 可以根据支持的语音类型调整
    audio_filename="fairy_tale.wav",
    print_text=True
)

输出为:

模型回复:
从前有个小女孩,她总爱在森林里采蘑菇。一天,她发现一只会说话的小白兔,兔子说:“跟我来,我带你去个神奇的地方。”他们穿过一片发光的蘑菇圈,来到一个会唱歌的花园。花园里有会跳舞的花朵和会讲故事的石头。小女孩开心极了,但天黑前必须回家。小白兔送她回到起点,说:“记住,快乐就在你身边。”从此,小女孩每天都能听见花园的歌声。
音频文件已保存至:fairy_tale.wav

您的浏览器不支持音频元素。

示例2:只获取文本,不保存音频

result2 = chat_with_voice(
    client=client,
    user_message="今天的天气怎么样?",
    save_audio=False,
    print_text=True
    )

输出为:

模型回复:
今天的天气不错,阳光明媚,气温在25度左右,适合外出活动。你那边天气怎么样?

访问返回结果。

print(f"文本回复: {result2['text']}")
print(f"音频是否保存: {result2['audio_saved']}")
print(f"音频文件: {result2['audio_filename']}")

输出为:

文本回复: 今天的天气不错,阳光明媚,气温在25度左右,适合外出活动。你那边天气怎么样?
音频是否保存: False
音频文件: None

【Qwen3-VL】:多模态AI新玩法! 基于Qwen3-VL的文档智能解析(一)

【Qwen3-VL】:多模态AI新玩法! 基于Qwen3-VL的文档智能解析(二)将图片解析为Markdown

【Qwen3-VL】:多模态AI新玩法! 基于Qwen3-VL的文档智能解析(三)对图片解析Markdown结果进行智能问答

【Qwen3-VL】:多模态AI新玩法! 基于Qwen3-VL的文档智能解析(四)搭建文档解析平台

【Qwen3-VL】:多模态AI新玩法! 基于Qwen3-VL的文档智能解析(五)搭建功能完善的文档解析平台

【Qwen3-VL】:多模态AI新玩法! 基于Streamlit搭建长文档智能解析平台


【声明】内容源于网络
0
0
我爱数据科学
精通R语言及Python,传递数据挖掘及可视化技术,关注机器学习及深度学习算法及实现,分享大模型及LangChain的使用技巧。编著多本R语言、python、深度学习等书籍。
内容 322
粉丝 0
我爱数据科学 精通R语言及Python,传递数据挖掘及可视化技术,关注机器学习及深度学习算法及实现,分享大模型及LangChain的使用技巧。编著多本R语言、python、深度学习等书籍。
总阅读155
粉丝0
内容322