文档

API详情

更新时间:

通义千问Audio

说明

支持的领域 / 任务:aigc

我们介绍Qwen-Audio的最新进展:Qwen2-Audio。作为一个大规模音频语言模型,Qwen2-Audio能够接受各种音频信号输入,并根据语音指令执行音频分析或直接响应文本。我们介绍两种不同的音频交互模式:语音聊天voice chat和音频分析audio analysis。

  • 语音聊天:用户可以自由地与Qwen2-Audio进行语音互动,而无需文本输入;

  • 音频分析:用户可以在互动过程中提供音频和文本指令对音频进行分析;

通义千问Audio是阿里云研发的大规模音频语言模型。通义千问Audio可以以多种音频(包括说话人语音、自然音、音乐、歌声)和文本作为输入,并以文本作为输出。通义千问Audio模型的特点包括:

  1. 全类型音频感知:通义千问Audio是一个性能卓越的通用音频理解模型,支持30秒内的自然音、人声、音乐等类型音频理解,如多语种语音识别,时间戳定位,说话人情绪、性别识别,环境识别,音乐的乐器、风格、情感识别等。

  2. 基于音频推理:通义千问Audio支持基于音频内容进行相关推理和创作,如语义理解,场景推理,相关推荐,内容创作等。

  3. 支持多轮音频和文本对话:通义千问Audio支持多音频分析、多轮音频-文本交错对话。

用户以文本和URL形式的图片形式输入包含多轮对话历史和当前指令的信息序列(messages),到返回模型生成的回复作为输出。在这一过程中,文本将被转换为语言模型可以处理的token序列。Token是模型用来表示自然语言文本的基本单位,可以直观的理解为“字”或“词”。对于中文文本来说,千问模型的1个token通常对应一个1.5-1.8个汉字;对于英文文本来说,1个token通常对应3至4个字母或1个单词。例如,中文文本“你好,我是通义千问”会被转换成序列['你好', ',', '我是', '通', '义', '千', '问'],而英文文本"Nice to meet you."则会被转换成['Nice', ' to', ' meet', ' you', '.'];图片将按照图片尺寸、图片大小、分辨率不同会转换成不同长度地token序列。

由于模型调用的计算量与token序列长度相关,输入或输出token数量越多,模型的计算时间越长,我们将根据模型输入和输出的token数量计费。可以从API返回结果的 usage 字段中了解到您每次调用时使用的token数量。

对于输入音频有以下限制:

  1. 音频文件大小不超过10 MB。

  2. 音频的时长不超过30s。

输入的音频格式支持主流的 amr, wav(CodecID: GSM_MS), wav(PCM), 3gp, 3gpp, aac, mp3 等等,大部分常见编码的音频格式通义千问Audio都可以解析并进行音频理解。

模型概览

模型名

模型简介

模型输入/输出限制

qwen2-audio-instruct

通义千问Audio更新增强版。拓展音频多模态理解和生成能力,额外提供语音聊天与音频分析能力,能够实现自由灵活的音频交互。

模型支持8k tokens上下文,为了保证正常的使用和输出,API限定用户输入为6k tokens,输出为1.5k tokens。

qwen-audio-chat

通义千问Audio支持灵活的交互方式,包括全音频类型、多轮问答、基于音频能力的推理与创作等能力的模型,同时支持说话人情绪,性别识别,环境识别,音乐的乐器、风格识别等多样的音频理解能力。

SDK使用

前提条件

  • 已开通服务并获得API-KEY:获取API-KEY

  • 我们推荐您将API-KEY配置到环境变量中以降低API-KEY的泄漏风险,详情可参考配置API-KEY到环境变量。您也可以在代码中配置API-KEY,但是泄漏风险会提高。

  • 已安装最新版SDK:安装SDK

问答示例

简单示例

from http import HTTPStatus
import dashscope


def simple_multimodal_conversation_call():
    """Simple single round multimodal conversation call.
    """
    messages = [
        {
            "role": "user",
            "content": [
                {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
                {"text": "这段音频在说什么?"}
            ]
        }
    ]
    response = dashscope.MultiModalConversation.call(model='qwen2-audio-instruct',
                                                     messages=messages)
    # The response status_code is HTTPStatus.OK indicate success,
    # otherwise indicate request is failed, you can get error code
    # and message from code and message.
    if response.status_code == HTTPStatus.OK:
        print(response)
    else:
        print(response.code)  # The error code.
        print(response.message)  # The error message.


if __name__ == '__main__':
    simple_multimodal_conversation_call()
// Copyright (c) Alibaba, Inc. and its affiliates.

import java.util.Arrays;
import java.util.Collections;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;

public class Main {
    public static void simpleMultiModalConversationCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
        .content(Arrays.asList(Collections.singletonMap("audio", "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"), 
        Collections.singletonMap("text", "这段音频在说什么?"))).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model("qwen2-audio-instruct")
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result);
    }

    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

