Skip to main content
Paraformer

Paraformer non-real-time speech recognition Python SDK

Use the Paraformer Python SDK to transcribe audio and video files with the DashScope API.

Paraformer models are available only in the China North 2 (Beijing) region. Use an API key created in that region. See Regions and endpoints.
User guide:Non-real-time speech recognition

Prerequisites

When you need to provide temporary access to third-party applications or users, or when you want to strictly control high-risk operations such as accessing or deleting sensitive data, we recommend using temporary authentication tokens.Compared with long-term API Keys, temporary authentication tokens have a short validity period (60 seconds) and higher security, making them suitable for temporary call scenarios and effectively reducing the risk of API Key leakage.Usage: In your code, replace the API Key originally used for authentication with the obtained temporary authentication token.

Getting started

The core resource (client.audio.asr) provides interfaces for async task submission, synchronous wait for task completion, and async result query (one-step transcribe, or step-by-step jobs.create + jobs.wait + jobs.fetch). You can use either of the following two calling approaches for non-real-time speech recognition:
  • Async submission + sync wait: Submit a task and block until it completes and returns the result.
  • Async submission + async polling: Submit a task and poll for results at any time.

Async submission + sync wait

image
  1. Call the core resource (client.audio.asr) (jobs.create/transcribe) and set the request parameters.
  • The file transcription service processes tasks submitted through the API on a best-effort basis. After submission, a task enters the queued (PENDING) state. The queue time depends on the queue length and file duration and cannot be precisely estimated, but typically completes within a few minutes. Once processing begins, speech recognition completes at several hundred times the real-time speed.
    • After each task completes, the recognition result and URL download link are valid for 24 hours. After expiration, you cannot query the task or download results through the previously provided URL.
  1. Call the core resource (client.audio.asr) (jobs.wait, or the one-step transcribe) to wait synchronously for the task to complete. Task statuses: PENDING, RUNNING, SUCCEEDED, FAILED. The wait call blocks during PENDING or RUNNING. When the task reaches SUCCEEDED or FAILED, wait returns the result. jobs.wait returns the final-state Job (for the structure, see Response).
import os
import json
import dashscope

# If you have not configured the API Key in an environment variable, replace the following line with your own API Key: api_key="sk-xxx"
# China North 2 (Beijing). This model is available only in this region.
# API keys are region-specific. See https://docs.qwencloud.com/developer-guides/getting-started/regions
client = dashscope.Client(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://cn-beijing.maas.qwencloudapi.com/api/v1",
)

# Submit the recorded file recognition task and wait synchronously for the task to complete
job = client.audio.asr.transcribe(
    ['{YOUR_AUDIO_URL}'],
    model='paraformer-v2',
    parameters={'language_hints': ['zh', 'en']}  # The "language_hints" parameter only supports the paraformer-v2 model.
)

print(json.dumps(job.model_dump(), indent=4, ensure_ascii=False))
print('transcription done!')
  • dashscope CLI
# Submit a recorded file recognition task
export DASHSCOPE_API_KEY="your-api-key"
# China North 2 (Beijing). This model is available only in this region.
# API keys are region-specific. See https://docs.qwencloud.com/developer-guides/getting-started/regions
export DASHSCOPE_HTTP_BASE_URL="https://cn-beijing.maas.qwencloudapi.com/api/v1"
dashscope transcription create -m paraformer-v2 --file-url "https://example.com/audio.mp3"
# Query the task list
dashscope transcription list

Async submission + async polling

image
  1. Call the core resource (client.audio.asr) (jobs.create/transcribe) and set the request parameters.
  • The file transcription service processes tasks submitted through the API on a best-effort basis. After submission, a task enters the queued (PENDING) state. The queue time depends on the queue length and file duration and cannot be precisely estimated, but typically completes within a few minutes. Once processing begins, speech recognition completes at several hundred times the real-time speed.
    • After each task completes, the recognition result and URL download link are valid for 24 hours. After expiration, you cannot query the task or download results through the previously provided URL.
  1. Poll the core resource (client.audio.asr) (jobs.fetch) until the task completes. Stop polling when the status is SUCCEEDED or FAILED and process the result. jobs.fetch returns a Job (for the structure, see Response).
