跳转到主要内容
语音识别

录音文件转写

将音视频文件转为文字

千问AI平台提供多个模型系列用于录音文件转写:Qwen-Audio-3.x-ASR-Flash 支持热词、Prompt 上下文和说话人分离,Fun-ASR 支持高精度多语言转写与歌曲识别,Qwen-ASR 具备增强的语义理解能力,Qwen-Omni 支持基于提示词的上下文感知转写。
有关模型可用性、支持语言和功能对比,请参见语音识别模型。

核心特性

  • 多语言识别:支持中文(含多种方言)、英语、日语、韩语、德语、法语、俄语等 30 多种语言。
  • 格式兼容:支持任意采样率,兼容 aac、wav、mp3 等主流音视频格式。
  • 长音频转写:支持单个时长不超过 12 小时、体积不超过 2 GB 的音频文件异步转写。启用说话人分离时,建议音频时长不超过 2 小时。
  • 歌曲识别:可转写带背景音乐(BGM)的完整歌曲,仅 fun-asr 与 fun-asr-2025-11-07 支持。
  • 可配置功能:说话人分离、敏感词过滤、句子/词语级时间戳、热词增强、上下文增强。

前提条件

快速开始

  • Qwen-Audio-3.x-ASR-Flash-Filetrans/Fun-ASR
  • Qwen-ASR
  • Qwen-Omni
支持的模型:
  • Qwen-Audio-3.1-ASR-Flash-Filetrans:qwen-audio-3.1-asr-flash-filetrans
  • Qwen-Audio-3.0-ASR-Flash-Filetrans:qwen-audio-3.0-asr-flash-filetrans
  • Qwen-Audio-3.1-ASR-Flash:qwen-audio-3.1-asr-flash
  • Qwen-Audio-3.0-ASR-Flash:qwen-audio-3.0-asr-flash
  • Fun-ASR:fun-asr(稳定版,当前等同 fun-asr-2025-11-07)、fun-asr-2025-11-07(快照版)、fun-asr-2025-08-25(快照版)、fun-asr-mtl(稳定版,当前等同 fun-asr-mtl-2025-08-25)、fun-asr-mtl-2025-08-25(快照版)
  • Fun-ASR-Flash:fun-asr-flash-2026-06-15
支持语言:
  • fun-asr 和 fun-asr-2025-11-07:普通话、粤语、吴语、闽南语、客家话、赣语、湘语、晋语、英语、日语、韩语、越南语、泰语、印尼语、马来语、菲律宾语、印地语、阿拉伯语、法语、德语、西班牙语、葡萄牙语、俄语、意大利语、荷兰语、瑞典语、丹麦语、芬兰语、挪威语、希腊语、波兰语、捷克语、匈牙利语、罗马尼亚语、保加利亚语、克罗地亚语、斯洛伐克语。同时支持中原、西南、冀鲁、江淮、兰银、胶辽、东北、北京、港台等地区的普通话口音。
  • fun-asr-2025-08-25:普通话和英语。
  • fun-asr-mtl 和 fun-asr-mtl-2025-08-25:普通话、粤语、英语、日语、韩语、越南语、泰语、印尼语、马来语、菲律宾语、印地语、阿拉伯语、法语、德语、西班牙语、葡萄牙语、俄语、意大利语、荷兰语、瑞典语、丹麦语、芬兰语、挪威语、希腊语、波兰语、捷克语、匈牙利语、罗马尼亚语、保加利亚语、克罗地亚语和斯洛伐克语。
  • fun-asr-flash-2026-06-15:同 fun-asr-2025-11-07。
支持采样率:任意支持音频格式:aac、amr、avi、flac、flv、m4a、mkv、mov、mp3、mp4、mpeg、ogg、opus、wav、webm、wma、wmv

发起首次调用

获取 API Key 并将其设置为环境变量。如需使用 SDK,请先安装 SDK。由于音视频文件通常较大,文件传输和语音识别可能需要较长时间。录音文件识别 API 采用异步调用方式提交任务。识别完成后,需要通过查询接口获取识别结果。

