Qwen 语音识别
使用本接口将音频文件转写为文本,支持通过音频 URL 或 Base64 Data URI 传入音频,可返回句级、词级时间戳,并支持上下文增强、热词与说话人分离等能力。
接口地址
http
POST /v1/audio/transcriptions认证
| 方式 | 说明 |
|---|---|
| Bearer Token | 在请求头中携带 Authorization: Bearer <API Key> 用于验证账户信息。 |
请求头
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
Content-Type | string | 是 | 请求体的媒介类型,请设置为 application/json |
Authorization | string | 是 | Bearer API Key,用于验证账户信息 |
X-DashScope-SSE | string | 否 | 是否以 SSE 流式返回:enable 开启,disable 关闭(默认) |
说明:本接口仅接受 JSON 请求体,不支持
multipart/form-data文件上传;使用 multipart 时将返回 400 错误。请通过音频 URL 或 Base64 Data URI 传入音频。
请求体
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
model | string | 是 | - | 模型 ID,可用值见文末的支持模型列表 |
input | object | 是 | - | 输入信息,详见「input 详细参数」 |
parameters | object | 是 | - | 模型参数,详见「parameters 详细参数」 |
input 详细参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
input.messages | array<object> | 是 | - | 消息列表,包含当前待识别的音频以及可选的对话上下文;至少包含一条 input_audio 类型的消息 |
messages 元素
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
role | string | 是 | - | 消息角色:user 或 assistant;assistant 仅用于上下文 |
content | array<object> | 是 | - | 消息内容列表 |
content 元素
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
type | string | 是 | - | 内容类型:input_audio、input_text 或 text |
input_audio | object | 否 | - | 当 type 为 input_audio 时必填 |
text | string | 否 | - | 当 type 为 input_text 或 text 时必填 |
input_audio 对象
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
input_audio.data | string | 是 | - | 音频文件 URL,或 data:{MIME_TYPE};base64,{BASE64_DATA} 格式的 Base64 Data URI |
parameters 详细参数
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
parameters.format | string | 是 | - | 音频格式,需与实际音频格式一致,如 wav、mp3、opus |
parameters.sample_rate | string | 否 | - | 音频采样率,单位 Hz,如 16000 表示 16kHz |
parameters.vocabulary_id | string | 否 | - | 预编译热词列表 ID。目前平台暂不支持该功能,请使用即时热词 vocabulary |
parameters.vocabulary | object | 否 | - | 即时热词,键为热词文本、值为权重,详见「热词说明」 |
parameters.language_hints | array<string> | 否 | - | 待识别语言代码,最多设置 4 个,超出时仅前 4 个生效;不设置时由模型自动识别语种 |
parameters.speaker_diarization_enabled | boolean | 否 | false | 是否启用说话人分离,仅 qwen-audio-3.1-asr-flash 支持;开启后通过 speaker_id 区分说话人并返回 output.sentences,此时 keep_dialect 与 language_hints 不生效 |
parameters.keep_dialect | boolean | 否 | false | 是否保留方言表达,仅 qwen-audio-3.1-asr-flash 支持;false 时转写为普通话文本 |
音频输入说明
- 单个音频文件大小不超过 10MB,时长不超过 5 分钟。
- 支持通过公网可访问的音频 URL 或 Base64 Data URI 传入音频。
- Base64 Data URI 格式为
data:{MIME_TYPE};base64,{BASE64_DATA},MIME 类型需与音频格式一致,例如 WAV 使用audio/wav、MP3 使用audio/mpeg。 - Base64 编码会增大体积,请控制原文件大小,确保编码后仍符合 10MB 的输入限制。
- 支持
wav、mp3、opus等格式,实际支持范围以模型音频规格为准。
上下文增强说明
上下文字段用于提升专有词汇的识别准确率,可传入前几轮对话内容:
- 上下文消息(
input_text和text类型)各最多 5 条,超出时仅保留最近的 5 条。 - 每轮上下文文本总长度(
user与assistant的text字段长度之和)不超过 400 个字符,超出部分从末尾截断。 - 消息必须按对话轮次排列:每轮中
user(input_text)须在对应的assistant(text)之前;包含input_audio的user消息必须放在messages数组最后。
热词说明
说明:目前平台支持即时热词
vocabulary,暂不支持预编译热词vocabulary_id。
vocabulary_id:预编译热词列表 ID。目前平台暂不支持该功能,请使用即时热词vocabulary。vocabulary:即时热词,以键值对形式传入,无需预先创建,适合临时性、会话级别的热词优化。- 权重取
[1, 5]时,值越大模型越倾向输出该词;取50时为超级热词,召回率大幅提升,超级热词最多 50 个。 - 两类热词同时配置时会合并使用;合并后超过 2000 个时,随机选择 2000 个使用。当前平台暂不支持预编译热词,实际仅即时热词生效。
- 即时热词仅
qwen-audio-3.1-asr-flash、qwen-audio-3.0-asr-flash支持。
支持的语言代码
| 代码 | 语言 | 代码 | 语言 | 代码 | 语言 |
|---|---|---|---|---|---|
zh | 中文 | en | 英文 | ja | 日语 |
ko | 韩语 | vi | 越南语 | th | 泰语 |
id | 印尼语 | ms | 马来语 | tl | 菲律宾语 |
hi | 印地语 | ar | 阿拉伯语 | fr | 法语 |
de | 德语 | es | 西班牙语 | pt | 葡萄牙语 |
ru | 俄语 | it | 意大利语 | nl | 荷兰语 |
sv | 瑞典语 | da | 丹麦语 | fi | 芬兰语 |
no | 挪威语 | el | 希腊语 | pl | 波兰语 |
cs | 捷克语 | hu | 匈牙利语 | ro | 罗马尼亚语 |
bg | 保加利亚语 | hr | 克罗地亚语 | sk | 斯洛伐克语 |
模型差异
| 模型 | 说话人分离 | 保留方言 | 即时热词 | 用量返回 |
|---|---|---|---|---|
qwen-audio-3.1-asr-flash | 支持 | 支持 | 支持 | usage.duration、usage.input_tokens、usage.output_tokens、usage.total_tokens |
qwen-audio-3.0-asr-flash | 不支持 | 不支持 | 支持 | usage.duration |
请求示例
bash
curl --location --request POST 'https://neolink.com/api/v1/audio/transcriptions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <API Key>' \
--data-raw '{
"model": "qwen-audio-3.0-asr-flash",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://example.com/audio/sample.wav"
}
}
]
}
]
},
"parameters": {
"format": "wav",
"sample_rate": "16000"
}
}'python
import requests
url = "https://neolink.com/api/v1/audio/transcriptions"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer <API Key>",
}
payload = {
"model": "qwen-audio-3.0-asr-flash",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://example.com/audio/sample.wav"
}
}
]
}
]
},
"parameters": {
"format": "wav",
"sample_rate": "16000"
}
}
response = requests.post(url, headers=headers, json=payload, timeout=60)
print(response.json())javascript
import https from 'https'
const data = JSON.stringify({
model: 'qwen-audio-3.0-asr-flash',
input: {
messages: [
{
role: 'user',
content: [
{
type: 'input_audio',
input_audio: {
data: 'https://example.com/audio/sample.wav'
}
}
]
}
]
},
parameters: {
format: 'wav',
sample_rate: '16000'
}
})
const req = https.request('https://neolink.com/api/v1/audio/transcriptions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer <API Key>',
'Content-Length': Buffer.byteLength(data)
}
}, res => {
let body = ''
res.on('data', chunk => body += chunk)
res.on('end', () => console.log(JSON.parse(body)))
})
req.write(data)
req.end()流式返回
在请求头中设置 X-DashScope-SSE: enable 即可开启流式返回。
bash
curl --location --request POST 'https://neolink.com/api/v1/audio/transcriptions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <API Key>' \
--header 'X-DashScope-SSE: enable' \
--data-raw '{
"model": "qwen-audio-3.0-asr-flash",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://example.com/audio/sample.wav"
}
}
]
}
]
},
"parameters": {
"format": "wav",
"sample_rate": "16000"
}
}'python
import requests
url = "https://neolink.com/api/v1/audio/transcriptions"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer <API Key>",
"X-DashScope-SSE": "enable",
}
payload = {
"model": "qwen-audio-3.0-asr-flash",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://example.com/audio/sample.wav"
}
}
]
}
]
},
"parameters": {
"format": "wav",
"sample_rate": "16000"
}
}
with requests.post(url, headers=headers, json=payload, stream=True, timeout=300) as response:
for raw_line in response.iter_lines():
if not raw_line:
continue
line = raw_line.decode("utf-8")
if not line.startswith("data:"):
continue
print(line[len("data:"):].strip())使用 Base64 传入音频
python
import base64
import pathlib
import requests
audio_path = pathlib.Path("sample.wav")
data_uri = "data:audio/wav;base64," + base64.b64encode(audio_path.read_bytes()).decode()
url = "https://neolink.com/api/v1/audio/transcriptions"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer <API Key>",
}
payload = {
"model": "qwen-audio-3.0-asr-flash",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {"data": data_uri}
}
]
}
]
},
"parameters": {
"format": "wav",
"sample_rate": "16000"
}
}
response = requests.post(url, headers=headers, json=payload, timeout=60)
print(response.json())携带上下文增强识别
bash
curl --location --request POST 'https://neolink.com/api/v1/audio/transcriptions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <API Key>' \
--data-raw '{
"model": "qwen-audio-3.0-asr-flash",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "你好啊"
}
]
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "你好啊,我是通义千问,有什么可以帮助你的?"
}
]
},
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://example.com/audio/sample.wav"
}
}
]
}
]
},
"parameters": {
"format": "wav",
"sample_rate": "16000"
}
}'使用即时热词
bash
curl --location --request POST 'https://neolink.com/api/v1/audio/transcriptions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <API Key>' \
--data-raw '{
"model": "qwen-audio-3.0-asr-flash",
"input": {
"messages": [
{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "https://example.com/audio/sample.wav"
}
}
]
}
]
},
"parameters": {
"format": "wav",
"sample_rate": "16000",
"vocabulary": {
"张三": 5,
"李四": 5
}
}
}'响应体
| 参数名 | 类型 | 说明 |
|---|---|---|
request_id | string | 本次请求的唯一标识 |
output.text | string | 当前累积的完整识别文本 |
output.sentence | object | 当前句子的详细信息 |
output.sentence.speaker_id | integer / null | 说话人编号;仅 qwen-audio-3.1-asr-flash 开启说话人分离时返回编号,否则为 null |
output.sentence.sentence_id | integer | 句子编号,从 1 开始 |
output.sentence.sentence_end | boolean | 是否为该句的最终结果,true 表示该句识别完成 |
output.sentence.begin_time | integer | 句子开始时间,单位毫秒 |
output.sentence.end_time | integer | 句子结束时间,单位毫秒,仅在 sentence_end 为 true 时返回 |
output.sentence.text | string | 当前句子的识别文本 |
output.sentence.channel_id | integer | 声道编号,从 0 开始 |
output.sentence.words | array<object> | 词级别时间戳列表 |
output.sentence.words[].speaker_id | integer / null | 词对应的说话人编号,仅 qwen-audio-3.1-asr-flash 开启说话人分离时返回编号,否则为 null |
output.sentence.words[].text | string | 词文本 |
output.sentence.words[].begin_time | integer | 词开始时间,单位毫秒 |
output.sentence.words[].end_time | integer | 词结束时间,单位毫秒 |
output.sentence.words[].punctuation | string | 词后的标点符号,无标点时为空字符串 |
output.sentence.words[].fixed | boolean | 词是否已稳定,false 表示后续事件中该词的时间戳可能调整 |
output.sentences | array<object> | 当前及历史句子的识别结果,每个元素的结构与 output.sentence 相同;仅 qwen-audio-3.1-asr-flash 开启说话人分离时返回 |
usage.duration | integer | 已处理的音频时长,单位秒,仅在 sentence_end 为 true 时返回 |
usage.input_tokens | integer | 本次调用消耗的输入 Token 数,仅 qwen-audio-3.1-asr-flash 返回 |
usage.output_tokens | integer | 本次调用消耗的输出 Token 数,仅 qwen-audio-3.1-asr-flash 返回 |
usage.total_tokens | integer | 本次调用消耗的总 Token 数,等于 input_tokens 与 output_tokens 之和,仅 qwen-audio-3.1-asr-flash 返回 |
响应示例
json
{
"output": {
"sentence": {
"begin_time": 760,
"channel_id": 0,
"end_time": 3800,
"sentence_end": true,
"sentence_id": 1,
"text": "Hello World,这里是阿里巴巴语音实验室。",
"words": [
{
"begin_time": 760,
"end_time": 1040,
"fixed": true,
"punctuation": "",
"text": "Hello"
},
{
"begin_time": 1040,
"end_time": 1240,
"fixed": true,
"punctuation": ",",
"text": " World"
},
{
"begin_time": 1360,
"end_time": 1880,
"fixed": true,
"punctuation": "",
"text": "这里是"
},
{
"begin_time": 1880,
"end_time": 2520,
"fixed": true,
"punctuation": "",
"text": "阿里巴巴"
},
{
"begin_time": 2520,
"end_time": 2840,
"fixed": true,
"punctuation": "",
"text": "语音"
},
{
"begin_time": 2840,
"end_time": 3800,
"fixed": true,
"punctuation": "。",
"text": "实验室"
}
]
},
"text": "Hello World,这里是阿里巴巴语音实验室。"
},
"usage": {
"duration": 4
},
"request_id": "40e0734d-096f-9ae3-86c1-a8c013287561"
}说明:部分上游版本可能将句子信息嵌套在
output.output.sentence中;无论采用哪种结构,完整识别文本均可通过output.text获取。
流式响应
当请求头 X-DashScope-SSE: enable 时,服务端以 Server-Sent Events(SSE)协议返回识别结果。仅当音频时长不少于 1 分钟时,服务端才会分多次返回中间识别结果和最终结果。
上游 SSE 事件格式:
plaintext
id:{序列号}
event:result
:HTTP_STATUS/200
data:{JSON数据}上游返回示例:
plaintext
id:1
event:result
:HTTP_STATUS/200
data:{"output":{"sentence":{"sentence_id":1,"sentence_end":true,"end_time":3800,"words":[{"end_time":1040,"punctuation":"","begin_time":760,"fixed":true,"text":"Hello"},{"end_time":1240,"punctuation":",","begin_time":1040,"fixed":true,"text":" World"},{"end_time":1880,"punctuation":"","begin_time":1360,"fixed":true,"text":"这里是"},{"end_time":2520,"punctuation":"","begin_time":1880,"fixed":true,"text":"阿里巴巴"},{"end_time":2840,"punctuation":"","begin_time":2520,"fixed":true,"text":"语音"},{"end_time":3800,"punctuation":"。","begin_time":2840,"fixed":true,"text":"实验室"}],"begin_time":760,"text":"Hello World,这里是阿里巴巴语音实验室。","channel_id":0},"text":"Hello World,这里是阿里巴巴语音实验室。"},"usage":{"duration":4},"request_id":"fc1582e4-935c-9fc2-a482-a98bf43daa69"}经网关转发时,
id、event等控制行会被过滤,客户端只需按data:行解析 JSON。
处理要点:
- 每收到一个 SSE 事件,解析
data字段中的 JSON。 - 通过
output.sentence.sentence_end判断当前句子是否结束:为true时该句识别完成,词级时间戳已稳定,可作为最终结果使用;为false时识别仍在进行中,文本和时间戳可能在后续事件中更新。 usage仅在句子结束事件中返回,可用于计量音频处理时长。qwen-audio-3.1-asr-flash开启说话人分离时,应读取output.sentences获取当前及历史句子的结果。
支持模型
支持模型Id:
- qwen-audio-3.1-asr-flash
- qwen-audio-3.0-asr-flash
