录音文件识别

更新时间:2025-04-15 09:59:33

录音文件识别(也称为录音文件转写)是指对音视频文件进行语音识别,将语音转换为文本。支持单个文件识别和批量文件识别,适用于处理不需要即时返回结果的场景。

应用场景

  • 会议、课堂录音记录:将录音文件转成文字,方便后期快速进行信息检索、分析和整理重点内容。

  • 客服电话分析:自动记录并分析客户电话,快速理解客户需求,自动分类服务请求,甚至识别客户情绪,从而提升服务质量与效率。

  • 字幕生成:帮助媒体制作与后期编辑人员识别音视频材料并生成对应的字幕,加速后期制作的流程。

  • 市场研究与数据分析:将市场调研中收集到的消费者访谈、焦点小组讨论等录音数据,通过识别模型进行分析,提取消费者意见、偏好等信息,为企业决策提供支持。

支持的模型

通义千问ASR

通义千问ASR基于Qwen-Audio训练的专用于语音识别的模型,支持中英文识别。目前为Beta版本。

通义千问Audio模型按输入和输出的总Token数进行计费。

音频转换为Token的规则:每一秒钟的音频对应25Token。若音频时长不足1秒,则按25Token计算。

虽然通义千问ASR基于Qwen-Audio进行训练,但它不支持多轮对话和自定义的System PromptUser Prompt。

模型名称

版本

支持的语言

支持的格式

支持的采样率

上下文长度

最大输入

最大输出

输入成本

输出成本

免费额度

(注)

(Token数)

(每千Token)

qwen-audio-asr

当前等同qwen-audio-asr-2024-12-04

稳定版

中文、英文

音频

16kHz

8,192

6,144

2,048

目前仅供免费体验。

免费额度用完后不可调用,敬请关注后续动态。

10Token

有效期:百炼开通后180天内

qwen-audio-asr-latest

始终等同最新快照版

最新版

qwen-audio-asr-2024-12-04 

快照版

Paraformer

Paraformer基于通义实验室新一代非自回归端到端模型,大幅提高语音识别精度和准确率,目前有多个模型版本,越新的版本(版本号越大越新)效果越好。

模型名称

支持的语言

支持的采样率

适用场景

支持的音频格式

单价

免费额度

paraformer-v2

中文普通话、中文方言(粤语、吴语、闽南语、东北话、甘肃话、贵州话、河南话、湖北话、湖南话、宁夏话、山西话、陕西话、山东话、四川话、天津话、江西话、云南话、上海话)、英语、日语、韩语、德语、法语、俄语

任意

视频直播

aac、amr、avi、flac、flv、m4a、mkv、mov、mp3、mp4、mpeg、ogg、opus、wav、webm、wma、wmv

0.00008元/秒

36,000秒(10小时)

每月10点自动发放

有效期1个月

paraformer-8k-v2

中文普通话

8kHz

电话语音

paraformer-v1

中文普通话、英语

任意

音频或视频

paraformer-8k-v1

中文普通话

8kHz

电话语音

paraformer-mtl-v1

中文普通话、中文方言(粤语、吴语、闽南语、东北话、甘肃话、贵州话、河南话、湖北话、湖南话、宁夏话、山西话、陕西话、山东话、四川话、天津话)、英语、日语、韩语、西班牙语、印尼语、法语、德语、意大利语、马来语

16kHz及以上

音频或视频

SenseVoice

SenseVoice语音识别大模型专注于高精度多语言语音识别、情感辨识和音频事件检测,支持超过50种语言的识别,中文与粤语识别准确率相对提升在50%以上。

模型名称

支持的语言

支持的格式

单价

免费额度

sensevoice-v1

超过50种语言(中、英、日、韩、粤等)

附录:支持语言列表

音频或视频:aac、amr、avi、flac、flv、m4a、mkv、mov、mp3、mp4、mpeg、ogg、opus、wav、webm、wma、wmv

0.0007 元/秒

36,000秒(10小时)

每月10点自动发放

有效期1个月

