通义千问Audio是阿里云研发的大规模音频语言模型,能够接受多种音频(包括说话人语音、自然声音、音乐、歌声)和文本作为输入,并输出文本。通义千问Audio不仅能对输入的音频进行转录,还具备更深层次的语义理解、情感分析、音频事件检测、语音聊天等能力。
功能介绍
识别多种音频
示例场景
| 语音翻译 | 音频问答 | ||
| 输入 | 
 | 输入 | 
 | 
| 输出 | 
 | 输出 | 
 | 
| 基于音频进行创作 | 语音聊天 | ||
| 输入 | 
 | 输入 | |
| 输出 | 输出 | 
 | |
支持的模型
建议优先使用qwen-audio-turbo-latest模型,它是目前最新、能力最强的模型。
商业版模型
| 模型名称 | 版本 | 上下文长度 | 最大输入 | 最大输出 | 输入成本 | 输出成本 | 免费额度 | 
| (Token数) | (每千Token) | ||||||
| qwen-audio-turbo 当前等同qwen-audio-turbo-2024-08-07 | 稳定版 | 8,000 | 6,000 | 1,500 | 目前仅供免费体验。 免费额度用完后不可调用,推荐使用Qwen-Omni作为替代模型 | 10万Token 有效期:阿里云百炼开通后90天内 | |
| qwen-audio-turbo-latest 始终等同最新快照版 | 最新版 | 8,192 | 6,144 | 2,048 | |||
| qwen-audio-turbo-2024-12-04 又称qwen-audio-turbo-1204 较上个快照版本大幅提升语音识别准确率,且新增了语音聊天能力。 | 快照版 | ||||||
| qwen-audio-turbo-2024-08-07 又称qwen-audio-turbo-0807 | 8,000 | 6,000 | 1,500 | ||||
开源版模型
| 模型名称 | 上下文长度 | 最大输入 | 最大输出 | 输入成本 | 输出成本 | 免费额度 | 
| (Token数) | (每千Token) | |||||
| qwen2-audio-instruct 相比qwen-audio-chat提升了音频理解能力,且新增了语音聊天能力。 | 8,000 | 6,000 | 1,500 | 目前仅供免费体验。 免费额度用完后不可调用,推荐使用Qwen-Omni作为替代模型 | 10万Token 有效期:阿里云百炼开通后90天内 | |
| qwen-audio-chat | ||||||
音频转换为Token的规则:每一秒钟的音频对应25个Token。若音频时长不足1秒,则按25个Token计算。
开始使用
前提条件
- 您需要已获取API Key并配置API Key到环境变量。如果通过DashScope SDK进行调用,需要安装最新版SDK。 
- 如果在子业务空间内操作,确保该子业务空间已被授予模型调用权限。 
通义千问Audio模型仅支持通过API调用,暂不支持在阿里云百炼的控制台在线体验。
快速开始
以下是理解在线音频(通过URL指定,非本地音频)的示例代码。了解如何传入本地文件和音频文件的限制。
Python
import dashscope
messages = [
    {
        "role": "user",
        "content": [
            {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
            {"text": "这段音频在说什么?"}
        ]
    }
]
response = dashscope.MultiModalConversation.call(
    model="qwen-audio-turbo-latest", 
    messages=messages,
    result_format="message"
    )
print("输出结果为:")
print(response["output"]["choices"][0]["message"].content[0]["text"])
响应示例
输出结果为:
这段音频说的是:'欢迎使用阿里云'Java
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;
import com.alibaba.dashscope.utils.JsonUtils;
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("qwen-audio-turbo-latest")
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println("输出结果为:\n" + result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}响应示例
输出结果为:
这段音频说的是:'欢迎使用阿里云'curl
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen-audio-turbo-latest",
    "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": "这段音频在说什么?"}
                ]
            }
        ]
    }
}'响应示例
{
    "output": {
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "text": "这段音频说的是:'欢迎使用阿里云'"
                        }
                    ]
                }
            }
        ]
    },
    "usage": {
        "audio_tokens": 85,
        "output_tokens": 10,
        "input_tokens": 33
    },
    "request_id": "1341c517-71bf-94f5-862a-18fbddb332e9"
}多轮对话
通义千问Audio模型可以参考历史对话信息进行回复。您需要维护一个messages 数组,将每一轮的对话历史以及新的指令添加到 messages 数组中。
Python
from dashscope import MultiModalConversation
messages = [
    {
        "role": "user",
        "content": [
            {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
            {"text": "这段音频在说什么?"},
        ]
    }
]
response = MultiModalConversation.call(model='qwen-audio-turbo-latest', messages=messages)
print("第1次回复:", response["output"]["choices"][0]["message"].content[0]["text"]) 
# 将模型回复到messages中,并添加新的用户消息
messages.append({
    'role': response.output.choices[0].message.role,
    'content': response.output.choices[0].message.content
})
messages.append({
    "role": "user",
    "content": [
        {"text": "简单介绍这家公司。"}
    ]
})
response = MultiModalConversation.call(model='qwen-audio-turbo-latest', messages=messages)
print("第2次回复:", response["output"]["choices"][0]["message"].content[0]["text"])
响应示例
第1次回复: 这段音频说的是:'欢迎使用阿里云'
第2次回复: 音频中提到了一家公司,这家公司叫做阿里云。阿里云是阿里集团旗下的一个子公司,主要提供云计算服务。Java
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;
import com.alibaba.dashscope.utils.JsonUtils;
public class Main {
    private static final String modelName = "qwen-audio-turbo-latest";
    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.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
        // 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.println("第二轮回复:"+ result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            MultiRoundConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}
响应示例
第一轮回复:这段音频说的是:'欢迎使用阿里云'
第二轮回复:音频中提到了一家公司,这家公司叫做阿里云。阿里云是阿里集团旗下的一个子公司,主要提供云计算服务。curl
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen-audio-turbo-latest",
    "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": "这段音频在说什么?"}
                ]
            },
            {
                "role": "assistant",
                "content": [
                    {"text": "这段音频说的是:'欢迎使用阿里云'"}
                ]
            },
            {
                "role": "user",
                "content": [
                    {"text": "介绍一下这家公司。"}
                ]
            }
        ]
    }
}'响应示例
{
    "output": {
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "text": "阿里巴巴集团是一家总部位于中国杭州的全球领先的电子商务和科技公司,成立于1999年。阿里巴巴集团旗下拥有包括淘宝、天猫、支付宝、菜鸟网络等在内的多个知名业务,旗下员工数量超过10万人,业务覆盖了全球200多个国家和地区。\n\n阿里巴巴的愿景是让世界各地的企业都能够平等地进行贸易,让小企业通过数字化技术实现更好的发展。阿里巴巴秉持开放、合作、共赢的理念,致力于打造一个开放、包容、公平的数字经济生态系统,为全球数字经济的发展做出贡献。\n\n除了电子商务和科技业务外,阿里巴巴还涉足云计算、数字娱乐、金融等多个领域,不断壮大和发展自己的业务版图。阿里巴巴在全球范围内开展业务,旨在通过科技创新和优质的服务,推动全球经济的可持续发展。"
                        }
                    ]
                }
            }
        ]
    },
    "usage": {
        "audio_tokens": 85,
        "output_tokens": 156,
        "input_tokens": 55
    },
    "request_id": "9621b9e4-9933-9e2d-a7a8-ad02305a009c"
}流式输出
大模型接收到输入后,会逐步生成中间结果,最终结果由这些中间结果拼接而成。这种一边生成一边输出中间结果的方式称为流式输出。采用流式输出时,您可以在模型进行输出的同时阅读,减少等待模型回复的时间。根据不同的调用方式,您可以设置相应的参数来实现流式输出:
- Python SDK方式:设置 - stream参数为True。
- Java SDK方式:需要通过 - streamCall接口调用。
- HTTP方式:需要在Header中指定 - X-DashScope-SSE为- enable。
流式输出的内容默认是非增量式(即每次返回的内容都包含之前生成的内容),如果您需要使用增量式流式输出,请设置incremental_output(Java 为incrementalOutput)参数为true。
Python
import dashscope
messages = [
    {
        "role": "user",
        "content": [
            {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
            {"text": "这段音频在说什么?"}
        ]
    }
]
response = dashscope.MultiModalConversation.call(
    model="qwen-audio-turbo-latest", 
    messages=messages,
    stream=True,
    incremental_output=True,
    result_format="message"
    )
full_content = ""
print("流式输出内容为:")
for response in response:
    if response["output"]["choices"][0]["message"].content:
        print(response["output"]["choices"][0]["message"].content[0]["text"])
        full_content += response["output"]["choices"][0]["message"].content[0]["text"]
print(f"完整内容为:{full_content}")响应示例
流式输出内容为:
这段
音频
说的是
:'
欢迎
使用
阿里
云
'Java
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();
        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("qwen-audio-turbo-latest")
                .message(userMessage)
                .incrementalOutput(true)
                .build();
        Flowable<MultiModalConversationResult> result = conv.streamCall(param);
        result.blockingForEach(item -> {
            try {
                var content = item.getOutput().getChoices().get(0).getMessage().getContent();
                // 判断content是否存在且不为空
                if (content != null &&  !content.isEmpty()) {
                    System.out.println(content.get(0).get("text"));
                }
            } catch (Exception e){
                System.exit(0);
            }
        });
    }
    public static void main(String[] args) {
        try {
            streamCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}响应示例
这段
音频
说的是
:'
欢迎
使用
阿里
云
'curl
curl -X POST 'https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation' \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-H 'X-DashScope-SSE: enable' \
-d '{
    "model": "qwen-audio-turbo-latest",
    "input":{
        "messages":[
            {
                "role": "user",
                "content": [
                    {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"}
                ]
            }
        ]
    },
    "parameters": {
      "incremental_output": true
    }
}'响应示例
id:1
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"这段"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"audio_tokens":85,"input_tokens":33,"output_tokens":1},"request_id":"1f297a6c-f8b1-90c4-8b64-3d70796a78f1"}
id:2
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"音频"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"audio_tokens":85,"input_tokens":33,"output_tokens":2},"request_id":"1f297a6c-f8b1-90c4-8b64-3d70796a78f1"}
......
id:10
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[],"role":"assistant"},"finish_reason":"null"}]},"usage":{"audio_tokens":85,"input_tokens":33,"output_tokens":8},"request_id":"1f297a6c-f8b1-90c4-8b64-3d70796a78f1"}
id:11
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[{"text":"'"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"audio_tokens":85,"input_tokens":33,"output_tokens":10},"request_id":"1f297a6c-f8b1-90c4-8b64-3d70796a78f1"}
id:12
event:result
:HTTP_STATUS/200
data:{"output":{"choices":[{"message":{"content":[],"role":"assistant"},"finish_reason":"stop"}]},"usage":{"audio_tokens":85,"input_tokens":33,"output_tokens":10},"request_id":"1f297a6c-f8b1-90c4-8b64-3d70796a78f1"}
语音对话
您可以直接用语音向模型发出指令,无需输入文本指令。例如:如果音频中包含内容“这种环境下适合做什么”,模型会回复适合做的事情,而不是返回这段语音的文本。
目前qwen-audio-turbo-latest、qwen-audio-turbo-2024-12-04、qwen2-audio-instruct模型支持语音聊天。
Python
import dashscope
messages = [
    {
        "role": "user",
        "content": [
            {"audio": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/kvkadk/%E6%8E%A8%E8%8D%90%E4%B9%A6.wav"}
        ]
    }
]
response = dashscope.MultiModalConversation.call(model='qwen-audio-turbo-latest', messages=messages)
print("输出结果为:")
print(response["output"]["choices"][0]["message"].content[0]["text"])响应示例
输出结果为:
当然可以,文学类的书籍种类繁多,根据你的兴趣和偏好,我可以给你一些建议。你喜欢哪种类型的文学作品呢?比如是 现代文学、古典文学、科幻小说、历史小说、诗歌、散文等等。Java
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;
import com.alibaba.dashscope.utils.JsonUtils;
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://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/kvkadk/%E6%8E%A8%E8%8D%90%E4%B9%A6.wav")))
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model("qwen-audio-turbo-latest")
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println("输出结果为:\n" + result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            simpleMultiModalConversationCall();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}响应示例
输出结果为:
当然可以,文学类的书籍种类繁多,根据你的兴趣和偏好,我可以给你一些建议。你喜欢哪种类型的文学作品呢?比如是 现代文学、古典文学、科幻小说、历史小说、侦探小说、小说、诗歌、散文、戏剧等等。curl
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen-audio-turbo-latest",
    "input":{
        "messages":[
            {
                "role": "system",
                "content": [
                    {"text": "You are a helpful assistant."}
                ]
            },
            {
                "role": "user",
                "content": [
                    {"audio": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20240916/kvkadk/%E6%8E%A8%E8%8D%90%E4%B9%A6.wav"}                ]
            }
        ]
    }
}'响应示例
{
    "output": {
        "choices": [
            {
                "finish_reason": "stop",
                "message": {
                    "role": "assistant",
                    "content": [
                        {
                            "text": "当然可以,不过需要先了解你的兴趣方向。你更喜欢哪种类型的文学作品呢?比如小说、散文、诗歌等。"
                        }
                    ]
                }
            }
        ]
    },
    "usage": {
        "audio_tokens": 237,
        "output_tokens": 29,
        "input_tokens": 28
    },
    "request_id": "ae407255-2fed-9e5a-90e6-6dab3178e913"
}传入本地文件(Base64 编码或文件路径)
通义千问 Audio 提供两种本地文件上传方式:
- Base64 编码上传 
- 文件路径直接上传(传输更稳定,推荐方式) 
上传方式:
文件路径传入
直接向模型传入文件路径。仅 DashScope Python 和 Java SDK 支持,不支持 HTTP 方式。请您参考下表,结合您的编程语言与操作系统指定文件的路径。
Base64 编码传入
Base64 编码,将文件转换为 Base64 编码字符串,再传入模型。
使用限制:
- 建议优先选择文件路径上传(稳定性更高),1MB以下的文件也可使用 Base64 编码; 
- 直接传入文件路径时,音频本身需小于 10MB; 
- Base64编码方式传入时,由于 Base64 编码会增加数据体积,需保证编码后的 Base64 字符串需小于 10MB。 
如需压缩文件体积请参考如何压缩音频文件到满足要求的大小?
文件路径传入
传入文件路径仅支持 DashScope Python 和 Java SDK方式调用,不支持 HTTP 方式。
Python
from dashscope import MultiModalConversation
# 将 ABSOLUTE_PATH/welcome.mp3 替换为本地音频的绝对路径,
# 本地文件的完整路径必须以 file:// 为前缀,以保证路径的合法性,例如:file:///home/images/test.mp3
audio_file_path = "file://ABSOLUTE_PATH/welcome.mp3"
messages = [
    {
        "role": "system", 
        "content": [{"text": "You are a helpful assistant."}]},
    {
        "role": "user",
        # 在 audio 参数中传入以 file:// 为前缀的文件路径
        "content": [{"audio": audio_file_path}, {"text": "音频里在说什么?"}],
    }
]
response = MultiModalConversation.call(model="qwen-audio-turbo-latest", messages=messages)
print("输出结果为:")
print(response["output"]["choices"][0]["message"].content[0]["text"])
响应示例
输出结果为:
这段音频说的是:'欢迎使用阿里云'。Java
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 com.alibaba.dashscope.utils.JsonUtils;
public class Main {
    public static void callWithLocalFile()
            throws ApiException, NoApiKeyException, UploadFileException {
            
        // 请将 ABSOLUTE_PATH/welcome.mp3 替换为本地音频文件的绝对路径
        // 本地文件的完整路径必须以 file:// 为前缀,以保证路径的合法性,例如:file:///home/images/test.mp3
        // 当前测试系统为macOS。如果您使用Windows系统,请用"file:///ABSOLUTE_PATH/welcome.mp3"代替
        
        String localFilePath = "file://ABSOLUTE_PATH/welcome.mp3";
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                .content(Arrays.asList(new HashMap<String, Object>(){{put("audio", localFilePath);}},
                        new HashMap<String, Object>(){{put("text", "音频里在说什么?");}}))
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model("qwen-audio-turbo-latest")
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println("输出结果为:\n" + result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            callWithLocalFile();
        } catch (ApiException | NoApiKeyException | UploadFileException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}响应示例
输出结果为:
音频中说的是:'欢迎使用阿里云'Base64 编码传入
Python
import os
import base64
from dashscope import MultiModalConversation
# 编码函数: 将本地文件转换为 Base64 编码的字符串
def encode_audio(audio_file_path):
    with open(audio_file_path, "rb") as audio_file:
        return base64.b64encode(audio_file.read()).decode("utf-8")
# 请将 ABSOLUTE_PATH/welcome.mp3 替换为本地音频的绝对路径 
audio_file_path = "ABSOLUTE_PATH/welcome.mp3"
base64_audio = encode_audio(audio_file_path)
messages = [
    {
        "role": "system",
        "content": [{"text": "You are a helpful assistant."}]},
    {
        "role": "user",
        # 以 Base64 编码方式传入本地文件时,必须要以data:为前缀,以保证文件 URL 的合法性。
        # 在 Base64 编码数据(base64_audio)前需要包含"base64",否则也会报错。
        "content": [{"audio":f"data:;base64,{base64_audio}"},
                    {"text": "音频里在说什么? "}],
    }
]
response = MultiModalConversation.call(model="qwen2-audio-instruct",
                                       messages=messages,
                                       api_key=os.getenv("DASHSCOPE_API_KEY"))
print(response.output.choices[0].message.content[0])响应示例
输出结果为:
这段音频说的是:'欢迎使用阿里云'。Java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Base64;
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;
public class Main {
    private static String encodeAudioToBase64(String audioPath) throws IOException {
        Path path = Paths.get(audioPath);
        byte[] audioBytes = Files.readAllBytes(path);
        return Base64.getEncoder().encodeToString(audioBytes);
    }
    
    public static void callWithLocalFile()
            throws ApiException, NoApiKeyException, UploadFileException,IOException{
        // 请将 ABSOLUTE_PATH/welcome.mp3 替换为本地文件的实际路径
        String localFilePath = "ABSOLUTE_PATH/welcome.mp3";
        String base64Audio = encodeAudioToBase64(localFilePath);
        MultiModalConversation conv = new MultiModalConversation();
        MultiModalMessage userMessage = MultiModalMessage.builder().role(Role.USER.getValue())
                 // 以 Base64 编码方式传入本地文件时,必须要以data:为前缀,以保证文件 URL 的合法性。
                 // 在 Base64 编码数据(base64_audio)前需要包含"base64",否则也会报错。
                .content(Arrays.asList(new HashMap<String, Object>(){{put("audio", "data:;base64," + base64Audio);}},
                        new HashMap<String, Object>(){{put("text", "音频里在说什么?");}}))
                .build();
        MultiModalConversationParam param = MultiModalConversationParam.builder()
                .model("qwen-audio-turbo-latest")
                // 若没有配置环境变量,请用百炼API Key将下行替换为:.apiKey("sk-xxx")
                .apiKey(System.getenv("DASHSCOPE_API_KEY")) 
                .message(userMessage)
                .build();
        MultiModalConversationResult result = conv.call(param);
        System.out.println("输出结果为:\n" + result.getOutput().getChoices().get(0).getMessage().getContent().get(0).get("text"));
    }
    public static void main(String[] args) {
        try {
            callWithLocalFile();
        } catch (ApiException | NoApiKeyException | UploadFileException | IOException e) {
            System.out.println(e.getMessage());
        }
        System.exit(0);
    }
}响应示例
输出结果为:
音频中说的是:'欢迎使用阿里云'curl
- 将文件转换为 Base64 编码的字符串的方法可参见示例代码; 
- 为了便于展示,代码中的 - "data:;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5....",该Base64 编码字符串是截断的。在实际使用中,请务必传入完整的编码字符串。
curl -X POST https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation \
-H "Authorization: Bearer $DASHSCOPE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
    "model": "qwen-audio-turbo-latest",
    "input":{
        "messages":[
            {
                "role": "system",
                "content": [
                    {"text": "You are a helpful assistant."}
                ]
            },
            {
                "role": "user",
                "content": [
                    {"audio": "data:;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjI5...."},
                    {"text": "这段音频在说什么?"}
                ]
            }
        ]
    }
}'使用限制
支持的音频文件
- 音频文件大小不超过10 MB。如果传入Base64编码的音频,需确保编码后 Base64 字符串小于10MB,详情请参见传入本地文件。如需压缩文件请参见如何压缩音频文件到满足要求的大小? 
- 音频的时长建议不超过30秒,如果超过30秒,模型会自动截取前30秒的音频。 
- 音频文件的格式支持大部分常见编码的音频格式,例如AMR、WAV(CodecID: GSM_MS)、WAV(PCM)、3GP、3GPP、AAC、MP3等。 
- 支持识别的语言包括中文、英语、粤语、法语、意大利语、西班牙语、德语和日语。 
音频文件输入方式
- 音频文件的URL:需确保URL可被公网访问。 说明- 您可以将音频文件上传到OSS,获取公网URL。 - 如果要传入的是OSS中读写权限为私有的文件,可使用外网endpoint生成签名URL。该URL允许他人临时访问文件,具体请参见使用预签名URL下载或预览文件。 
- 由于OSS内网与百炼服务不互通,请勿使用OSS内网URL。 
 
- 您也可以将音频文件上传到阿里云百炼的免费临时存储空间,获取公网 URL(有效期为 48 小时)。 
 
- 本地音频文件:传入 Base64 编码数据或直接传入本地文件的路径。 
API参考
关于通义千问Audio 模型的输入输出参数,请参见通义千问。
错误码
如果模型调用失败并返回报错信息,请参见错误信息进行解决。