本地文件

您可以通过本地文件进行接口调用。在传入文件路径时,请根据您所使用的系统和文件的路径进行调整,详情如下表所示。

系统

SDK

传入的文件路径

示例

Linux或macOS系统

Python SDK

file://{文件的绝对路径}

file:///home/audios/test.wav

Java SDK

Windows系统

Python SDK

file://{文件的绝对路径}

file://D:/audios/test.wav

Java SDK

file:///{文件的绝对路径}

file:///D:/audios/test.wav

示例代码如下。

from dashscope import MultiModalConversation


def call_with_local_file():
    """Sample of use local file.
       linux&mac file schema: file:///home/audios/test.wav
       windows file schema: file://D:/audios/test.wav
    """
    local_file_path1 = 'file://The_local_absolute_file_path1'
    local_file_path2 = 'file://The_local_absolute_file_path2'
    messages = [{
        'role': 'system',
        'content': [{
            'text': 'You are a helpful assistant.'
        }]
    }, {
        'role':
        'user',
        'content': [
            {
                'audio': local_file_path1
            },
            {
                'audio': local_file_path2
            },
            {
                'text': '音频里在说什么?'
            },
        ]
    }]
    response = MultiModalConversation.call(model='qwen2-audio-instruct', messages=messages)
    print(response)


if __name__ == '__main__':
    call_with_local_file()
// Copyright (c) Alibaba, Inc. and its affiliates.

import java.util.Arrays;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import io.reactivex.Flowable;

public class Main {
    /**
     * sample of use local file
     * Linux & Mac format: file:///home/audios/test.wav
     * Windows file format: file:///D:/test/audios/test.wav
     * 
     */
    public static void callWithLocalFile()
            throws ApiException, NoApiKeyException, UploadFileException {
        String localFilePath1 = "file://The_file_absolute_path1";
        String localFilePath2 = "file://The_file_absolute_path2"; 
        MultiModalConversation conv = new MultiModalConversation();
        // must create mutable map.
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
        .content(Arrays.asList(new HashMap<String, Object>(){{put("audio", localFilePath1);}},
                               new HashMap<String, Object>(){{put("audio", localFilePath2);}},
                               new HashMap<String, Object>(){{put("text", "音频里在说什么?");}})).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model("qwen2-audio-instruct")
                .message(userMessage)
                .build();
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(item -> {
            System.out.println(item);
        });
    }