import os
import json
import dashscope

# If you have not configured the API Key in an environment variable, replace the following line with your own API Key: api_key="sk-xxx"
# China North 2 (Beijing). This model is available only in this region.
# API keys are region-specific. See https://docs.qwencloud.com/developer-guides/getting-started/regions
client = dashscope.Client(
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://cn-beijing.maas.qwencloudapi.com/api/v1",
)

# Submit the recorded file recognition task
job = client.audio.asr.jobs.create(
    model='paraformer-v2',
    file_urls=['{YOUR_AUDIO_URL}'],
    parameters={'language_hints': ['zh', 'en']}  # The "language_hints" parameter only supports the paraformer-v2 model.
)

# Poll the task until the final result is returned
while True:
    if job.status == 'SUCCEEDED' or job.status == 'FAILED':
        break
    job = client.audio.asr.jobs.fetch(job.task_id)

print(json.dumps(job.model_dump(), indent=4, ensure_ascii=False))
print('transcription done!')

Request parameters

Pass these parameters to the jobs.create/transcribe method of the core resource (client.audio.asr).
ParameterTypeDefaultRequiredDescription
modelstr-YesThe model name for Paraformer audio and video file transcription. Supported models.
file_urlslist[str]-YesA list of URLs for audio and video file transcription. The HTTP and HTTPS protocols are supported. A single request supports only 1 URL. If audio files are stored in Alibaba Cloud OSS, the SDK does not support temporary URLs with the oss:// prefix.
vocabulary_idstr-NoThe custom vocabulary ID. Supported for v2 series models; requires language configuration. Disabled by default. Custom Vocabularies.
channel_idlist[int][0]NoSpecifies the audio track indexes to recognize in a multi-track audio file. Indexes start from 0. For example, [0] means recognizing the first track, and [0, 1] means recognizing both the first and second tracks simultaneously. If this parameter is omitted, only the first track is processed by default. Tip: Each specified track is billed independently. For example, requesting [0, 1] for a single file incurs two separate charges.
disfluency_removal_enabledboolFalseNoFilters filler words. Disabled by default.
timestamp_alignment_enabledboolFalseNoEnables timestamp alignment. Disabled by default.
special_word_filterstr-NoSpecifies sensitive words to process during speech recognition and supports setting different processing methods for different sensitive words. If this parameter is not provided, the system uses the built-in sensitive word filtering logic, and words matching the QwenCloud sensitive word list in the recognition results will be replaced with * of equal length. If this parameter is provided, the following sensitive word processing strategies can be implemented:
  • Replace with *: Replace matching sensitive words with * of equal length.
  • Filter directly: Completely remove matching sensitive words from the recognition results.
The value of this parameter should be a JSON string with the following structure: See Example 1 below JSON field descriptions:
  • filter_with_signed
  • Type: Object.
  • Required: No.
  • Description: Configures the list of sensitive words to be replaced with *. Matching words in the recognition results will be replaced with * of equal length.
  • Example: Using the JSON above, the speech recognition result for "Help me test this code" would be "Help me **** this code".
  • Internal fields:
  • word_list: An array of strings listing the sensitive words to be replaced.
  • filter_with_empty
  • Type: Object.
  • Required: No.
  • Description: Configures the list of sensitive words to be removed (filtered) from the recognition results. Matching words will be completely deleted.
  • Example: Using the JSON above, the speech recognition result for "The game is about to start, right?" would be "The game is about to, right?".
  • Internal fields:
  • word_list: An array of strings listing the sensitive words to be completely removed (filtered).
  • system_reserved_filter
  • Type: Boolean.
  • Required: No.
  • Default: true.
  • Description: Whether to enable the system's built-in sensitive word rules. When set to true, the system's built-in sensitive word filtering logic is also enabled, and words matching the QwenCloud sensitive word list in the recognition results will be replaced with * of equal length.