异步提交并同步等待

提交任务后阻塞等待,直到任务完成。
from http import HTTPStatus
from dashscope.audio.asr import Transcription
from urllib import request
import dashscope
import os
import json

dashscope.base_http_api_url = 'https://maas.qianwenaiapi.com/api/v1'

# 如果您没有配置环境变量,请用 API Key 替换下行代码:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

task_response = Transcription.async_call(
  model='qwen-audio-3.1-asr-flash-filetrans',
  file_urls=['https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260401/bjgrbu/hello_world_female_en.wav',
      'https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260401/rlrbee/hello_world_male_en.wav'],
  language_hints=['zh', 'en']  # language_hints 为可选参数,用于指定音频的语言代码。取值范围请参见 API 参考文档。
)

transcription_response = 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(result, indent=4,
      ensure_ascii=False))
    else:
      print('转写失败!')
      print(transcription)
else:
  print('错误:', transcription_response.output.message)
第一条结果
{
  "file_url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260401/bjgrbu/hello_world_female_en.wav",
  "properties": {
    "audio_format": "pcm_s16le",
    "channels": [
      0
    ],
    "original_sampling_rate": 24000,
    "original_duration_in_milliseconds": 3280
  },
  "transcripts": [
    {
      "channel_id": 0,
      "content_duration_in_milliseconds": 3000,
      "text": "Hello world, this is Alibaba Speech Lab. ",
      "sentences": [
        {
          "begin_time": 240,
          "end_time": 3240,
          "text": "Hello world, this is Alibaba Speech Lab. ",
          "sentence_id": 1,
          "words": [
            {
              "begin_time": 240,
              "end_time": 640,
              "text": "Hello",
              "punctuation": ""
            },
            {
              "begin_time": 640,
              "end_time": 960,
              "text": " world",
              "punctuation": ","
            },
            {
              "begin_time": 1280,
              "end_time": 1480,
              "text": " this",
              "punctuation": ""
            },
            {
              "begin_time": 1480,
              "end_time": 1840,
              "text": " is",
              "punctuation": ""
            },
            {
              "begin_time": 1840,
              "end_time": 2520,
              "text": " Alibaba",
              "punctuation": ""
            },
            {
              "begin_time": 2520,
              "end_time": 2920,
              "text": " Speech",
              "punctuation": ""
            },
            {
              "begin_time": 2920,
              "end_time": 3240,
              "text": " Lab",
              "punctuation": ". "
            }
          ]
        }
      ]
    }
  ]
}
第二条结果
{
  "file_url": "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260401/rlrbee/hello_world_male_en.wav",
  "properties": {
    "audio_format": "pcm_s16le",
    "channels": [
      0
    ],
    "original_sampling_rate": 24000,
    "original_duration_in_milliseconds": 4000
  },
  "transcripts": [
    {
      "channel_id": 0,
      "content_duration_in_milliseconds": 3160,
      "text": "Hello world, this is Alibaba Speech Lab. ",
      "sentences": [
        {
          "begin_time": 800,
          "end_time": 3960,
          "text": "Hello world, this is Alibaba Speech Lab. ",
          "sentence_id": 1,
          "words": [
            {
              "begin_time": 800,
              "end_time": 1200,
              "text": "Hello",
              "punctuation": ""
            },
            {
              "begin_time": 1200,
              "end_time": 1640,
              "text": " world",
              "punctuation": ","
            },
            {
              "begin_time": 1880,
              "end_time": 2120,
              "text": " this",
              "punctuation": ""
            },
            {
              "begin_time": 2120,
              "end_time": 2560,
              "text": " is",
              "punctuation": ""
            },
            {
              "begin_time": 2560,
              "end_time": 3360,
              "text": " Alibaba",
              "punctuation": ""
            },
            {
              "begin_time": 3360,
              "end_time": 3720,
              "text": " Speech",
              "punctuation": ""
            },
            {
              "begin_time": 3720,
              "end_time": 3960,
              "text": " Lab",
              "punctuation": ". "
            }
          ]
        }
      ]
    }
  ]
}