模型选型建议

  1. 语种支持

    • 对于中文(普通话)、英语,建议优先选择通义千问ASRParaformer(最新版Paraformer-v2)模型以获得更优效果。

    • 对于中文(方言)、粤语、日语、韩语、西班牙语、印尼语、法语、德语、意大利语、马来语,建议优先选择Paraformer模型。特别是最新版Paraformer-v2模型,它支持指定语种,包括中文(含普通话和多种方言)、粤语、英语、日语、韩语。指定语种后,系统能够集中算法资源和语言模型于该特定语种,避免了在多种可能的语种中进行猜测和切换,从而减少了误识别的概率。

    • 对于其他语言(俄语、泰语等),请选择SenseVoice,具体请参见语言列表

  2. 文件读取方式:Paraformer、SenseVoice和通义千问ASR模型均支持读取录音文件的URL,如果需要读取本地录音文件,请选择通义千问ASR模型。

  3. 热词定制:如果您的业务领域中,有部分专有名词和行业术语识别效果不够好,您可以定制热词,将这些词添加到词表从而改善识别结果。如需使用热词功能,请选择Paraformer模型。关于热词的更多信息,Paraformer v1系列模型请参见Paraformer语音识别热词定制与管理,Paraformer v2及更高版本模型请参见定制热词

  4. 时间戳:如果您需要在获取识别结果的同时获取时间戳,请选择Paraformer或者SenseVoice模型。

  5. 情感和事件识别:如果需要情感识别能力(包括高兴<HAPPY>、伤心<SAD>、生气<ANGRY>和中性<NEUTRAL>)和4种常见音频事件识别(包括背景音乐<BGM>、说话声<Speech>、掌声<Applause>和笑声<Laughter>),请选择SenseVoice语音识别模型。

  6. 流式输出:如果需要实现边推理边输出内容的流式输出效果,请选择通义千问ASR模型。

说明

通义千问ASR模型目前为Beta版本,对于更多语言的识别(如韩语、日语、泰语、西班牙语等,以及吴语、粤语、闽南语方言)、标点符号预测、热词定制、敏感词过滤等功能将在后续版本中陆续支持。

点击查看模型功能特性对比

通义千问ASR录音文件识别

Paraformer录音文件识别

SenseVoice录音文件识别

接入方式

Java、Python、RESTful

Java、Python、RESTful

定制热词

不支持

支持

不支持

情感和事件识别

不支持

不支持

支持,可识别如下四种情绪和四种常见音频事件

  • 四种情绪:生气(ANGRY)、高兴(HAPPY)、伤心(SAD)和中性(NEUTRAL)

  • 四种常见的音频事件:掌声(Applause)、背景音乐(BGM)、笑声(Laughter)和说话声(Speech)

敏感词过滤

不支持

支持

不支持

语气词过滤

不支持

支持

不支持

自动说话人分离

不支持

支持

不支持

说话人数量参考

不支持

支持

不支持

时间戳

不支持

支持

支持

流式输入

不支持

不支持

不支持

流式输出

支持

不支持

不支持

识别本地文件

支持

不支持,仅支持传入公网可访问的待识别文件URL

不支持,仅支持传入公网可访问的待识别文件URL

标点符号预测

不支持

支持

支持

待识别音频格式

da、 wave( *.wav)、 mp3、wav、aac、flac、ogg、aiff、 au、 mp3、 midi、 wma、 realaudio、 vqf、 oggvorbis、aac、 ape

aac、amr、avi、flac、flv、m4a、mkv、mov、mp3、mp4、mpeg、ogg、opus、wav、webm、wma、wmv

aac、amr、avi、flac、flv、m4a、mkv、mov、mp3、mp4、mpeg、ogg、opus、wav、webm、wma、wmv

待识别音频声道

单声道

不限

不限

待识别音频采样率

16kHz

因模型而异:

  • paraformer-v2 支持任意采样率

  • paraformer-v1 支持任意采样率

  • paraformer-8k-v2 仅支持8kHz采样率

  • paraformer-8k-v1 仅支持8kHz采样率

  • paraformer-mtl-v1 支持16kHz及以上采样率

任意

待识别音频大小

10MB以内

单次识别最多能指定100个文件URL,每个URL对应的录音文件大小应小于等于2GB,详见实时语音识别

单次识别最多能指定100个文件URL,每个URL对应的录音文件大小应小于等于2GB,详见实时语音识别

语言

中文、英文

因模型而异:

  • paraformer-v2:

    • 中文,包含中文普通话和各种方言:上海话、吴语、闽南语、东北话、甘肃话、贵州话、河南话、湖北话、湖南话、江西话、宁夏话、山西话、陕西话、山东话、四川话、天津话、云南话、粤语

    • 英文

    • 日语

    • 韩语

    • 德语

    • 法语

    • 俄语

  • paraformer-8k-v2 仅支持中文

  • paraformer-v1 仅支持中英文

  • paraformer-8k-v1 仅支持中文

  • paraformer-mtl-v1:中文普通话、中文方言(粤语、吴语、闽南语、东北话、甘肃话、贵州话、河南话、湖北话、湖南话、宁夏话、山西话、陕西话、山东话、四川话、天津话)、英语、日语、韩语、西班牙语、印尼语、法语、德语、意大利语、马来语。

  • 重点语言:中文、英文、粤语、日语、韩语、俄语、法语、意大利语、德语、西班牙语

  • 更多语言:加泰罗尼亚语、印度尼西亚语、泰语、荷兰语、葡萄牙语、捷克语、波兰语等,详情请参见语言列表

单价

限时免费体验

0.288元/小时

2.52元/小时

免费额度

百炼开通180天内,10Token

10小时/月