    public static void main(String[] args) {
        try {
            callWithLocalFile();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}


多轮对话

from http import HTTPStatus
from dashscope import MultiModalConversation


def conversation_call():
    """Sample of multiple rounds of conversation.
    """
    messages = [
        {
            "role": "user",
            "content": [
                {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
                {"text": "这段音频在说什么?"},
            ]
        }
    ]
    response = MultiModalConversation.call(model='qwen2-audio-instruct',
                                           messages=messages)
    # The response status_code is HTTPStatus.OK indicate success,
    # otherwise indicate request is failed, you can get error code
    # and message from code and message.
    if response.status_code == HTTPStatus.OK:
        print(response)
    else:
        print(response.code)  # The error code.
        print(response.message)  # The error message.
    messages.append({'role': response.output.choices[0].message.role,
                     'content': response.output.choices[0].message.content})
    messages.append({"role": "user",
                     "content": [
                         {"text": "介绍一下这家公司?", }
                     ]})
    import json
    print(json.dumps(messages, ensure_ascii=False))
    response = MultiModalConversation.call(model='qwen2-audio-instruct',
                                           messages=messages)
    # The response status_code is HTTPStatus.OK indicate success,
    # otherwise indicate request is failed, you can get error code
    # and message from code and message.
    if response.status_code == HTTPStatus.OK:
        print(response)
    else:
        print(response.code)  # The error code.
        print(response.message)  # The error message.


if __name__ == '__main__':
    conversation_call()

// Copyright (c) Alibaba, Inc. and its affiliates.

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;

public class Main {
    private static final String modelName = "qwen2-audio-instruct";
    public static void MultiRoundConversationCall() throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage systemMessage = MultiModalMessage.builder().role(Role.SYSTEM.getValue())
        .content(Arrays.asList(Collections.singletonMap("text", "You are a helpful assistant."))).build();

        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
        .content(Arrays.asList(Collections.singletonMap("audio", "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"), 
        Collections.singletonMap("text", "这段音频在说什么?"))).build();
        List<MultiModalMessage> messages = new ArrayList<>();
        messages.add(systemMessage);
        messages.add(userMessage);
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model(modelName)
                .messages(messages)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println(result);
        // add the result to conversation
        messages.add(result.getOutput().getChoices().get(0).getMessage());
        MultiModalMessage msg = MultiModalMessage.builder().role(Role.USER.getValue())
        .content(Arrays.asList(Collections.singletonMap("text", "介绍一下这家公司?"))).build();
        messages.add(msg);
        // new messages
        param.setMessages((List)messages);
        result = conv.call(param);
        System.out.print(result);
    }

    public static void main(String[] args) {
        try {
            MultiRoundConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

流式输出

from dashscope import MultiModalConversation


def simple_multimodal_conversation_call():
    """Simple single round multimodal conversation call.
    """
    messages = [
        {
            "role": "user",
            "content": [
                {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
                {"text": "这段音频在说什么?"}
            ]
        }
    ]
    responses = MultiModalConversation.call(model='qwen2-audio-instruct',
                                           messages=messages,
                                           stream=True)
    for response in responses:
        print(response)


if __name__ == '__main__':
    simple_multimodal_conversation_call()
// Copyright (c) Alibaba, Inc. and its affiliates.

import java.util.Arrays;
import java.util.HashMap;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversation;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationParam;
import com.alibaba.dashscope.aigc.multimodalconversation.MultiModalConversationResult;
import com.alibaba.dashscope.common.MultiModalMessage;
import com.alibaba.dashscope.common.Role;
import com.alibaba.dashscope.exception.ApiException;
import com.alibaba.dashscope.exception.NoApiKeyException;
import com.alibaba.dashscope.exception.UploadFileException;
import io.reactivex.Flowable;

public class Main {
    public static void streamCall()
            throws ApiException, NoApiKeyException, UploadFileException {
        MultiModalConversation conv = new MultiModalConversation();
        // must create mutable map.
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
        .content(Arrays.asList(new HashMap<String, Object>(){{put("audio", "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3");}}, 
        new HashMap<String, Object>(){{put("text", "这段音频在说什么?");}})).build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model("qwen2-audio-instruct")
                .message(userMessage)
                .build();
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(item -> {
            System.out.println(item);
        });
    }

    public static void main(String[] args) {
        try {
            streamCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}

参数配置

参数

类型

默认值

说明

model

string

-

指定用于对话的通义千问模型名,qwen2-audio-instruct。

messages

list[dict]

-

用户输入的历史对话信息和指令组成的完整输入信息。

参考示例,目前对于音频,支持音频URL和本地路径

本地路径格式:

python下:

  • linux&mac file format: file:///home/audios/test.wav

  • windows file format: file://D:/test/audios/test.wav

java下:

  • Linux & Mac format: file:///home/audios/test.wav

  • Windows file format: file:///D:/test/audios/test.wav

重要

请注意Windows下Python与Java路径格式的区别(file://和file:///)

top_p(可选)

float

生成过程中核采样方法概率阈值,例如,取值为0.1时,仅保留概率加起来大于等于0.1的最可能token的最小集合作为候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的确定性越高。

stream(可选)

boolean

False

是否使用流式输出。当以stream模式输出结果时,接口返回结果为generator,需要通过迭代获取结果,每个输出为当前生成的整个序列,最后一次输出为最终全部生成结果。

max_tokens(可选)

integer

1500

指定模型可生成的最大token个数。例如模型最大输出长度为2k,您可以设置为1k,防止模型输出过长的内容。

top_k(可选)

integer

生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。注意:如果top_k的值大于100,top_k将取值100。

seed(可选)

integer

生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。

incremental_output(可选)

boolean

False

是否使用增量输出,仅在设置stream为True时可指定。当使用增量输出时每次流式返回的序列仅包含最新生成的增量内容;默认输出完整的全量内容。

返回结果

  • 返回结果示例

    {
        "status_code": 200,
        "request_id": "afbf4016-8704-965d-b98a-53ea46a06742",
        "code": "",
        "message": "",
        "output": {
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "text": "这段音频在说中文:\"欢迎使用阿里云\"。"
                            }
                        ]
                    }
                }
            ]
        },
        "usage": {
            "input_tokens": 1282,
            "audio_tokens": 768,
            "output_tokens": 107
        }
    }
  • 返回参数说明

    返回参数

    类型

    说明

    示例值

    status_code

    int

    200(HTTPStatus.OK)表示请求成功,否则表示请求失败,可以通过code获取错误码,通过message字段获取错误详细信息。

    request_Id

    string

    系统生成的标志本次调用的id。

    code

    string

    表示请求失败,表示错误码,成功忽略。

    output

    dict

    调用结果信息,对于通义千问Audio模型,包含输出message。

    output.choices

    List

    模型为输入生成的完成选项列表。

    "choices": [

    {

    "finish_reason": null,

    "message": {

    "role": "assistant",

    "content": [

    {

    "text": "这是一个"

    }

    ]

    }

    }

    ]

    output.choices[x].message.role

    String

    信息来源。

    output.choices[x].message.content

    List

    本次请求的算法输出内容,输出可能包含多种模态内容,因此,是一个list,元素为dict,key为内容类型,value为内容值。

    usage

    dict

    计量信息,表示本次请求计量数据。

    usage.input_tokens

    int

    用户输入文本转换成Token后的长度。

    usage.output_tokens

    int

    模型生成回复转换为Token后的长度。

HTTP调用接口

功能描述

通义千问Audio模型同时支持 HTTP 调用来完成客户的响应,目前提供普通 HTTP 和 HTTP SSE 两种协议,您可根据自己的需求自行选择。

前提条件

  • 已开通服务并获得API-KEY:获取API-KEY

  • 我们推荐您将API-KEY配置到环境变量中以降低API-KEY的泄漏风险,详情可参考配置API-KEY到环境变量。您也可以在代码中配置API-KEY,但是泄漏风险会提高。

提交接口调用

POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation

入参描述

传参方式

字段

类型

必选

描述

示例值

Header

Content-Type

String

请求类型:application/json 或者text/event-stream(开启 SSE 响应)

"Content-Type":"application/json"

Authorization

String

API-Key,例如:Bearer d1**2a

"Authorization":"Bearer d1**2a"

X-DashScope-SSE

String

跟Accept: text/event-stream 二选一即可启用SSE响应

"X-DashScope-SSE":"enable"

Body

model

String

指明需要调用的模型

"model":"qwen2-audio-instruct"

input.messages[list]

Array

多模态场景下的输入信息

"messages":[

{

"role": "user",

"content": [

{"audio": "http://XXXX"},

{"text": "这段音频在说什么?"}

]

}]

input.message[x].role

String

信息来源

input.message[x].content[list]

Array

contents 列表中包含本次输入的内容列表,每一个列表可以分别是音频(audio)或者文本(text)

input.message[x].contents[list].audio

String

至少包含一项

本次输入的音频内容的 URL 链接;音频格式目前支持:amr, wav(CodecID: GSM_MS), wav(PCM), 3gp, 3gpp, aac, mp3 等等。

input.message[x].contents[list].text

String

本次输入的文本内容;支持 utf-8 编码的中文、英文输入。

parameters.top_p

Float

生成时,核采样方法的概率阈值。例如,取值为0.8时,仅保留累计概率之和大于等于0.8的概率分布中的token,作为随机采样的候选集。取值范围为(0,1.0),取值越大,生成的随机性越高;取值越低,生成的随机性越低。默认值 0.8。注意,取值不要大于等于1

"parameters":{"top_p":0.8}

parameters.top_k

Integer

生成时,采样候选集的大小。例如,取值为50时,仅将单次生成中得分最高的50个token组成随机采样的候选集。取值越大,生成的随机性越高;取值越小,生成的确定性越高。注意:如果top_k的值大于100,top_k将采用默认值100

"parameters":{"top_k":50}

parameters.max_tokens

integer

指定模型可生成的最大token个数。例如模型最大输出长度为2k,您可以设置为1k,防止模型输出过长的内容。

不同的模型有不同的输出上限,例如qwen-max输出上限为2k,qwen-plus输出上限为8k。

"parameters":{"max_tokens":1500}

parameters.seed

Integer

生成时,随机数的种子,用于控制模型生成的随机性。如果使用相同的种子,每次运行生成的结果都将相同;当需要复现模型的生成结果时,可以使用相同的种子。seed参数支持无符号64位整数类型。默认值 1234

"parameters":{"seed":65535}

parameters.incremental_output

Bool

是否使用增量输出。当使用增量输出时每次流式返回的序列仅包含最新生成的增量内容,默认值为false,即输出完整的全量内容

"parameters":{"incremental_output":false}

出参描述

字段

类型

描述

示例值

output.choices[list]

Array

模型生成的完成选项列表。

"choices": [

{

"finish_reason": null,

"message": {

"role": "assistant",

"content": [

{

"text": "这是一个"

}

]

}

}

]

output.choices[x].message.role

String

信息来源。

output.choices[x].message.content

Array

本次请求的算法输出内容,为list,内容为多个dict,key为内容类型,value为内容值

output.finish_reason

String

有三种情况:正在生成时为null,生成结束时如果由于停止token导致则为stop,生成结束时如果因为生成长度过长导致则为length。

usage.output_tokens

Integer

本次请求算法输出内容的 token 数目。

380

usage.input_tokens

Integer

本次请求输入内容的 token 数目。在打开了搜索的情况下,输入的 token 数目因为还需要添加搜索相关内容支持,所以会超出客户在请求中的输入。

633

usage.audio_tokens

integer

用户输入音频转换成Token后的长度。

251

request_id

String

本次请求的系统唯一码

7574ee8f-38a3-4b1e-9280-11c33ab46e51

请求示例(SSE 关闭)

以下示例展示通过CURL命令来调用通义千问Audio模型的脚本(SSE 关闭)。

说明

如果未将API-KEY配置到环境变量中,则需要使用您的API-KEY替换示例中的 $DASHSCOPE_API_KEY,代码才能正常运行。

curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header 'Authorization: Bearer $DASHSCOPE_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
    "model": "qwen2-audio-instruct",
    "input":{
        "messages":[
            {
                "role": "system",
                "content": [
                    {"text": "You are a helpful assistant."}
                ]
            },
            {
                "role": "user",
                "content": [
                    {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
                    {"text": "这段音频在说什么?"}
                ]
            }
        ]
    },
    "parameters": {
    }
}'

响应示例(SSE关闭)

{
    "output": {
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "text": "这段音频在说中文:\"欢迎使用阿里云\"。"
                        }
                    ]
                }
            }
        ]
    },
    "usage": {
        "output_tokens": 19,
        "input_tokens": 1279,
        "audio_tokens": 768
    },
    "request_id": "b042e72d-7994-97dd-b3d2-7ee7e0140525"
}