异步提交并轮询查询

提交任务后通过轮询获取结果,而非阻塞等待。
from http import HTTPStatus
from dashscope.audio.asr import Transcription
import dashscope
import os
import json

dashscope.base_http_api_url = 'https://maas.qianwenaiapi.com/api/v1'

# 如果您没有配置环境变量,请用 API Key 替换下行代码:dashscope.api_key = "sk-xxx"
dashscope.api_key = os.getenv("DASHSCOPE_API_KEY")

transcribe_response = Transcription.async_call(
  model='qwen-audio-3.1-asr-flash-filetrans',
  file_urls=['https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260401/bjgrbu/hello_world_female_en.wav',
      'https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260401/rlrbee/hello_world_male_en.wav']
)

while True:
  if transcribe_response.output.task_status == 'SUCCEEDED' or transcribe_response.output.task_status == 'FAILED':
    break
  transcribe_response = Transcription.fetch(task=transcribe_response.output.task_id)

if transcribe_response.status_code == HTTPStatus.OK:
  print(json.dumps(transcribe_response.output, indent=4, ensure_ascii=False))
  print('转写完成!')

RESTful API

使用任意 HTTP 库提交任务并轮询获取结果。以下 Python 示例演示了完整流程:
import requests
import json
import os
import time

# 如果您没有配置环境变量,请用 API Key 替换下行代码:api_key = "sk-xxx"
api_key = os.getenv("DASHSCOPE_API_KEY")
file_urls = [
  "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260401/bjgrbu/hello_world_female_en.wav",
  "https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/zh-CN/20260401/rlrbee/hello_world_male_en.wav",
]

region = "maas.qianwenaiapi.com"

# 提交录音文件转写任务,包含待转写的文件 URL 列表
def submit_task(apikey, file_urls) -> str:

  headers = {
    "Authorization": f"Bearer {apikey}",
    "Content-Type": "application/json",
    "X-DashScope-Async": "enable",
  }
  data = {
    "model": "qwen-audio-3.1-asr-flash-filetrans",
    "input": {"file_urls": file_urls},
    "parameters": {
      "channel_id": [0],
      # "vocabulary_id": "vocab-Xxxx", # 可选,热词 ID。
    },
  }
  # 录音文件转写服务的 URL
  service_url = (
    f"https://{region}/api/v1/services/audio/asr/transcription"
  )
  response = requests.post(
    service_url, headers=headers, data=json.dumps(data)
  )

  # 打印响应内容
  if response.status_code == 200:
    return response.json()["output"]["task_id"]
  else:
    print("任务提交失败!")
    print(response.json())
    return None


# 循环查询任务状态,直到任务完成
def wait_for_complete(task_id):
  headers = {
    "Authorization": f"Bearer {api_key}",
    "Content-Type": "application/json",
  }

  pending = True
  while pending:
    # 任务状态查询服务的 URL
    service_url = f"https://{region}/api/v1/tasks/{task_id}"
    response = requests.get(
      service_url, headers=headers
    )
    if response.status_code == 200:
      status = response.json()['output']['task_status']
      if status == 'SUCCEEDED':
        print("任务完成!")
        pending = False
        return response.json()['output']['results']
      elif status == 'RUNNING' or status == 'PENDING':
        pass
      else:
        print("任务失败!")
        pending = False
    else:
      print("查询失败!")
      pending = False
    print(response.json())
    time.sleep(0.1)


task_id = submit_task(apikey=api_key, file_urls=file_urls)
print("task_id: ", task_id)
result = wait_for_complete(task_id)
print("转写结果:", result)

同步调用(Qwen-Audio-3.x-ASR-Flash/Fun-ASR-Flash)