language_hintslist[str]["zh", "en"]NoSpecifies the language codes of the speech to be recognized. This parameter is only applicable 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_enabledboolFalseNoAutomatic speaker diarization. Disabled by default. Only applicable to mono audio. Multi-channel audio does not support speaker diarization. When this feature is enabled, the recognition results will include a speaker_id field to distinguish different speakers. Note: If speaker diarization is enabled, it is recommended that the audio duration does not exceed 2 hours, otherwise recognition may fail or time out. For an example of speaker_id, see Description of recognition results.
speaker_countint-NoReference speaker count. Integer from 2 to 100. Takes effect only when diarization_enabled is true. Determined automatically by default. Setting this parameter guides the algorithm but does not guarantee the exact count.
Example 1 (Description):
{
  "filter_with_signed": {
    "word_list": ["test"]
  },
  "filter_with_empty": {
    "word_list": ["start", "happen"]
  },
  "system_reserved_filter": true
}

Response

Job

A Job contains the task basic information (task_id and status) and the execution result (results, see subtask recognition results, task_metrics, usage). The Job returned by jobs.create after task submission contains only task_id and status; the Job returned by jobs.fetch, jobs.wait (and the one-step transcribe) contains the task execution result.
The Job returned by jobs.create is as follows (the task is in the PENDING state after submission):
{
    "request_id":"251aceab-a6aa-9fc4-b7f7-0cc6d3e2a9f3",
    "task_id":"7d0a58a3-1dbe-4de9-8cff-5f48213128b0",
    "status":"PENDING"
}
The Job returned by jobs.fetch, jobs.wait (and the one-step transcribe) is as follows:
{
    "request_id":"251aceab-a6aa-9fc4-b7f7-0cc6d3e2a9f3",
    "task_id":"7d0a58a3-1dbe-4de9-8cff-5f48213128b0",
    "status":"PENDING",
    "task_metrics":{
        "TOTAL":1,
        "SUCCEEDED":0,
        "FAILED":0
    }
}
Key parameters:

Parameter

Description

request_id

The ID generated by the system to identify this call.

task_id

The task ID.

status

The task status.

The four statuses are PENDING, RUNNING, SUCCEEDED, and FAILED.

When a task contains multiple subtasks, if any subtask succeeds, the entire task status is marked as SUCCEEDED. Check the subtask_status field to determine the result of each specific subtask.

results

The recognition results of the subtasks. Each item contains file_url, transcription_url, and subtask_status. For more information, see subtask recognition results.

subtask_status

The subtask status.

The four statuses are PENDING, RUNNING, SUCCEEDED, and FAILED.

file_url

The URL of the audio file to be recognized.

transcription_url

The URL corresponding to the audio recognition result.

The recognition result is saved as a JSON file. Download the file from the URL in transcription_url or read its content via an HTTP request. For JSON file content details, see Recognition result description.

usage

The metering information, including duration (the audio duration, in seconds).

When a call fails, the Python SDK raises a DashScopeError exception. You can obtain the error code, HTTP status code, error message, and request ID via e.code/e.status_code/e.message/e.request_id. A subtask failure does not raise an exception; check subtask_status, code, and message in results instead.

results (subtask recognition results)

The results array holds the subtask recognition result for each audio file in the Job. Each item contains file_url, transcription_url, and subtask_status; when a subtask fails, it also contains code and message.
  • SUCCEEDED status
  • FAILED status
{
    "file_url":"{YOUR_AUDIO_URL}",
    "transcription_url":"https://dashscope-result-bj.oss-cn-beijing.aliyuncs.com/prod/paraformer-v2/20250213/17%3A59/70e737cc-bf8c-418b-b0c8-83fab192a0fa-1.json?Expires=1739527168&OSSAccessKeyId=YOUR_ACCESS_KEY_ID&Signature=YOUR_SIGNATURE",
    "subtask_status":"SUCCEEDED"
}
Important parameters:

