Appearance
RESTful API
The parameters and API details for Paraformer audio file recognition RESTful API. Important
This document applies only to the China (Beijing) region. To use the model, you must use an API key from the China (Beijing) region. User guide: For an overview of models and how to select them, see Audio file recognition - Fun-ASR/Paraformer.
The service provides a task submission interface and a task query interface. Typically, you call the task submission interface to upload a recognition task and then repeatedly call the task query interface until the task is complete.
Prerequisites
You have activated the Model Studio and created an API key. Export it as an environment variable (not hard-coded) to prevent security risks. Note
For temporary access or strict control over high-risk operations (accessing/deleting sensitive data), use a temporary authentication token instead.
Compared with long-term API keys, temporary tokens are more secure (60-second lifespan) and reduce API key leakage risk.
To use a temporary token, replace the API key used for authentication in your code with the temporary authentication token.
Task submission interface
Basic information
API endpoint description Submits a speech recognition task. URL
http
https://dashscope.aliyuncs.com/api/v1/services/audio/asr/transcriptionRequest method POST Request headers
http
Authorization: Bearer {api-key} // Replace {api-key} with your API key.
Content-Type: application/json
X-DashScope-Async: enable // Do not omit this request header. Otherwise, the task cannot be submitted.Message body The following code shows a message body that contains all request parameters. You can omit optional fields as needed.
json
{
"model":"paraformer-v2", // The model name. This parameter is required.
"input":{
"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"
\] // The file to be recognized. This parameter is required.
},
"parameters":{
"channel_id":\[
0
\], // The audio track index. This parameter is optional.
"disfluency_removal_enabled":false, // The switch for filtering filler words. This parameter is optional.
"timestamp_alignment_enabled": false, // Specifies whether to enable the timestamp calibration feature. This parameter is optional.
"special_word_filter": "xxx", // The sensitive words. This parameter is optional.
"language_hints":\[ // This parameter is applicable only to the paraformer-v2 model. Do not use this field for other models.
"zh",
"en"
\],
"diarization_enabled":false, // Specifies whether to enable automatic speaker diarization. This parameter is optional.
"speaker_count": 2 // The reference number of speakers. This parameter is optional.
}
}Request parameters
Click to view a request example cURL example for task submission interface:
HELPCODEESCAPE-curl
curl --location 'https://dashscope.aliyuncs.com/api/v1/services/audio/asr/transcription' \
--header "Authorization: Bearer $DASHSCOPE_API_KEY" \
--header "Content-Type: application/json" \
--header "X-DashScope-Async: enable" \
--data '{"model":"paraformer-v2","input":{"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"]},"parameters":{"channel_id":[0]}}'Parameter Type Default value Required Description model string - Yes The name of the Paraformer model that is used for audio and video file transcription. For more information, see models. file_urls array[string] - Yes List of URLs for audio and video file transcription (HTTP/HTTPS). Maximum 100 URLs per request.
**
**Important ** If a URL contains spaces, Chinese characters, or other special characters, URL-encode it before use (for example, replace spaces with %20). Otherwise, the download may fail with an InvalidFile.DownloadFailed error.
If your audio files are stored in OSS, the RESTful API supports temporary URLs that start with the oss:// prefix.
**
**Important **
The temporary URL is valid for 48 hours and cannot be used after it expires. Do not use it in a production environment.
The API for obtaining an upload credential is limited to 100 QPS and does not support scaling out. Do not use it in production environments, high-concurrency scenarios, or stress testing scenarios.
For production environments, use a stable storage service such as OSS to ensure long-term file availability and avoid rate limiting issues.
vocabulary_id string - No Custom vocabulary ID. Supported by v2+ models with language configurations. Hotwords for this ID apply to current speech recognition. Disabled by default. For usage, see Custom hotwords. channel_id array[integer] [0] No Specifies the indexes of the audio tracks in a multi-track audio file to recognize. The index starts from 0. For example, [0] indicates that only the first track is recognized, and [0, 1] indicates that both the first and second tracks are recognized. If you omit this parameter, the first track is processed by default.
**
**Important ** Each specified audio track is billed separately. For example, a request for [0, 1] for a single file incurs two separate charges.
disfluency_removal_enabled boolean false No Filters filler words. Disabled by default. timestamp_alignment_enabled boolean false No Enables timestamp alignment feature. Disabled by default. special_word_filter string - No Specifies the sensitive words to be processed during speech recognition and supports different processing methods for different sensitive words. If you do not pass this parameter, the system enables its built-in sensitive word filtering logic. Any words in the detection results that match the Alibaba Cloud Model Studio sensitive word list (Chinese) are replaced with an equal number of * characters. If this parameter is passed, the following sensitive word processing strategies can be implemented:
- Replace with
*: Replaces the matched sensitive words with an equal number of asterisks (*). - Direct filtering: Completely removes matching sensitive words from the recognition results. The value of this parameter must be a JSON string with the following structure:
json
{
"filter_with_signed": {
"word_list": \["test"\]
},
"filter_with_empty": {
"word_list": \["start", "happen"\]
},
"system_reserved_filter": true
}JSON field description:
filter_with_signed<li>Type: object.Required: No.
Description: Configures the list of sensitive words to be replaced with
*. Matched words in the recognition results are replaced with an equal number of asterisks (*).Example: Based on the preceding JSON, the speech recognition result for "Help me <u>test</u> this code" will be "Help me <u>**</u> this code".
Internal field: <li>
word_list: A string array that lists the sensitive words to be replaced. </li> </li>filter_with_empty<li>Type: object.Required: No.
Description: Configures the list of sensitive words to be removed (filtered) from the recognition results. Matched words in the recognition results are completely deleted.
Example: Based on the preceding JSON, the speech recognition result for "Is the match about to <u>start</u> now?" will be "Is the match about to now?".
Internal field: <li>
word_list: A string array that lists the sensitive words to be completely removed (filtered). </li> </li>system_reserved_filter<li>Type: Boolean value.Required: No.
Default value: true.
Description: Specifies whether to enable the system-predefined sensitive word rule. If this parameter is set to
true, the system's built-in sensitive word filtering logic is also enabled, and words in the detection results that match the Alibaba Cloud Model Studio sensitive word list (Chinese) are replaced with an equal-length string of*characters. </li>language_hints array[string] ["zh", "en"] No Specifies the language codes of the speech to be recognized. This parameter is applicable only to the paraformer-v2 model. Supported language codes:
zh: Chinese
en: English
ja: Japanese
yue: Cantonese
ko: Korean
de: German
fr: French
ru: Russian
diarization_enabled boolean false No Automatic speaker diarization. This feature is disabled by default. This feature is applicable only to mono audio. Multi-channel audio does not support speaker diarization. When this feature is enabled, the recognition results will display a
speaker_idfield to distinguish different speakers.
**
**Note ** If you enable speaker diarization, keep the audio duration under 2 hours. Exceeding this limit may cause recognition failures or timeouts.
For an example of speaker_id, see Recognition result description. speaker_count integer - No Reference value for speaker count (integer from 2 to 100, inclusive).Takes effect when diarization_enabled is true.Speaker count is automatically determined by default. Configuring this parameter assists the algorithm in targeting the specified count but does not guarantee exact output.
Response parameters
Click to view a response example
HELPCODEESCAPE-json
{
"output": {
"task_status": "PENDING",
"task_id": "c2e5d63b-96e1-4607-bb91-************"
},
"request_id": "77ae55ae-be17-97b8-9942--************"
}| Parameter | Type | Description |
|---|---|---|
| task_status | string | The task status. |
| task_id | string | The task ID. This ID is passed as a request parameter in the task query interface . |
Task query interface
Basic information
API endpoint description Queries the status and result of a speech recognition task. URL
http
https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}Request method POST Request headers
http
Authorization: Bearer {api-key} // Replace {api-key} with your API key.Message body None.
Request parameters
Click to view a request example
HELPCODEESCAPE-curl
curl --location 'https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}' --header "Authorization: Bearer $DASHSCOPE_API_KEY"| Parameter | Type | Default value | Required | Description |
|---|---|---|---|---|
| task_id | string | - | Yes | Task ID required for query. Returned by the task submission interface . |
Response parameters
Click to view a response example If a task contains multiple subtasks, the status of the entire task is marked as SUCCEEDED if any subtask succeeds. You must check the subtask_status field to determine the result of each subtask.
Normal example
HELPCODEESCAPE-json
{
"request_id": "f9e1afad-94d3-997e-a83b-************",
"output": {
"task_id": "f86ec806-4d73-485f-a24f-************",
"task_status": "SUCCEEDED",
"submit_time": "2024-09-12 15:11:40.041",
"scheduled_time": "2024-09-12 15:11:40.071",
"end_time": "2024-09-12 15:11:40.903",
"results": [
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_male2.wav",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/pre/filetrans-16k/20240912/15%3A11/3bdf7689-b598-409d-806a-121cff5e4a31-1.json?Expires=1726211500&OSSAccessKeyId=yourOSSAccessKeyId&Signature=Fj%2BaF%2FH0Kayj3w3My2ECBeP****%3D",
"subtask_status": "SUCCEEDED"
},
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/paraformer/hello_world_female2.wav",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/pre/filetrans-16k/20240912/15%3A11/409a4b92-445b-4dd8-8c1d-f110954d82d8-1.json?Expires=1726211500&OSSAccessKeyId=yourOSSAccessKeyId&Signature=v5Owy5qoAfT7mzGmQgH0g8C****%3D",
"subtask_status": "SUCCEEDED"
}
],
"task_metrics": {
"TOTAL": 2,
"SUCCEEDED": 2,
"FAILED": 0
}
},
"usage": {
"duration": 9
}
}Exception example
The code parameter indicates the error code, and the message parameter indicates the error message. These two fields appear only in exception cases. You can use these fields to troubleshoot problems by referring to the error codes.
HELPCODEESCAPE-json
{
"task_id": "7bac899c-06ec-4a79-8875-xxxxxxxxxxxx",
"task_status": "SUCCEEDED",
"submit_time": "2024-12-16 16:30:59.170",
"scheduled_time": "2024-12-16 16:30:59.204",
"end_time": "2024-12-16 16:31:02.375",
"results": [
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/long_audio_demo_cn.mp3",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/prod/paraformer-v2/20241216/xxxx",
"subtask_status": "SUCCEEDED"
},
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_exaple_1.wav",
"code": "InvalidFile.DownloadFailed",
"message": "The audio file cannot be downloaded.",
"subtask_status": "FAILED"
}
],
"task_metrics": {
"TOTAL": 2,
"SUCCEEDED": 1,
"FAILED": 1
}
}| Parameter | Type | Description |
|---|---|---|
| task_id | string | The ID of the queried task. |
| task_status | string | The status of the queried task. ** **Note ** For tasks with multiple subtasks, task_status shows SUCCEEDED if any subtask succeeds. Check the subtask_status field to determine individual subtask results. |
| subtask_status | string | The subtask status. |
| file_url | string | The URL of the file that is processed in the file transcription task. |
| transcription_url | string | Link to obtain recognition result (valid 24 hours). After expiration, task queries and result downloads fail.Recognition result is saved as JSON. Download from this link or read directly via HTTP request.For JSON field details, see Recognition result description . |
Recognition result description
The recognition result is saved as a JSON file. Click to view recognition result example
HELPCODEESCAPE-json
{
"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":3720,
"text":"Hello world, this is Alibaba Speech Lab.",
"sentences":[
{
"begin_time":100,
"end_time":3820,
"text":"Hello world, this is Alibaba Speech Lab.",
"sentence_id":1,
"speaker_id":0, //This field is only displayed when automatic speaker diarization is enabled.
"words":[
{
"begin_time":100,
"end_time":596,
"text":"Hello ",
"punctuation":""
},
{
"begin_time":596,
"end_time":844,
"text":"world",
"punctuation":", "
}
// Other content is omitted here.
]
}
]
}
]
}The following table describes the key parameters:
| Parameter | Type | Description |
|---|---|---|
| audio_format | string | The audio format in the source file. |
| channels | array[integer] | The audio track index information in the source file. Returns [0] for single-track audio, [0, 1] for dual-track audio, and so on. |
| original_sampling_rate | integer | The sample rate (Hz) of the audio in the source file. |
| original_duration | integer | The original audio duration (ms) in the source file. |
| channel_id | integer | The audio track index of the transcription result, starting from 0. |
| content_duration | integer | The duration (ms) of content determined to be speech in the audio track. ** **Important ** The Paraformer speech recognition model service only transcribes and charges for the duration of content determined to be speech in the audio track. Non-speech content is not measured or charged. Typically, the speech content duration is shorter than the original audio duration. Because an AI model determines whether speech content exists, discrepancies may occur. |
| transcript | string | The paragraph-level speech transcription result. |
| sentences | array | The sentence-level speech transcription result. |
| words | array | The word-level speech transcription result. |
| begin_time | integer | The start timestamp (ms). |
| end_time | integer | The end timestamp (ms). |
| text | string | The speech transcription result. |
| speaker_id | integer | The index of the current speaker, starting from 0, used to distinguish different speakers.This field is displayed in the recognition result only when speaker diarization is enabled. |
| punctuation | string | The predicted punctuation after the word, if any. |
Complete example
Use built-in HTTP libraries to implement task submission and query requests. First submit the recognition task, and then repeatedly query until complete.
The following code provides an example in Python:
HELPCODEESCAPE-python
import requests
import json
import time
api_key = "your-dashscope-api-key" # Replace this with your API key.
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"]
def submit_task(apikey, file_urls) -> str:
headers = {
"Authorization": f"Bearer {apikey}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable",
}
data = {
"model": "paraformer-v2",
"input": {"file_urls": file_urls},
"parameters": {
"channel_id": [0],
"language_hints": language_hints
},
}
# The URL of the recorded file transcription service.
service_url = (
"https://dashscope.aliyuncs.com/api/v1/services/audio/asr/transcription"
)
response = requests.post(
service_url, headers=headers, data=json.dumps(data)
)
# Print the response content.
if response.status_code == 200:
return response.json()["output"]["task_id"]
else:
print("task failed!")
print(response.json())
return None
# Recursively query the task status until the task is successful.
def wait_for_complete(task_id):
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json",
"X-DashScope-Async": "enable",
}
pending = True
while pending:
# The URL of the task status query service.
service_url = f"https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}"
response = requests.post(
service_url, headers=headers
)
if response.status_code == 200:
status = response.json()['output']['task_status']
if status == 'SUCCEEDED':
print("task succeeded!")
pending = False
return response.json()['output']['results']
elif status == 'RUNNING' or status == 'PENDING':
pass
else:
print("task failed!")
pending = False
else:
print("query failed!")
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("transcription result: ", result)Error codes
If you encounter an error, see Error messages for troubleshooting.
If the problem persists, join the developer group to report the issue and provide the Request ID for further investigation.
If a task contains multiple subtasks and any subtask succeeds, the overall task status is marked as SUCCEEDED. You must check the subtask_status field to determine the result of each subtask.
Error response example:
HELPCODEESCAPE-json
{
"task_id": "7bac899c-06ec-4a79-8875-xxxxxxxxxxxx",
"task_status": "SUCCEEDED",
"submit_time": "2024-12-16 16:30:59.170",
"scheduled_time": "2024-12-16 16:30:59.204",
"end_time": "2024-12-16 16:31:02.375",
"results": [
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/long_audio_demo_cn.mp3",
"transcription_url": "https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/prod/paraformer-v2/20241216/xxxx",
"subtask_status": "SUCCEEDED"
},
{
"file_url": "https://dashscope.oss-cn-beijing.aliyuncs.com/samples/audio/sensevoice/rich_text_exaple_1.wav",
"code": "InvalidFile.DownloadFailed",
"message": "The audio file cannot be downloaded.",
"subtask_status": "FAILED"
}
],
"task_metrics": {
"TOTAL": 2,
"SUCCEEDED": 1,
"FAILED": 1
}
}More examples
For more examples, see our GitHub repository.
FAQ
Features
Q: Is Base64 encoded audio supported?
No, it is not. The service only supports recognition of audio from URLs that are accessible over the internet. It does not support binary streams or local files.
Q: How can I provide audio files as publicly accessible URLs?
Follow these general steps. The specific process may vary depending on the storage product you use. We recommend uploading audio to OSS. 1. Choose a storage and hosting method You can use methods such as the following:
Object Storage Service (OSS) (recommended):
Use an Object Storage Service such as Alibaba Cloud OSS, upload audio files to a bucket, and set them for public access.
Advantages: High availability, supports content delivery network (CDN) acceleration, easy to manage.
Web server:
Place audio files on a web server that supports HTTP/HTTPS access, such as Nginx or Apache.
Advantages: Suitable for small projects or local testing.
Content delivery network (CDN):
Host audio files on a CDN and access them through URLs provided by the CDN.
Advantages: Accelerates file transfer, suitable for high concurrency scenarios.
2. Upload audio files Upload the audio files based on your chosen storage method. For example:
Object Storage Service:
Log in to the cloud service provider's console and create a bucket.
Upload audio files and set file permissions to "public-read" or generate temporary access links.
Web server:
Place audio files in a specified directory on the server, such as
/var/www/html/audio/.Ensure files can be accessed via HTTP/HTTPS.
3. Generate publicly accessible URLs For example:
Object Storage Service:
After file upload, the system automatically generates a public access URL, typically in the format
https://<bucket-name>.<region>.aliyuncs.com/<file-name>.If you need a more friendly domain name, you can bind a custom domain name and enable HTTPS.
Web server:
- The file access URL is typically the server address plus the file path, such as
https://your-domain.com/audio/file.mp3.
- The file access URL is typically the server address plus the file path, such as
CDN:
- After you configure CDN acceleration, use the URL provided by the CDN, such as
https://cdn.your-domain.com/audio/file.mp3.
- After you configure CDN acceleration, use the URL provided by the CDN, such as
4. Verify URL availability Verify that the generated URL is publicly accessible. For example:
In a browser, open the URL and check if the audio file can be played.
Use a tool, such as
curlor Postman, to verify if the URL returns the correct HTTP response (status code 200).
When using the SDK to access a file stored in OSS, you cannot use a temporary URL with the oss:// prefix.
When using the RESTful API to access a file stored in OSS, you can use a temporary URL with the oss:// prefix: Important
The temporary URL is valid for 48 hours and cannot be used after it expires. Do not use it in a production environment.
The API for obtaining an upload credential is limited to 100 QPS and does not support scaling out. Do not use it in production environments, high-concurrency scenarios, or stress testing scenarios.
For production environments, use a stable storage service such as OSS to ensure long-term file availability and avoid rate limiting issues.
Q: How long does it take to obtain the recognition results?
After a task is submitted, it enters the PENDING state. The queuing time depends on the queue length and file duration and cannot be precisely determined, but it is typically within a few minutes. Longer audio files require more processing time.
Troubleshooting
If you encounter an error, refer to the information in Error codes.
Q: What should I do if the recognition results are not synchronized with the audio playback?
Set timestamp_alignment_enabled request parameter to true. This synchronizes recognition results with audio playback.
Q: What should I do if I get an InvalidFile.DownloadFailed error after submitting a task?
Check whether the file URL contains spaces, Chinese characters, or other special characters. If the file name includes spaces (for example, "Meeting Recording Q1 2024.mp4"), URL-encode the file name by replacing spaces with %20 before passing it to the file_urls parameter.
Q: What do I do if the temporary public access URL of an OSS audio file is inaccessible?
Set X-DashScope-OssResourceResolve to enable in headers.
Not recommended.
The Java SDK and the Python SDK don't support configuring headers.
Q: Why can't I obtain a result after continuous polling?
This may be due to rate limiting. To request a quota increase, join the developer group.
Q: Why is the speech not recognized (no recognition result)?
Check whether the audio meets the format and sample rate requirements.
If you are using the
paraformer-v2model, check whether thelanguage_hintsparameter is set correctly.If the previous checks do not resolve the issue, you can use custom hotwords to improve the recognition of specific words.
More questions
For more questions, see the FAQ on GitHub.