请求示例(SSE开启

以下示例展示通过CURL命令来调用通义千问Audio模型的脚本(SSE 开启)。

说明

如果未将API-KEY配置到环境变量中,则需要使用您的API-KEY替换示例中的 $DASHSCOPE_API_KEY,代码才能正常运行。

curl --location 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
--header 'Authorization: Bearer $DASHSCOPE_API_KEY' \
--header 'Content-Type: application/json' \
--header 'X-DashScope-SSE: enable' \
--data '{
    "model": "qwen2-audio-instruct",
    "input":{
        "messages":[
            {
                "role": "system",
                "content": [
                    {"text": "You are a helpful assistant."}
                ]
            },
            {
                "role": "user",
                "content": [
                    {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
                    {"text": "这段音频在说什么?"}
                ]
            }
        ]
    },
    "parameters": {
    }
}'

响应示例(SSE开启

id:1
event:result
data:{"output":{"choices":[{"finish_reason":"null", "message":{"role":"assistant","content":"这段"}}]},"usage":{"output_tokens":3,"input_tokens":85,"audio_tokens": 76},"request_id":"1117fb64-5dd9-9df0-a5ca-d7ee0e97032d"}

id:2
event:result
data:{"output":{"choices":[{"finish_reason":"null", "message":{"role":"assistant","content":"这段音频"}}]},"usage":{"output_tokens":6,"input_tokens":85,"audio_tokens": 76},"request_id":"1117fb64-5dd9-9df0-a5ca-d7ee0e97032d"}

... ... ... ...
... ... ... ...

id:8
event:result
data:{"output":{"choices":[{"finish_reason":"stop", "message":{"role":"assistant","content":"这段音频在说中文:\"欢迎使用阿里云\"。"}}]},"usage":{"output_tokens":68,"input_tokens":85,"audio_tokens": 76},"request_id":"1117fb64-5dd9-9df0-a5ca-d7ee0e97032d"}

异常响应示例

在访问请求出错的情况下,输出的结果中会通过 code 和 message 指明出错原因。

{
    "code":"InvalidApiKey",
    "message":"Invalid API-key provided.",
    "request_id":"fb53c4ec-1c12-4fc4-a580-cdb7c3261fc1"
}

状态码说明

通用状态码详情,请参见状态码说明