Qwen-Audio-3.x-ASR-Flash/Fun-ASR-Flash 系列模型支持对最长 5 分钟的音频文件进行同步调用,结果可以以流式或非流式方式返回。
curl --location --request POST 'https://maas.qianwenaiapi.com/api/v1/services/aigc/multimodal-generation/generation' \
  --header "Authorization: Bearer $DASHSCOPE_API_KEY" \
  --header "Content-Type: application/json" \
  --header "X-DashScope-SSE: disable" \
  --data '{
  "model": "qwen-audio-3.1-asr-flash",
  "input": {
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "input_audio",
            "input_audio": {
              "data": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav"
            }
          }
        ]
      }
    ]
  },
  "parameters": {
    "format": "wav",
    "sample_rate": "16000"
  }
}'
Qwen-Audio-3.x-ASR-Flash/Fun-ASR-Flash 系列模型通过 DashScope 同步调用接口(multimodal-generation 端点)返回的响应结构与标准 DashScope 多模态接口格式不同,实际返回结构为:
{
  "output": {
    "output": {
      "sentence": {
        "text": "识别文本内容"
      }
    },
    "text": "Hello World,这里是阿里巴巴语音实验室。"
  },
  "request_id": "..."
}
其中 output.output.sentence.text 和顶层 output.text 为识别文本字段,无 choices 字段,请据此解析响应。

上下文增强

适用模型: 支持上下文增强功能,可将对话历史传入 ASR 模型,显著提升专有词汇的转写准确率。详细的使用方法和效果示例,请参见下方。 使用场景: 适用于将 ASR 与大语言模型结合的场景。将历史对话上下文(LLM 的回复和此前的识别结果)传入 ASR 模型,可显著提升对人名、地名、产品术语等专有名词的转写准确率——比传统热词更灵活。 用法: 通过 input.messages 传入对话历史。使用 assistant 角色表示 LLM 此前的回复,使用 user 角色配合 input_text 类型表示此前的识别结果。上下文需成对出现在当前音频消息之前。 支持的文本类型包括(但不限于):
  • 各种分隔符格式的热词列表(例如:热词 1、热词 2、热词 3、热词 4)
  • 任意长度与格式的文本段落或篇章
  • 混合内容:词表与段落的任意组合
  • 无关或无意义文本(包括乱码)。模型对无关内容容忍度较高,识别质量很少因此下降。
示例: 某段音频的正确识别结果为:"投行圈内部的那些黑话,你了解哪些?首先,外资九大投行,Bulge Bracket,BB ……"
不使用上下文增强使用上下文增强
未使用上下文增强时,部分投行公司名称识别有误,例如 "Bird Rock" 正确应为 "Bulge Bracket"。

识别结果:"投行圈内部的那些黑话,你了解哪些?首先,外资九大投行,Bird Rock,BB ……"
使用上下文增强,对投行公司名称识别正确。

识别结果:"投行圈内部的那些黑话,你了解哪些?首先,外资九大投行,Bulge Bracket,BB ……"
实现上述效果,可在上下文中加入以下任一内容:
  • 词表:
    • 词表 1:
Bulge Bracket、Boutique、Middle Market、国内券商
  • 词表 2:
Bulge Bracket Boutique Middle Market 国内券商
  • 词表 3:
['Bulge Bracket', 'Boutique', 'Middle Market', '国内券商']
  • 自然语言:
投行分类大揭秘!
最近有不少澳洲的小伙伴问我,到底什么是投行?今天就来给大家科普一下,对于留学生来说,投行主要可以分为四大类:Bulge Bracket、Boutique、Middle Market 和国内券商。
Bulge Bracket 投行:这就是我们常说的九大投行,包括高盛、摩根士丹利等。这些大行在业务范围和规模上都相当庞大。
Boutique 投行:这些投行规模相对较小,但业务领域非常专注。比如 Lazard、Evercore 等,它们在特定领域有着深厚的专业知识和经验。
Middle Market 投行:这类投行主要服务于中型公司,提供并购、IPO 等业务。虽然规模不如大行,但在特定市场上有很高的影响力。
国内券商:随着中国市场的崛起,国内券商在国际市场上也扮演着越来越重要的角色。
此外,还有一些 Position 和 business 的划分,大家可以参考相关的图表。希望这些信息能帮助大家更好地了解投行,为未来的职业生涯做好准备!
  • 有干扰的自然语言:部分文本与识别内容无关,例如下面示例里的人名。