Parameter

Description

code

The error code. Use with the message field. See Error codes.

message

The error message. Use with the code field. See Error codes.

subtask_status

The subtask status.

The four statuses are PENDING, RUNNING, SUCCEEDED, and FAILED.

file_url

The URL of the audio file to be recognized.

transcription_url

The URL corresponding to the audio recognition result.

The recognition result is saved in a JSON file. Download the file from transcription_url or read its content via an HTTP request. For JSON content details, see Recognition result description.

Recognition result description

The recognition result is saved as a JSON file.
{
    "file_url":"{YOUR_AUDIO_URL}",
    "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 the Alibaba speech laboratory.",
            "sentences":[
                {
                    "begin_time":100,
                    "end_time":3820,
                    "text":"Hello world, this is the Alibaba speech laboratory.",
                    "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 omitted here
                    ]
                }
            ]
        }
    ]
}
The key parameters are as follows:
ParameterTypeDescription
audio_formatstringThe audio format of the source file.
channelsarray[integer]The audio track index information of the source file. Returns [0] for mono audio, [0, 1] for dual-track audio, and so on.
original_sampling_rateintegerThe sampling rate (Hz) of the audio in the source file.
original_durationintegerThe original audio duration (ms) of the source file.
channel_idintegerThe audio track index of the transcription result, starting from 0.
content_durationintegerThe duration (ms) of content identified as speech in the audio track.
The Paraformer speech recognition model service only transcribes and meters content identified as speech in the audio track, and bills accordingly. Non-speech content is neither metered nor billed. Typically, the speech content duration is shorter than the original audio duration. Since the determination of whether speech content exists is made by an AI model, there may be some deviation from the actual situation.
transcriptstringThe paragraph-level speech transcription result.
sentencesarrayThe sentence-level speech transcription result.
wordsarrayThe word-level speech transcription result.
begin_timeintegerThe start timestamp (ms).
end_timeintegerThe end timestamp (ms).
textstringThe speech transcription result.
speaker_idintegerThe index of the current speaker, starting from 0, used to distinguish different speakers.
This field is only displayed in the recognition results when speaker diarization is enabled.
punctuationstringThe predicted punctuation after the word (if any).

API reference

Core resource (client.audio.asr)

The non-real-time speech recognition capability is mounted on the client.audio.asr resource. You can use client.audio.asr.transcribe to submit and wait in one step, or use client.audio.asr.jobs for step-by-step control.
Member methodMethod signatureDescription
transcribe
def transcribe(self,
               file_urls: List[str],
               *,
               model: str = "paraformer-v2",
               parameters: Dict = None,
               phrase_id: str = None,
               timeout: float = ...,
               ...) -> Job
Submits a recorded file recognition task and blocks the current thread until the task completes (status is SUCCEEDED or FAILED).This method returns a Job. Read the transcription results from job.results (each item contains transcription_url).
jobs.create
def create(self,
           *,
           model: str,
           file_urls: List[str],
           parameters: Dict = None,
           phrase_id: str = None,
           ...) -> Job
Asynchronously submits a speech recognition task.This method returns a Job (job.task_id/job.status).
jobs.wait
def wait(self,
         task: Union[str, Job],
         poll_interval: float = 1,
         timeout: float = 86400,
         ...) -> Job
Blocks the current thread until the asynchronous task completes (exponential-backoff polling, default total budget of 24 hours).This method returns the final-state Job.
jobs.fetch
def fetch(self,
          task_id: str,
          ...) -> Job
Asynchronously queries the current task execution result.This method returns a Job.

Other interfaces: Batch query task status / Cancel task

For details, see Manage asynchronous tasks: Supports batch querying of non-real-time speech recognition tasks submitted within the last 24 hours, and also supports canceling tasks in PENDING (queued) state.