10小时/月

    快速开始

    您可以先进行在线体验:请在语音模型页面选择“Paraformer语音识别-v2”模型,单击立即体验

    下面是调用API的示例代码。

    您需要已获取API Key配置API Key到环境变量。如果通过SDK调用,还需要安装DashScope SDK

    通义千问ASR
    Paraformer
    SenseVoice
    通义千问ASR模型不支持多轮对话和自定义Prompt(包括System PromptUser Prompt)。
    录音文件URL
    本地文件
    流式输出
    Python
    Java
    curl
    import dashscope
    
    messages = [
        {
            "role": "user",
            "content": [
                {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
            ]
        }
    ]
    response = dashscope.MultiModalConversation.call(
        model="qwen-audio-asr",
        messages=messages,
        result_format="message")
    print(response)
    

    完整结果以JSON格式输出到控制台。完整结果包含状态码、唯一的请求ID、识别后的内容以及本次调用的token信息。

    {
        "status_code": 200,
        "request_id": "802e87ff-1875-99cd-96c0-16a50338836a",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "text": "欢迎使用阿里云"
                            }
                        ]
                    }
                }
            ]
        },
        "usage": {
            "input_tokens": 74,
            "output_tokens": 7,
            "audio_tokens": 46
        }
    }
    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")))
                    .build();
            MultiModalConversationParam param = MultiModalConversationParam.builder()
                    .model("qwen-audio-asr")
                    .message(userMessage)
                    .build();
            MultiModalConversationResult result = conv.call(param);
            System.out.println(JsonUtils.toJson(result));
        }
        public static void main(String[] args) {
            try {
                simpleMultiModalConversationCall();
            } catch (ApiException | NoApiKeyException | UploadFileException e) {
                System.out.println(e.getMessage());
            }
            System.exit(0);
        }
    }

    完整结果以JSON格式输出到控制台。完整结果包含状态码、唯一的请求ID、识别后的内容以及本次调用的token信息。

    {
        "requestId": "9111d579-0e6f-9b78-bec5-07f01983c3b7",
        "usage": {
            "input_tokens": 74,
            "output_tokens": 7
        },
        "output": {
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "text": "欢迎使用阿里云"
                            }
                        ]
                    }
                }
            ]
        }
    }
    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-asr",
        "input":{
            "messages":[
                {
                    "role": "user",
                    "content": [
                        {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"}
                    ]
                }
            ]
        }
    }'

    完整结果以JSON格式输出到控制台。完整结果包含状态码、唯一的请求ID、识别后的内容以及本次调用的token信息。

    {
        "output": {
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "text": "欢迎使用阿里云"
                            }
                        ]
                    }
                }
            ]
        },
        "usage": {
            "audio_tokens": 46,
            "output_tokens": 7,
            "input_tokens": 74
        },
        "request_id": "4edb7418-f01d-938c-9cac-b6f3abcd0173"
    }

    使用DashScope SDK处理本地图像文件时,需要传入文件路径。请您参考下表,结合您的使用方式与操作系统进行文件路径的创建。

    系统

    SDK

    传入的文件路径

    示例

    LinuxmacOS系统

    Python SDK

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

    file:///home/images/test.png

    Java SDK

    Windows系统

    Python SDK

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

    file://D:/images/test.png

    Java SDK

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

    file:///D:images/test.png

    Python
    Java
    from dashscope import MultiModalConversation
    
    # 请用您的本地音频的绝对路径替换 ABSOLUTE_PATH/welcome.mp3
    audio_file_path = "file://ABSOLUTE_PATH/welcome.mp3"
    messages = [
        {
            "role": "user",
            "content": [{"audio": audio_file_path}],
        }
    ]
    
    response = MultiModalConversation.call(model="qwen-audio-asr", messages=messages)
    print(response)
    

    完整结果以JSON格式输出到控制台。完整结果包含状态码、唯一的请求ID、识别后的内容以及本次调用的token信息。

    {
        "status_code": 200,
        "request_id": "6cd77dbd-fa2a-9167-94dc-9a395815beaa",
        "code": "",
        "message": "",
        "output": {
            "text": null,
            "finish_reason": null,
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "text": "欢迎使用阿里云"
                            }
                        ]
                    }
                }
            ]
        },
        "usage": {
            "input_tokens": 74,
            "output_tokens": 7,
            "audio_tokens": 46
        }
    }
    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
            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);}}
                    ))
                    .build();
            MultiModalConversationParam param = MultiModalConversationParam.builder()
                    .model("qwen-audio-asr")
                    .message(userMessage)
                    .build();
            MultiModalConversationResult result = conv.call(param);
            System.out.println(JsonUtils.toJson(result));
        }
        public static void main(String[] args) {
            try {
                callWithLocalFile();
            } catch (ApiException | NoApiKeyException | UploadFileException e) {
                System.out.println(e.getMessage());
            }
            System.exit(0);
        }
    }
    

    完整结果以JSON格式输出到控制台。完整结果包含状态码、唯一的请求ID、识别后的内容以及本次调用的token信息。

    {
        "requestId": "ae2735b1-3393-9917-af74-d9c4929b6c0f",
        "usage": {
            "input_tokens": 74,
            "output_tokens": 7
        },
        "output": {
            "choices": [
                {
                    "finish_reason": "stop",
                    "message": {
                        "role": "assistant",
                        "content": [
                            {
                                "text": "欢迎使用阿里云"
                            }
                        ]
                    }
                }
            ]
        }
    }

    模型并不是一次性生成最终结果,而是逐步地生成中间结果,最终结果由中间结果拼接而成。使用非流式输出方式需要等待模型生成结束后再将生成的中间结果拼接后返回,而流式输出可以实时地将中间结果返回,您可以在模型进行输出的同时进行阅读,减少等待模型回复的时间。您可以根据调用方式来设置不同的参数以实现流式输出:

    • DashScope Python SDK方式:设置stream参数为true。

    • DashScope Java SDK方式:需要通过streamCall接口调用。

    • DashScope HTTP方式:需要在Header中指定X-DashScope-SSEenable

    Python
    Java
    curl
    import dashscope
    
    messages = [
        {
            "role": "user",
            "content": [
                {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"},
            ]
        }
    ]
    
    response = dashscope.MultiModalConversation.call(
        model="qwen-audio-asr",
        messages=messages,
        result_format="message",
        stream=True
        )
    full_content = ""
    print("流式输出内容为:")
    for response in response:
        try:
            print(response["output"]["choices"][0]["message"].content[0]["text"])
            full_content += response["output"]["choices"][0]["message"].content[0]["text"]
        except:
            pass
    print(f"完整内容为:{full_content}")

    识别的中间结果以字符串的形式输出到控制台上。

    流式输出内容为:
    欢迎
    使用阿里云
    完整内容为:欢迎使用阿里云   
    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");}}
                    )).build();
            MultiModalConversationParam param = MultiModalConversationParam.builder()
                    .model("qwen-audio-asr")
                    .message(userMessage)
                    .incrementalOutput(true)
                    .build();
            Flowable<MultiModalConversationResult> result = conv.streamCall(param);
            result.blockingForEach(item -> {
                try {
                    System.out.println(item.getOutput().getChoices().get(0).getMessage().getContent().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 -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-asr",
        "input":{
            "messages":[
                {
                    "role": "user",
                    "content": [
                        {"audio": "https://dashscope.oss-cn-beijing.aliyuncs.com/audios/welcome.mp3"}
                    ]
                }
            ]
        },
        "parameters": {
          "incremental_output": true
        }
    }'

    识别的中间结果会以JSON的形式输出到控制台上。

    id:1
    event:result
    :HTTP_STATUS/200
    data:{"output":{"choices":[{"message":{"content":[{"text":"欢迎"}],"role":"assistant"},"finish_reason":"null"}]},"usage":{"audio_tokens":46,"input_tokens":74,"output_tokens":4},"request_id":"74e94b68-fc16-97cc-acc3-0d6bcf5e64fe"}
    
    id:2
    event:result
    :HTTP_STATUS/200
    data:{"output":{"choices":[{"message":{"content":[{"text":"使用阿里云"}],"role":"assistant"},"finish_reason":"stop"}]},"usage":{"audio_tokens":46,"input_tokens":74,"output_tokens":7},"request_id":"74e94b68-fc16-97cc-acc3-0d6bcf5e64fe"}

    由于音视频文件的尺寸通常较大,文件传输和语音识别处理均需要时间,文件转写API通过异步调用方式来提交任务。开发者需要通过查询接口,在文件转写完成后获得语音识别结果。

    Python
    Java
    import json
    from urllib import request
    from http import HTTPStatus
    
    import dashscope
    
    # 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
    # dashscope.api_key = "apiKey"
    
    task_response = dashscope.audio.asr.Transcription.async_call(
        model='paraformer-v2',
        file_urls=[
            'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav',
            'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav'
        ],
        language_hints=['zh', 'en'])
    
    transcription_response = dashscope.audio.asr.Transcription.wait(
        task=task_response.output.task_id)
    
    if transcription_response.status_code == HTTPStatus.OK:
        for transcription in transcription_response.output['results']:
            url = transcription['transcription_url']
            result = json.loads(request.urlopen(url).read().decode('utf8'))
            print(json.dumps(result, indent=4, ensure_ascii=False))
        print('transcription done!')
    else:
        print('Error: ', transcription_response.output.message)
    import com.alibaba.dashscope.audio.asr.transcription.*;
    import com.google.gson.*;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.*;
    import java.net.HttpURLConnection;
    import java.util.Arrays;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
            // 创建转写请求参数,需要用真实apikey替换your-dashscope-api-key
            TranscriptionParam param =
                    TranscriptionParam.builder()
                            // 若没有将API Key配置到环境变量中,需将下面这行代码注释放开,并将apiKey替换为自己的API Key
                            // .apiKey("apikey")
                            .model("paraformer-v2")
                            // “language_hints”只支持paraformer-v2和paraformer-realtime-v2模型
                            .parameter("language_hints", new String[]{"zh", "en"})
                            .fileUrls(
                                    Arrays.asList(
                                            "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
                                            "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav"))
                            .build();
            try {
                Transcription transcription = new Transcription();
                // 提交转写请求
                TranscriptionResult result = transcription.asyncCall(param);
                // 等待转写完成
                System.out.println("RequestId: " + result.getRequestId());
                result = transcription.wait(
                        TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
                // 获取转写结果
                List<TranscriptionTaskResult> taskResultList = result.getResults();
                if (taskResultList != null && taskResultList.size() > 0) {
                    for (TranscriptionTaskResult taskResult : taskResultList) {
                        String transcriptionUrl = taskResult.getTranscriptionUrl();
                        HttpURLConnection connection =
                                (HttpURLConnection) new URL(transcriptionUrl).openConnection();
                        connection.setRequestMethod("GET");
                        connection.connect();
                        BufferedReader reader =
                                new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        Gson gson = new GsonBuilder().setPrettyPrinting().create();
                        System.out.println(gson.toJson(gson.fromJson(reader, JsonObject.class)));
                    }
                }
            } catch (Exception e) {
                System.out.println("error: " + e);
            }
            System.exit(0);
        }
    }

    完整的识别结果会以JSON格式打印在控制台。完整结果包含转换后的文本以及文本在音视频文件中的起始、结束时间(以毫秒为单位)。

    {
        "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
        "properties": {
            "audio_format": "pcm_s16le",
            "channels": [
                0
            ],
            "original_sampling_rate": 16000,
            "original_duration_in_milliseconds": 4726
        },
        "transcripts": [
            {
                "channel_id": 0,
                "content_duration_in_milliseconds": 4720,
                "text": "Hello world, 这里是阿里巴巴语音实验室。",
                "sentences": [
                    {
                        "begin_time": 0,
                        "end_time": 4720,
                        "text": "Hello world, 这里是阿里巴巴语音实验室。",
                        "words": [
                            {
                                "begin_time": 0,
                                "end_time": 472,
                                "text": "Hello ",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 472,
                                "end_time": 944,
                                "text": "world",
                                "punctuation": ", "
                            },
                            {
                                "begin_time": 944,
                                "end_time": 1573,
                                "text": "这里",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 1573,
                                "end_time": 2202,
                                "text": "是阿",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 2202,
                                "end_time": 2831,
                                "text": "里巴",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 2831,
                                "end_time": 3460,
                                "text": "巴语",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 3460,
                                "end_time": 4089,
                                "text": "音实",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 4089,
                                "end_time": 4720,
                                "text": "验室",
                                "punctuation": "。"
                            }
                        ]
                    }
                ]
            }
        ]
    }
    {
        "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
        "properties": {
            "audio_format": "pcm_s16le",
            "channels": [
                0
            ],
            "original_sampling_rate": 16000,
            "original_duration_in_milliseconds": 3834
        },
        "transcripts": [
            {
                "channel_id": 0,
                "content_duration_in_milliseconds": 3820,
                "text": "Hello world, 这里是阿里巴巴语音实验室。",
                "sentences": [
                    {
                        "begin_time": 0,
                        "end_time": 3820,
                        "text": "Hello world, 这里是阿里巴巴语音实验室。",
                        "words": [
                            {
                                "begin_time": 0,
                                "end_time": 382,
                                "text": "Hello ",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 382,
                                "end_time": 764,
                                "text": "world",
                                "punctuation": ", "
                            },
                            {
                                "begin_time": 764,
                                "end_time": 1273,
                                "text": "这里",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 1273,
                                "end_time": 1782,
                                "text": "是阿",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 1782,
                                "end_time": 2291,
                                "text": "里巴",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 2291,
                                "end_time": 2800,
                                "text": "巴语",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 2800,
                                "end_time": 3309,
                                "text": "音实",
                                "punctuation": ""
                            },
                            {
                                "begin_time": 3309,
                                "end_time": 3820,
                                "text": "验室",
                                "punctuation": "。"
                            }
                        ]
                    }
                ]
            }
        ]
    }
    transcription done!
    

    由于音视频文件的尺寸通常较大,文件传输和语音识别处理均需要时间,文件转写API通过异步调用方式来提交任务。开发者需要通过查询接口,在文件转写完成后获得语音识别结果。

    Python
    Java
    # For prerequisites running the following sample, visit https://help.aliyun.com/document_detail/611472.html
    
    import re
    import json
    from urllib import request
    from http import HTTPStatus
    
    import dashscope
    
    # 将your-dashscope-api-key替换成您自己的API-KEY
    dashscope.api_key = 'your-dashscope-api-key'
    
    
    def parse_sensevoice_result(data, keep_trans=True, keep_emotions=True, keep_events=True):
        '''
        本工具用于解析 sensevoice 识别结果
        keep_trans: 是否保留转写文本,默认为True
        keep_emotions: 是否保留情感标签,默认为True
        keep_events: 是否保留事件标签,默认为True
        '''
        # 定义要保留的标签
        emotion_list = ['NEUTRAL', 'HAPPY', 'ANGRY', 'SAD']
        event_list = ['Speech', 'Applause', 'BGM', 'Laughter']
    
        # 所有支持的标签
        all_tags = ['Speech', 'Applause', 'BGM', 'Laughter',
                    'NEUTRAL', 'HAPPY', 'ANGRY', 'SAD', 'SPECIAL_TOKEN_1']
        tags_to_cleanup = []
        for tag in all_tags:
            tags_to_cleanup.append(f'<|{tag}|> ')
            tags_to_cleanup.append(f'<|/{tag}|>')
            tags_to_cleanup.append(f'<|{tag}|>')
    
        def get_clean_text(text: str):
            for tag in tags_to_cleanup:
                text = text.replace(tag, '')
            pattern = r"\s{2,}"
            text = re.sub(pattern, " ", text).strip()
            return text
    
        for item in data['transcripts']:
            for sentence in item['sentences']:
                if keep_emotions:
                    # 提取 emotion
                    emotions_pattern = r'<\|(' + '|'.join(emotion_list) + r')\|>'
                    emotions = re.findall(emotions_pattern, sentence['text'])
                    sentence['emotion'] = list(set(emotions))
                    if not sentence['emotion']:
                        sentence.pop('emotion', None)
    
                if keep_events:
                    # 提取 event
                    events_pattern = r'<\|(' + '|'.join(event_list) + r')\|>'
                    events = re.findall(events_pattern, sentence['text'])
                    sentence['event'] = list(set(events))
                    if not sentence['event']:
                        sentence.pop('event', None)
    
                if keep_trans:
                    # 提取纯文本
                    sentence['text'] = get_clean_text(sentence['text'])
                else:
                    sentence.pop('text', None)
    
            if keep_trans:
                item['text'] = get_clean_text(item['text'])
            else:
                item.pop('text', None)
            item['sentences'] = list(filter(lambda x: 'text' in x or 'emotion' in x or 'event' in x, item['sentences']))
        return data
    
    
    task_response = dashscope.audio.asr.Transcription.async_call(
        model='sensevoice-v1',
        file_urls=[
            'https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_example_1.wav'],
        language_hints=['en'], )
    
    print('task_id: ', task_response.output.task_id)
    
    transcription_response = dashscope.audio.asr.Transcription.wait(
        task=task_response.output.task_id)
    
    if transcription_response.status_code == HTTPStatus.OK:
        for transcription in transcription_response.output['results']:
            if transcription['subtask_status'] == 'SUCCEEDED':
                url = transcription['transcription_url']
                result = json.loads(request.urlopen(url).read().decode('utf8'))
                print(json.dumps(parse_sensevoice_result(result, keep_trans=False, keep_emotions=False), indent=4,
                                ensure_ascii=False))
            else:
                print('transcription failed!')
                print(transcription)
        print('transcription done!')
    else:
        print('Error: ', transcription_response.output.message)
    package org.example.recognition;
    
    import com.alibaba.dashscope.audio.asr.transcription.*;
    import com.google.gson.*;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Arrays;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    class SenseVoiceParser {
    
        private static final List<String> EMOTION_LIST = Arrays.asList("NEUTRAL", "HAPPY", "ANGRY", "SAD");
        private static final List<String> EVENT_LIST = Arrays.asList("Speech", "Applause", "BGM", "Laughter");
        private static final List<String> ALL_TAGS = Arrays.asList(
                "Speech", "Applause", "BGM", "Laughter", "NEUTRAL", "HAPPY", "ANGRY", "SAD", "SPECIAL_TOKEN_1");
    
        /**
         * 本工具用于解析 sensevoice 识别结果
         * @param data json格式的sensevoice转写结果
         * @param keepTrans 是否保留转写文本
         * @param keepEmotions 是否保留情感标签
         * @param keepEvents 是否保留事件标签
         * @return
         */
        public static JsonObject parseSenseVoiceResult(JsonObject data, boolean keepTrans, boolean keepEmotions, boolean keepEvents) {
    
            List<String> tagsToCleanup = ALL_TAGS.stream()
                    .flatMap(tag -> Stream.of("<|" + tag + "|> ", "<|/" + tag + "|>", "<|" + tag + "|>"))
                    .collect(Collectors.toList());
    
            JsonArray transcripts = data.getAsJsonArray("transcripts");
    
            for (JsonElement transcriptElement : transcripts) {
                JsonObject transcript = transcriptElement.getAsJsonObject();
                JsonArray sentences = transcript.getAsJsonArray("sentences");
    
                for (JsonElement sentenceElement : sentences) {
                    JsonObject sentence = sentenceElement.getAsJsonObject();
                    String text = sentence.get("text").getAsString();
    
                    if (keepEmotions) {
                        extractTags(sentence, text, EMOTION_LIST, "emotion");
                    }
    
                    if (keepEvents) {
                        extractTags(sentence, text, EVENT_LIST, "event");
                    }
    
                    if (keepTrans) {
                        String cleanText = getCleanText(text, tagsToCleanup);
                        sentence.addProperty("text", cleanText);
                    } else {
                        sentence.remove("text");
                    }
                }
    
                if (keepTrans) {
                    transcript.addProperty("text", getCleanText(transcript.get("text").getAsString(), tagsToCleanup));
                } else {
                    transcript.remove("text");
                }
    
                JsonArray filteredSentences = new JsonArray();
                for (JsonElement sentenceElement : sentences) {
                    JsonObject sentence = sentenceElement.getAsJsonObject();
                    if (sentence.has("text") || sentence.has("emotion") || sentence.has("event")) {
                        filteredSentences.add(sentence);
                    }
                }
                transcript.add("sentences", filteredSentences);
            }
            return data;
        }
    
        private static void extractTags(JsonObject sentence, String text, List<String> tagList, String key) {
            String pattern = "<\\|(" + String.join("|", tagList) + ")\\|>";
            Pattern compiledPattern = Pattern.compile(pattern);
            Matcher matcher = compiledPattern.matcher(text);
            Set<String> tags = new HashSet<>();
    
            while (matcher.find()) {
                tags.add(matcher.group(1));
            }
    
            if (!tags.isEmpty()) {
                JsonArray tagArray = new JsonArray();
                tags.forEach(tagArray::add);
                sentence.add(key, tagArray);
            } else {
                sentence.remove(key);
            }
        }
    
        private static String getCleanText(String text, List<String> tagsToCleanup) {
            for (String tag : tagsToCleanup) {
                text = text.replace(tag, "");
            }
            return text.replaceAll("\\s{2,}", " ").trim();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            // 创建转写请求参数,需要用真实apikey替换your-dashscope-api-key
            TranscriptionParam param =
                    TranscriptionParam.builder()
                            // 将your-dashscope-api-key替换成您自己的API-KEY
                            .apiKey("your-dashscope-api-key")
                            .model("sensevoice-v1")
                            .fileUrls(
                                    Arrays.asList(
                                            "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_example_1.wav"))
                            .parameter("language_hints", new String[] {"en"})
                            .build();
            try {
                Transcription transcription = new Transcription();
                // 提交转写请求
                TranscriptionResult result = transcription.asyncCall(param);
                System.out.println("requestId: " + result.getRequestId());
                // 等待转写完成
                result = transcription.wait(
                        TranscriptionQueryParam.FromTranscriptionParam(param, result.getTaskId()));
                // 获取转写结果
                List<TranscriptionTaskResult> taskResultList = result.getResults();
                if (taskResultList != null && taskResultList.size() > 0) {
                    for (TranscriptionTaskResult taskResult : taskResultList) {
                        String transcriptionUrl = taskResult.getTranscriptionUrl();
                        HttpURLConnection connection =
                                (HttpURLConnection) new URL(transcriptionUrl).openConnection();
                        connection.setRequestMethod("GET");
                        connection.connect();
                        BufferedReader reader =
                                new BufferedReader(new InputStreamReader(connection.getInputStream()));
                        Gson gson = new GsonBuilder().setPrettyPrinting().create();
                        JsonElement jsonResult = gson.fromJson(reader, JsonObject.class);
                        System.out.println(gson.toJson(jsonResult));
                        System.out.println(gson.toJson(SenseVoiceParser.parseSenseVoiceResult(jsonResult.getAsJsonObject(), true, true, true)));
                    }
                }
            } catch (Exception e) {
                System.out.println("error: " + e);
            }
            System.exit(0);
        }
    }

    完整的识别结果会以JSON格式打印在控制台。完整结果包含转换后的文本以及文本在音视频文件中的起始、结束时间(以毫秒为单位)。本示例中,还检测到了说话声事件(<|Speech|><|/Speech|>分别代表说话声事件的起始与结束),情绪(<|ANGRY|>)。

    {
        "file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_example_1.wav",
        "properties": {
            "audio_format": "pcm_s16le",
            "channels": [
                0
            ],
            "original_sampling_rate": 16000,
            "original_duration_in_milliseconds": 17645
        },
        "transcripts": [
            {
                "channel_id": 0,
                "content_duration_in_milliseconds": 12710,
                "text": "<|Speech|> Senior staff, Principal Doris Jackson, Wakefield faculty, and of course, my fellow classmates. <|/Speech|> <|ANGRY|><|Speech|> I am honored to have been chosen to speak before my classmates, as well as the students across America today. <|/Speech|>",
                "sentences": [
                    {
                        "begin_time": 0,
                        "end_time": 7060,
                        "text": "<|Speech|> Senior staff, Principal Doris Jackson, Wakefield faculty, and of course, my fellow classmates. <|/Speech|> <|ANGRY|>"
                    },
                    {
                        "begin_time": 11980,
                        "end_time": 17630,
                        "text": "<|Speech|> I am honored to have been chosen to speak before my classmates, as well as the students across America today. <|/Speech|>"
                    }
                ]
            }
        ]
    }
    transcription done!
    
    

    输入文件限制

    通义千问ASR模型

    Paraformer模型

    SenseVoice模型

    通义千问ASR模型

    Paraformer模型

    SenseVoice模型

    输入文件的方式

    音频文件的URL及本地文件

    音频文件的URL

    文件数量

    1

    不超过100

    文件大小

    每个URL或本地的文件不可超过10MB,时长为3分钟以内

    每个URL中的文件不超过2 GB,时长为12小时以内

    每个URL中的文件不超过2 GB,时长无限制

    文件格式

    da、 wave( *.wav)、 mp3、wav、aac、flac、ogg、aiff、 au、 mp3、 midi、 wma、 realaudio、 vqf、 oggvorbis、aac、 ape

    aac、amr、avi、flac、flv、m4a、mkv、mov、mp3、mp4、mpeg、ogg、opus、wav、webm、wma、wmv

    采样率

    16000 Hz

    paraformer-v2、paraformer-v1模型对采样率无限制,其他模型支持音视频采样率为16000 Hz及以上,电话语音采样率为8000 Hz及以上

    任意

    文件大小说明:如果超出限制,可尝试对文件进行预处理以降低文件尺寸。具体操作,请参见最佳实践
    音频格式说明:由于音视频文件格式及其变种众多,因此不能保证所有格式均能够被正确识别。请通过测试验证您所提供的文件能够获得正常的语音识别结果。
    采样率说明:采样率是指每秒对声音信号的采样次数。更高的采样率提供更多信息,有助于提高语音识别的准确率,但过高的采样率可能引入更多无关信息,反而影响识别效果。应根据实际采样率选择合适的模型。例如,8000Hz的语音数据应直接使用支持8000Hz的模型,无需转换为16000Hz。

    API参考

    常见问题

    1. 可能影响识别准确率的因素有哪些?

    1. 声音质量:设备、环境等可能影响语音的清晰度,从而影响识别准确率。高质量的音频输入是提高识别准确性的前提。

    2. 说话人特征:不同人的声音特质(如音调、语速、口音、方言)差异很大,这些个体差异会对语音识别系统构成挑战,尤其是对于未充分训练过的特定口音或方言。

    3. 语言和词汇:语音识别模型通常针对特定的语言进行训练。当处理多语言混合、专业术语、俚语或网络用语时,识别难度会增加。若模型支持热词功能,可通过热词调整识别结果。

    4. 上下文理解:缺乏对对话上下文的理解可能会导致误解,尤其是在含义模糊或依赖于上下文的情境中。

    2. 模型限流规则是怎样的?

    录音文件识别-通义千问ASR:

    模型名称

    限流条件(超出任一数值时触发限流)

    每分钟调用次数(QPM)

    每分钟消耗Token数(TPM)

    模型名称

    限流条件(超出任一数值时触发限流)

    每分钟调用次数(QPM)

    每分钟消耗Token数(TPM)

    qwen-audio-asr

    60

    100,000

    qwen-audio-asr-latest

    qwen-audio-asr-2024-12-04

    录音文件识别-Paraformer

    模型名称

    提交作业接口RPS限制

    任务查询接口RPS限制

    模型名称

    提交作业接口RPS限制

    任务查询接口RPS限制

    paraformer-v2

    20

    20

    paraformer-v1

    10

    paraformer-8k-v2

    20

    paraformer-8k-v1

    10

    paraformer-mtl-v1

    10

    录音文件识别-SenseVoice

    模型名称

    提交作业接口RPS限制

    任务查询接口RPS限制

    模型名称

    提交作业接口RPS限制

    任务查询接口RPS限制

    sensevoice-v1

    10

    20

    • 本页导读 (1)
    • 应用场景
    • 支持的模型
    • 模型选型建议
    • 快速开始
    • 输入文件限制
    • API参考
    • 常见问题
    • 1. 可能影响识别准确率的因素有哪些?
    • 2. 模型限流规则是怎样的?
    AI助理

    点击开启售前

    在线咨询服务

    你好,我是AI助理

    可以解答问题、推荐解决方案等