投行分类大揭秘!
最近有不少澳洲的小伙伴问我,到底什么是投行?今天就来给大家科普一下,对于留学生来说,投行主要可以分为四大类:Bulge Bracket、Boutique、Middle Market 和国内券商。
Bulge Bracket 投行:这就是我们常说的九大投行,包括高盛、摩根士丹利等。这些大行在业务范围和规模上都相当庞大。
Boutique 投行:这些投行规模相对较小,但业务领域非常专注。比如 Lazard、Evercore 等,它们在特定领域有着深厚的专业知识和经验。
Middle Market 投行:这类投行主要服务于中型公司,提供并购、IPO 等业务。虽然规模不如大行,但在特定市场上有很高的影响力。
国内券商:随着中国市场的崛起,国内券商在国际市场上也扮演着越来越重要的角色。
此外,还有一些 Position 和 business 的划分,大家可以参考相关的图表。希望这些信息能帮助大家更好地了解投行,为未来的职业生涯做好准备!
王皓轩 李梓涵 张景行 刘欣怡 陈俊杰 杨思远 赵雨桐 黄志强 周子墨 吴雅静 徐若曦 孙浩然 胡瑾瑜 朱晨曦 郭文博 何静姝 高宇航 林逸飞
郑晓燕 梁博文 罗佳琪 宋明哲 谢婉婷 唐子骞 韩梦瑶 冯毅然 曹沁雪 邓子睿 萧望舒 许嘉树
程一诺 袁芷若 彭浩宇 董思淼 范景玉 苏子衿 吕文轩 蒋诗涵 丁沐宸
魏书瑶 任天佑 姜亦辰 华清羽 沈星河 傅瑾瑜 姚星辰 钟灵毓 阎立诚 金若水 陶然亭 戚少商 薛芷兰 邹云帆 熊子昂 柏文峰 易千帆

进阶功能

除上下文增强外,录音文件转写还支持以下能力。热词的创建与使用方法请参见提升识别准确率。

长音频文件处理

录音文件转写支持长音频异步转写,适用于会议记录、访谈整理、通话回放等场景。 限制说明:
  • Qwen-Audio-3.x-ASR-Flash-Filetrans/Fun-ASR/Qwen3-ASR-Flash-Filetrans:单个音频文件大小不超过 2 GB,时长不超过 12 小时。
  • Qwen-Audio-3.1-ASR-Flash:单个音频文件大小不超过 2 GB,时长不超过 5 分钟。
  • Qwen-Audio-3.0-ASR-Flash/Fun-ASR-Flash/Qwen3-ASR-Flash:单个音频文件大小不超过 10 MB,时长不超过 5 分钟。更长的音频请使用 Qwen-Audio-3.1-ASR-Flash-Filetrans、Fun-ASR 或 Qwen3-ASR-Flash-Filetrans。
  • 启用说话人分离时:建议音频时长不超过 2 小时,否则可能导致识别失败或超时。详见说话人分离。
调用方式:长音频转写采用异步任务模式,分三步:
  1. 提交转写任务,获取 task_id。
  2. 轮询查询任务状态(或使用 SDK 的等待方法阻塞等待)。
  3. 任务完成后从返回的 URL 下载识别结果 JSON。
代码示例请参见快速开始。轮询间隔与批量任务管理请参见异步任务管理。

说话人分离

