异步 HTTP 接口
异步 HTTP 接口是一个用于长时间音频转写的非阻塞 HTTP API。
要使用此 API,请执行以下步骤:
- 创建语音识别Job
- 轮询检查语音识别Job的状态并获取结果
关于新版本
我们于 2025 年 7 月 15 日发布了新版本的异步 HTTP 接口(以下简称"v2"),大幅提高了语音识别处理速度。语音识别的精度与传统版本的异步 HTTP 接口(v1)没有区别。如果没有必须使用 v1 的理由,建议使用 v2。
- 传统版本 v1 计划在 2026 年 12 月 25 日(原定: 2026 年 7 月 31 日)左右停止使用。当前使用者请迁移到 v2。(结束时间可能会有变更)(2026 年 3 月 3 日修正:延长结束时间)
- v2 目前无法使用情感分析功能。如需使用情感分析,请使用 v1。v2 的情感分析功能预计最迟将于 2026 年 7 月 31 日前实现。(实现时间可能会有变更)
特点
v2 的主要特点如下。传统方式是对整个音频进行串行处理,因此处理时间与音频长度成正比。v2 通过考虑语音段的切分点,将音频分割成适当长度并行处理,从而比传统方式更快完成处理。
| 项目 | 传统版 (v1) | 新版 (v2) |
|---|---|---|
| 处理方式 | 对整个音频串行处理 | 考虑语音段切分点,将音频分割成适当长度并行处理 |
| 处理时间估算 | 与音频长度成正比(约 0.3-1 倍) | 对于 90 分钟以内的音频数据,基本为固定时间 (例:90 分钟音频 ⇒ 约 5~6 分钟) |
| 说话人区分 | 与音频长度成正比(约 5%) | 与音频长度成正比(约 5%) |
- 进行说话人区分时,除了语音识别处理外,还需要与传统方式相同的说话人区分处理时间。
- 目前语音识别处理时间对于 90 分钟以内的音频数据基本为固定时间,超过这个长度的数据处理时间会逐渐延长。但是,由于服务器的繁忙状况等原因,处理时间可能会变长。
- 对于短音频数据,处理时间可能不会加快,某些情况下甚至可能会略微变慢。
使用方法
只有端点发生变化,其他与 v1 相同。
(v1)https://acp-api-async.amivoice.com/v1/recognitions
(v2)https://acp-api-async.amivoice.com/v2/recognitions
与传统版本的区别
v2 对以下请求的响应有所变化:
- a. 对于发送的音频数据中不存在语音段的情况,v1 会成功注册 Job 并在处理后返回结果不存在的信息,而 v2 会在 Job 注册时返回失败。
- b. 对于请求不支持的音频文件,以及设置了无效的说话人区分参数的情况,错误响应中也会返回"text"和"utteranceid"。
b 情况的示例: v1
{
"results": [{ "tokens": [], "tags": [], "rulename": "", "text": "" }],
"code": "+",
"message": "received unsupported audio format"
}
v2
{
"text": "",
"utteranceid":"test_data",
"results": [{"tokens": [], "tags": [], "rulename": "", "text": ""}],
"code": "+",
"message": "received unsupported audio format",
}
使用方法
1. 创建语音识别Job
Job创建的 API 请求与同步 HTTP 接口相同,设置请求参数,并将请求发送到异步 HTTP 接口的 endpoint。
v2(新版)的情况
POST https://acp-api-async.amivoice.com/v2/recognitions
v1(传统版)的情况
POST https://acp-api-async.amivoice.com/v1/recognitions
以下主要说明 v2 的情况。使用 v1 时,请适当替换端点。 例如,要使用 curl 命令发送音频文件 test.wav 的语音识别请求,不保存日志,可以执行以下操作:
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general loggingOptOut=True" \
-F a=@test.wav
虽然 endpoint 与同步 HTTP 接口不同,但请求参数的设置方法相同。
某些参数(如情绪分析)仅支持异步 HTTP 接口。
与同步 HTTP 接口不同,日志保存的有无不是通过 endpoint 指定,而是通过请求参数指定。
默认情况下会保存日志。要不保存日志,请在 d 参数中指定 loggingOptOut=True。
成功时
成功时的响应包含 sessionid。这是用户语音识别请求的Job ID,用于检查Job状态和获取结果。
text 始终返回 "..."。
示例
{"sessionid":"017ac8786c5b0a0504399999","text":"..."}
失败时
失败时的响应不包含 sessionid。可以通过 code 和 message 判断失败原因。
请参阅响应代码和消息。
示例
{
"results": [{ "tokens": [], "tags": [], "rulename": "", "text": "" }],
"text": "",
"code": "-",
"message": "received illegal service authorization"
}
2. 检查语音识别Job状态并获取结果
语音识别请求成功后,请检查Job状态并轮询直到 status 变为 completed 或 error。
获取Job状态
Job在服务器端按顺序执行。要检查Job状态或获取结果,请使用 endpoint GET /v2/recognitions/{session_id} 以获取结果。
将 sessionid 设置为Job创建时获得的Job ID。将请求参数中的认证信息(authorization)指定在 Authorization header 中。
使用 curl 执行时,可以执行以下操作。这里假设 sessionid 是 017c25ec12c00a304474a999。
curl -H "Authorization: Bearer {APPKEY}" \
https://acp-api-async.amivoice.com/v2/recognitions/017c25ec12c00a304474a999
queued 状态
发送请求后,status 最初处于 queued 状态。
{"service_id":"{YOUR_SERVICE_ID}","session_id":"017c25ec12c00a304474a999","status":"queued"}
started 状态
当Job从队列中取出时,status 变为 started 状态。
从 queued 到 started 状态可能需要几十秒到几分钟,具体取决于服务器的繁忙程度等因素。
{"service_id":"{YOUR_SERVICE_ID}","session_id":"017c25ec12c00a304474a999","status":"started"}
processing 状态
实际开始语音识别处理时,status 变为 processing 状态。请参阅以下示例。为了提高可读性,这里对结果进行了换行。
可以使用 API 接收的音频大小(audio_size)和 MD5 校验和(audio_md5)来确认音频是否正确传输。
从 processing 到下一个 completed 状态所需的时间取决于音频长度,但对于 v2,由于将音频数据分割成适当长度的块进行处理,通常需要分割后音频长度的 0.5~1.5 倍左右的时间。分割的数量和分割块的长度取决于音频数据的长度和其中包含的语音时间长度。如果语音时间长度较短,通常会分割成约 1 分钟的长度。
请注意,如果还进行说话人区分或情感分析,则需要额外的处理时间,因此会比上述时间更长。
{
"audio_md5":"40f59fe5fc7745c33b33af44be43f6ad",
"audio_size":306980,
"service_id":"{YOUR_SERVICE_ID}",
"session_id":"017c25ec12c00a304474a999",
"status":"processing"
}
completed 状态
语音识别完成后,status 变为 completed 状态。此时,可以从响应的 results 和 segments 中获取语音识别结果。结果会在语音识别服务器处理完成后在服务器上保存一段时间。保存期限请参阅异步 HTTP 接口的限制中的"语音识别结果保存期限"。
有关包含识别结果的响应详细信息,请参阅语音识别结果。
如果访问超过一定时间后删除的结果,将出现 404 NOT FOUND 错误。有关错误的信息,请参阅参考文档中的错误响应列表。
error 状态
如果由于某种原因语音识别失败,status 将变为 error 状态。此时,error_messsage 将设置错误原因。
示例:
{
"status": "error",
"audio_md5":"40f59fe5fc7745c33b33af44be43f6ad",
"audio_size":306980,
"service_id":"{YOUR_SERVICE_ID}",
"session_id":"017c25ec12c00a304474a999",
"error_message": "ERROR: Failed to transcribe in recognition process - amineth_result=0, amineth_code='o', amineth_message='recognition result is rejected because confidence is below the threshold'"
}
error_message 可能包含 amineth_code='{响应代码}' 和 amineth_message='{错误消息}'。详细信息请参阅响应代码和消息详细信息中的表。
特别是当错误消息包含 amineth_code='o' 时,表示客户端请 求方法或音频文件有问题,重试也会得到相同的结果。详细信息请参阅"拒绝 (响应代码=o)"。对于 o 以外的错误,可能是 AmiVoice API 基础设施的问题,请稍等片刻后重试。
结果
语音识别完成后,status 变为 completed 状态。此时,可以在 results 中获取语音识别结果。为了使结果更易读,我们使用 jq 命令。
curl -H "Authorization: Bearer {APPKEY}" \
https://acp-api-async.amivoice.com/v2/recognitions/017c25ec12c00a304474a999 | jq
以下是完整的响应示例。除了转写结果,还可以获得单词级别的结果、音频时间和置信度等信息。详细信息请参阅语音识别结果。
响应
{
"audio_md5": "40f59fe5fc7745c33b33af44be43f6ad",
"audio_size": 306980,
"results": {
"code": "",
"message": "",
"segments": [
{
"code": "",
"message": "",
"results": [
{
"confidence": 1.0,
"endtime": 8778,
"rulename": "",
"starttime": 250,
"tags": [],
"text": "アドバンスト・メディアは、人と機械等の自然なコミュニケーションを実現し、豊かな未来を創造していくことをめざします。",
"tokens": [
{
"confidence": 1.0,
"endtime": 1578,
"spoken": "あどばんすとめでぃあ",
"starttime": 570,
"written": "アドバンスト・メディア"
},
{
"confidence": 1.0,
"endtime": 1850,
"spoken": "は",
"starttime": 1578,
"written": "は"
},
{
"confidence": 0.77,
"endtime": 2010,
"spoken": "_",
"starttime": 1850,
"written": "、"
},
{
"confidence": 1.0,
"endtime": 2314,
"spoken": "ひと",
"starttime": 2010,
"written": "人"
},
{
"confidence": 1.0,
"endtime": 2426,
"spoken": "と",
"starttime": 2314,
"written": "と"
},
{
"confidence": 1.0,
"endtime": 2826,
"spoken": "きかい",
"starttime": 2426,
"written": "機械"
},
{
"confidence": 0.76,
"endtime": 2922,
"spoken": "とう",
"starttime": 2826,
"written": "等"
},
{
"confidence": 1.0,
"endtime": 3082,
"spoken": "の",
"starttime": 2922,
"written": "の"
},
{
"confidence": 1.0,
"endtime": 3434,
"spoken": "しぜん",
"starttime": 3082,
"written": "自然"
},
{
"confidence": 1.0,
"endtime": 3530,
"spoken": "な",
"starttime": 3434,
"written": "な"
},
{
"confidence": 1.0,
"endtime": 4362,
"spoken": "こみゅにけーしょん",
"starttime": 3530,
"written": "コミュニケーション"
},
{
"confidence": 1.0,
"endtime": 4442,
"spoken": "を",
"starttime": 4362,
"written": "を"
},
{
"confidence": 1.0,
"endtime": 4906,
"spoken": "じつげん",
"starttime": 4442,
"written": "実現"
},
{
"confidence": 1.0,
"endtime": 5242,
"spoken": "し",
"starttime": 4906,
"written": "し"
},
{
"confidence": 0.83,
"endtime": 5642,
"spoken": "_",
"starttime": 5242,
"written": "、"
},
{
"confidence": 1.0,
"endtime": 5978,
"spoken": "ゆたか",
"starttime": 5642,
"written": "豊か"
},
{
"confidence": 1.0,
"endtime": 6090,
"spoken": "な",
"starttime": 5978,
"written": "な"
},
{
"confidence": 1.0,
"endtime": 6490,
"spoken": "みらい",
"starttime": 6090,
"written": "未来"
},
{
"confidence": 1.0,
"endtime": 6554,
"spoken": "を",
"starttime": 6490,
"written": "を"
},
{
"confidence": 0.92,
"endtime": 7034,
"spoken": "そうぞう",
"starttime": 6554,
"written": "創造"
},
{
"confidence": 1.0,
"endtime": 7210,
"spoken": "して",
"starttime": 7034,
"written": "して"
},
{
"confidence": 1.0,
"endtime": 7402,
"spoken": "いく",
"starttime": 7210,
"written": "いく"
},
{
"confidence": 0.8,
"endtime": 7674,
"spoken": "こと",
"starttime": 7402,
"written": "こと"
},
{
"confidence": 1.0,
"endtime": 7706,
"spoken": "を",
"starttime": 7674,
"written": "を"
},
{
"confidence": 0.78,
"endtime": 7962,
"spoken": "めざ",
"starttime": 7706,
"written": "めざ"
},
{
"confidence": 0.78,
"endtime": 8490,
"spoken": "します",
"starttime": 7962,
"written": "します"
},
{
"confidence": 0.83,
"endtime": 8778,
"spoken": "_",
"starttime": 8490,
"written": "。"
}
]
}
],
"text": "アドバンスト・メディアは、人と機械等の自然なコミュニケーションを実現し、豊かな未来を創造していくことをめざします。"
}
],
"text": "アドバンスト・メディアは、人と機械等の自然なコミュニケーションを実現し、豊かな未来を創造していくことをめざします。",
"utteranceid": "20210927/06/017c25ed38cc0a30425239d0_20210927_062436[nolog]"
},
"service_id": "{YOUR_SERVICE_ID}",
"session_id": "017c25ec12c00a304474a999",
"status": "completed"
}
内容 ID
在请求时,可以在 d 参数的 contentId 中自由设置字符串。例如,可以设置应用程序生成的 ID、文件名、用户等信息,以便稍后作为识别结果的一部分获取这些信息。
例如,要使用 curl 命令将文件名设置为 contentId 并发送请求,可以执行以下操作:
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general loggingOptOut=True contentId=test.wav" \
-F a=@test.wav
获取Job状态或结果时,响应中将包含 content_id,如下所示:
{"content_id":"test.wav","service_id":"{YOUR_SERVICE_ID}","session_id":"017c25ec12c00a304474a999","status":"queued"}
示例代码
以下是使用 Python 的异步 HTTP 接口典型处理流程的示例代 码。
请求参数
执行需要 AmiVoice API 的 APPKEY。请在以下行中设置您自己的 AmiVoice API APPKEY。
app_key = 'TODO: Please set APPKEY here'
决定要在 d 参数中设置的选项。这里我们设置如下:
- 引擎:通用 (
grammarFileNames=-a-general) - 日志保存:无 (
loggingOptOut=True) - 内容 ID:文件名 (
contentId=filename) - 说话人区分:启用 (
speakerDiarization=True) - 说话人数:最大=最小=2 (
diarizationMinSpeaker=2,diarizationMaxSpeaker=2) - 情绪分析: 禁用 (
sentimentAnalysis=False)