Error codes

If you encounter errors, see Error codes for troubleshooting. If the issue persists, join the developer community to report the issue and provide the Request ID for further investigation. When a task contains multiple subtasks, as long as any subtask succeeds, the overall task status is marked as SUCCEEDED. You need to check the subtask_status field to determine the result of each subtask. Error response example:
{
    "request_id": "16668704-6702-9e03-8ab7-a32a5d7bb095",
    "task_id": "7bac899c-06ec-4a79-8875-xxxxxxxxxxxx",
    "status": "SUCCEEDED",
    "results": [
        {
            "file_url": "{YOUR_AUDIO_URL}",
            "code": "InvalidFile.DownloadFailed",
            "message": "The audio file cannot be downloaded.",
            "subtask_status": "FAILED"
        }
    ],
    "task_metrics": {
        "TOTAL": 1,
        "SUCCEEDED": 0,
        "FAILED": 1
    }
}

More examples

Explore more examples on GitHub.

FAQ

Features

Q: Does it support Base64-encoded audio?

No. Base64-encoded audio is not supported. Only audio accessible via publicly accessible URLs is supported. Binary streams and direct local file recognition are not supported.

Q: How to provide audio files as publicly accessible URLs?

Generally, follow these steps (this provides a general approach; specifics vary by storage product. We recommend uploading audio to Alibaba Cloud OSS):
For example:
  • Object Storage Service (recommended):
    • Use a cloud provider's object storage service (such as Alibaba Cloud OSS) to upload audio files to a bucket and set them to public access.
    • Advantages: High availability, CDN acceleration support, easy management.
  • 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 the CDN-provided URL.
    • Advantages: Accelerated file delivery, suitable for high-concurrency scenarios.
Upload audio files based on your chosen storage/hosting method, for example:
  • Object Storage Service:
    • Log in to the cloud 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 the server's designated directory (such as /var/www/html/audio/).
    • Ensure files are accessible via HTTP/HTTPS.
For example:
  • Object Storage Service:
    • After uploading, 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 user-friendly domain, you can bind a custom domain 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).
  • CDN:
    • After configuring CDN acceleration, use the CDN-provided URL (such as https://cdn.your-domain.com/audio/file.mp3).
In a public network environment, ensure the generated URL is accessible, for example:
  • Open the URL in a browser and check whether the audio file can be played.
  • Use tools (such as curl or Postman) to verify whether the URL returns a correct HTTP response (status code 200).
When using the SDK, if audio files are stored in Alibaba Cloud OSS, temporary URLs with the oss:// prefix are not supported. When using the RESTful API, if audio files are stored in Alibaba Cloud OSS, temporary URLs with the oss:// prefix are supported:
  • 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 get recognition results?

After submission, the task enters a queued (PENDING) state. The queue time depends on the queue length and file duration and cannot be precisely estimated, but typically completes within a few minutes. Please wait patiently. Longer audio files require more processing time.

Troubleshooting

For code errors, see Error codes.

Q: What should I do if the recognition results are out of sync with the audio playback?

Set the request parameter timestamp_alignment_enabled to true to enable timestamp calibration, which synchronizes the recognition results with the speech playback.

Q: How do I handle special characters in a file URL?

If the file URL path contains spaces, Chinese characters, or other characters that require encoding, percent-encode those characters before passing the URL to file_urls. For example, encode spaces in the file name as %20. Do not encode an already encoded URL again.
Q: Unable to get results after continuous polling?
This may be due to rate limiting. Please wait patiently. If you need capacity expansion, join the developer community to apply.
Q: Why is there no recognition result (unable to recognize speech)?
  • Check whether the audio meets the requirements (format, sampling rate).
  • If you are using the paraformer-v2 model, check whether the language_hints setting is correct.
  • If none of the above resolves the issue, you can customize hot words to improve the recognition of specific words.

More questions

Visit the QA page on GitHub.