说话人分离可自动识别音频中的不同说话人,并在转写结果中为每个句子标注说话人标签,适用于多人会议、访谈录音等场景。 Qwen-Audio-3.1-ASR-Flash 使用 speaker_diarization_enabled 开启说话人分离。 支持范围:Qwen-Audio-3.x-ASR-Flash-Filetrans、Qwen-Audio-3.1-ASR-Flash、Fun-ASR。 启用方式:在请求参数中设置 diarization_enabled 为 true。识别结果中每个句子会包含 speaker_id 字段,标识不同说话人。 返回结构示例(节选):
{
  "transcripts": [
    {
      "sentences": [
        { "begin_time": 100, "end_time": 3820, "text": "你好,我们今天讨论项目进度。", "speaker_id": 0 },
        { "begin_time": 3820, "end_time": 6500, "text": "好的,我先汇报一下。", "speaker_id": 1 }
      ]
    }
  ]
}
启用说话人分离时,建议音频时长不超过 2 小时,否则可能导致识别失败或超时(未启用时的时长限制详见长音频文件处理)。说话人分离仅支持单声道音频。
不同 SDK 暴露上述字段的命名习惯不同(如字典 key、对象属性、方法等),完整字段对照请参见API 参考。

敏感词过滤

敏感词过滤可对识别结果中的敏感词执行替换或移除,适用于客服质检、内容合规、字幕审核等场景。 支持范围:Qwen-Audio-3.x-ASR-Flash-Filetrans、Fun-ASR。 默认行为:未传入 special_word_filter 参数时,系统启用内置敏感词表,匹配的词语会被替换为等长的 *。 自定义配置:special_word_filter 是 JSON 对象,包含三个子字段:
  • filter_with_signed.word_list:字符串数组,列出需要被替换为等长 * 的敏感词。例如 ["测试"],「帮我测试一下」会变成「帮我**一下」。
  • filter_with_empty.word_list:字符串数组,列出需要从结果中完全移除的敏感词。例如 ["开始"],「比赛这就要开始了吗」会变成「比赛这就要了吗」。
  • system_reserved_filter:布尔值,默认 true。是否同时启用系统预置敏感词表(与自定义词表叠加生效)。
配置示例:
{
  "special_word_filter": {
    "filter_with_signed": {
      "word_list": ["测试"]
    },
    "filter_with_empty": {
      "word_list": ["开始", "发生"]
    },
    "system_reserved_filter": true
  }
}
录音文件转写与实时语音识别的默认行为不同:实时识别未传入 special_word_filter 时不做过滤(system_reserved_filter 默认为 false)。

情感识别

Qwen3-ASR-Flash-Filetrans 与 Qwen3-ASR-Flash 固定开启情感识别,无需额外配置。识别结果中会附带说话人的情绪标签,取值为 7 类细粒度情绪:surprised(惊讶)、neutral(平静)、happy(愉快)、sad(悲伤)、disgusted(厌恶)、angry(愤怒)、fearful(恐惧)。 字段路径(因接口而异):
  • OpenAI 兼容接口(Qwen3-ASR-Flash):choices[].delta.annotations[].emotion(流式输出)或 choices[].message.annotations[].emotion(非流式)。
  • DashScope 同步调用接口(Qwen3-ASR-Flash):output.choices[].message.annotations[].emotion。
  • DashScope 异步任务接口(Qwen3-ASR-Flash-Filetrans):transcripts[].sentences[].emotion,与时间戳等字段并列在每个句子对象中。
返回结构示例(DashScope 异步任务接口节选):
{
  "transcripts": [{
    "sentences": [{
      "begin_time": 0,
      "end_time": 1440,
      "text": "欢迎使用千问AI平台。",
      "emotion": "neutral",
      "language": "zh"
    }]
  }]
}
Qwen-Audio-3.x-ASR-Flash-Filetrans、Qwen-Audio-3.x-ASR-Flash、Fun-ASR、Fun-ASR-Flash 暂不支持情感识别。如需在实时识别中使用情感识别,请参见实时语音识别。

获取时间戳

录音文件转写支持在结果中输出时间戳,便于字幕生成、关键词高亮、音视频剪辑等场景。各模型的默认行为和控制方式不同:
  • Qwen-Audio-3.x-ASR-Flash-Filetrans/Qwen-Audio-3.x-ASR-Flash/Fun-ASR/Fun-ASR-Flash:时间戳固定开启,不可关闭。
  • Qwen3-ASR-Flash-Filetrans:仅 DashScope 异步调用方式支持时间戳,固定开启。可通过请求参数 enable_words 控制时间戳级别:设为 false(默认)返回句级时间戳,设为 true 返回字级时间戳。字级时间戳仅支持中文、英语、日语、韩语、德语、法语、西班牙语、意大利语、葡萄牙语、俄语,其他语种可能无法保证准确性。
Qwen3-ASR-Flash 通过 OpenAI 兼容接口调用时,输出形态为 chat.completion,不返回时间戳字段。如需时间戳,请使用 Qwen3-ASR-Flash-Filetrans(异步任务接口)。
时间戳单位均为毫秒,分两个层级返回:
  • 句级:sentences[].begin_time 与 sentences[].end_time,标识每个句子在音频中的起止时刻。
  • 字级:sentences[].words[] 数组,每个元素包含 begin_time、end_time 与 text(该字/词文本)。
返回结构示例(DashScope 异步任务接口节选):
{
  "transcripts": [{
    "sentences": [{
      "begin_time": 100,
      "end_time": 3820,
      "text": "你好,我们今天讨论项目进度。",
      "words": [
        { "begin_time": 100, "end_time": 596, "text": "你好" },
        { "begin_time": 596, "end_time": 844, "text": "我们" }
      ]
    }]
  }]
}
音频内时间戳是毫秒整数(如 100),与任务级 end_time(任务完成时间,字符串日期如 "2024-09-12 15:11:40.903")不是同一字段,请勿混淆。

应用于生产环境

将录音文件转写应用于生产环境时,以下实践有助于提升识别效果和系统稳定性。
  • 文件托管:将音频文件上传至 OSS 等对象存储服务,通过 URL 方式调用,避免使用本地文件上传(本地文件调用上限 100 QPS,不支持扩容)。
  • 异步轮询:长音频转写采用异步模式,任务查询接口默认 20 QPS。建议设置合理的轮询间隔(如 2~5 秒),避免频繁查询触发限流。轮询策略与批量任务管理请参见异步任务管理。
  • 错误处理:实现完善的重试机制;网络超时或服务端临时错误(5xx)按指数退避策略重试。
  • 降噪处理:噪声较大的音频建议先用 FFmpeg 等工具预处理后再提交识别。
  • 模型选择:根据音频时长选择合适的模型。5 分钟以内的短音频使用 Qwen3-ASR-Flash,超过 5 分钟的长音频使用 Qwen-Audio-3.1-ASR-Flash-Filetrans、Fun-ASR 或 Qwen3-ASR-Flash-Filetrans。

API 参考

常见问题

  • Qwen-Audio-3.x-ASR-Flash-Filetrans/Fun-ASR
  • Qwen-ASR
  • Qwen-Omni

如何提高识别准确率?

您应综合考虑所有相关因素并采取相应措施。主要影响因素包括:
  1. 音质:录音设备质量、采样率和环境噪声会影响音频清晰度。高质量的音频是准确识别的基础。
  2. 说话人特征:音高、语速、口音和方言的差异会增加识别难度,尤其是罕见方言或浓重口音。
  3. 语言和词汇:中英混合、专业术语或俚语会增加识别难度。您可以配置热词来优化这些场景的识别效果。
  4. 上下文理解:缺乏上下文可能导致语义歧义,特别是在需要上下文才能正确识别的场景中。
优化方法:
  1. 提升音频质量:使用高性能麦克风和支持推荐采样率的设备。减少环境噪声和回声。
  2. 适应说话人特征:对于涉及浓重口音或多方言的场景,选择支持相应方言的模型。
  3. 配置热词:为专业术语、专有名词等特定词汇设置热词。详情请参见自定义热词。
  4. 保留上下文:避免将音频切分为过短的片段。