Speech-to-Text
Description
Recognizes and transcribes speech from audio and video files.
Version
1.0
Media Requirements
Supported media formats include WAV, M4A, MP4, MP3, and AAC.
API URL
Production environment: https://openapi.meitu.com
Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
Task name (task): /v1/ai_audio_asr/481964
Task type (task_type): formulaMethod
POST
Content-Type: application/json
Authentication
Request Parameters
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | params | string | Algorithm parameters (JSON string) |
| Yes | init_images | object[] | List of audio or video files |
| Yes | task | string | Fixed value: /v1/ai_audio_asr/481964 |
| Yes | task_type | string | Fixed value: formula |
| No | sync_timeout | int | Defaults to 30; synchronous timeout duration |
The structure of each multimedia file in init_images is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | url | string | Audio/video URL or base64 data |
| Yes | profile | object | Attribute information |
The structure of profile is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_profiles | object | Media attributes |
| Yes | version | string | Fixed value: v1 |
The structure of media_profiles is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_data_type | string | url indicates a URL; the corresponding media type indicates base64 data |
The params inference parameter is a JSON string with the following structure:
| Required | Field | Type | Description |
|---|---|---|---|
| No | rsp_media_type | string | Defaults to url; jpg indicates base64 data |
| Yes | parameter | object | Core algorithm parameters |
Algorithm parameters in parameter:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | app | string | Caller application |
| Yes | uid | string | User ID; pass 0 when unavailable |
| Yes | gid | string | Group ID |
| Yes | task_type | string | Task type: asr_lang for language identification or asr for speech-to-text |
The original parameter table defines the field as uid, while the original input example used the undefined field user. This unified example follows the parameter table and uses uid. user is not treated as an official parameter because the source document does not define its meaning.
Request Example
{
"task": "/v1/ai_audio_asr/481964",
"task_type": "formula",
"init_images": [
{
"url": "http://deepnet-models.zone1.meitudata.com/deepnet/cloud/b98fdb50-be64-11ed-92de-fa163e342caa.wav",
"profile": {
"media_profiles": {
"media_data_type": "url"
},
"version": "v1"
}
}
],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"app\":\"test\",\"uid\":\"0\",\"gid\":\"123\",\"task_type\":\"asr\"}}",
"sync_timeout": 30
}Response Fields
Generated results are periodically deleted. Download and save them promptly.| Field | Type | Description |
|---|---|---|
| request_id | string | Request identifier |
| trace_id | string | Trace identifier |
| code | int | Business status code; 0 indicates that the request was accepted successfully |
| error_code | int | Error code; 0 indicates success |
| message | string | Business message |
| tips | any | Additional information; may be null |
| data | object | Task status and algorithm result |
Fields in data:
| Field | Type | Description |
|---|---|---|
| status | int | Status code: -1 task not found; 0 created; 1 processing; 2 failed; 9 timed out—use the Query API; 10 succeeded |
| result | object | Algorithm result |
| progress | number | Task progress |
| predict_elapsed | int | Estimated duration in milliseconds |
| create_time | int64 | Creation timestamp in milliseconds |
| task_id | string | Task ID |
| custom_task_id | string | Customer-defined task ID |
| trace_id | string | Trace identifier within data |
| client_info | string | Client information |
| init_images | object[]/null | Echoed input media |
Fields in result:
| Field | Type | Description |
|---|---|---|
| id | string | Task ID |
| code | int | Algorithm error code |
| data | object | Returned result |
| parameter | object | Return-information type identifier defined in the source document |
| msg | string | Task message |
| msg_id | string | Unique request identifier |
Fields in result.data:
| Field | Type | Description |
|---|---|---|
| duration | object | Detailed timing information |
| parameter | object | Algorithm result information |
| error_code | int | Returned error code; 0 indicates success |
| error_msg | string | Returned error message |
| msg_id | string | Unique identifier for each request; used for queries. Algorithm results are retained for only 24 hours |
| extra | object | Additional information |
| media_info_list | array | Media information list |
Fields in duration:
| Field | Type | Description |
|---|---|---|
| created_timestamp | int | Timestamp when the algorithm received the task, in seconds |
| pull_timestamp | int | Timestamp when the task was dequeued, in seconds |
| waiting_time | int | Queue wait time in milliseconds |
| alg_process_time | int | Algorithm processing time in milliseconds, including download time |
| upload_time | int | Upload time in milliseconds |
| repost_time | int | Asynchronous callback duration in milliseconds |
Fields in parameter:
| Field | Type | Description |
|---|---|---|
| code | int | 0 for a normal response; nonzero indicates an error |
| id | string | Unique identifier for each request, i.e. the job_id |
| path | string | Original audio file |
| flash_result | object | Recognized text when task_type=asr for speech-to-text |
| language | string | Audio language when task_type=asr_lang for language identification |
| name | string | User parameter from the request |
| created_time | string | Time when execution of the current task was created |
| create_time | string | Creation-time field in the original success example |
| updated_time | string | Time when execution of the current task ended |
| msg | string | Information about execution of the current task |
| latency | float | API latency |
Fields in flash_result:
| Field | Type | Description |
|---|---|---|
| text | string | Complete transcript |
| sentence_list | array | Timestamp information for each sentence |
Fields in sentence_list:
| Field | Type | Description |
|---|---|---|
| text | string | Text of the current sentence |
| start_time | int64 | Start time of the current sentence |
| end_time | int64 | End time of the current sentence |
| word_list | array | Timestamp information for each character in the current sentence |
Fields in word_list:
| Field | Type | Description |
|---|---|---|
| word | string | A single character |
| start_time | int64 | Start time of the current character |
| end_time | int64 | End time of the current character |
Response Examples
Successful Response Example
{
"request_id": "",
"trace_id": "",
"code": 0,
"error_code": 0,
"message": "success",
"tips": null,
"data": {
"status": 10,
"result": {
"id": "task_id",
"data": {
"duration": {
"alg_process_time": 394,
"created_timestamp": 1758253400,
"pull_timestamp": 1758253400,
"repost_time": 0,
"upload_time": 0,
"waiting_time": 120
},
"error_code": 0,
"error_msg": "success",
"extra": {},
"media_info_list": [],
"msg_id": "msg_id",
"parameter": {
"code": 0,
"create_time": "2025-09-19 11:43:20",
"flash_result": {
"sentence_list": [
{
"end_time": 3590,
"start_time": 50,
"text": "这两个数他们也叫好朋友数,",
"word_list": [
{
"end_time": 230,
"start_time": 50,
"word": "这"
},
{
"end_time": 410,
"start_time": 230,
"word": "两"
}
]
}
],
"text": "这两个数他们也叫好朋友数,为什么呢?他们的个位能够凑成整十,只要是个位能凑整十,都叫好朋友数。"
},
"id": "",
"latency": 0.24,
"msg": "success",
"name": "0",
"path": "http://deepnet-models.zone1.meitudata.com/deepnet/cloud/b98fdb50-be64-11ed-92de-fa163e342caa.wav",
"updated_time": "2025-09-19 11:43:20"
}
},
"msg": "success",
"msg_id": ""
},
"progress": 1,
"predict_elapsed": 10000,
"create_time": 1758253400248,
"task_id": "task_id",
"custom_task_id": "",
"trace_id": "",
"client_info": "",
"init_images": null
}
}Response Example Requiring a Query
Use the Query API to query the result.
Response Status: 200
content-type: application/json; charset=utf-8
{
"request_id": "",
"trace_id": "",
"code": 0,
"error_code": 0,
"message": "success",
"tips": null,
"data": {
"status": 9,
"result": {
"id": "t_mt1a3i5n7b3da6d589-46b5-4f66-a0bb-8dd22f2a172e"
},
"progress": 0,
"predict_elapsed": 10000,
"create_time": 1759202368761,
"task_id": "t_mt1a3i5n7b3da6d589-46b5-4f66-a0bb-8dd22f2a172e",
"custom_task_id": "",
"trace_id": "9129a3a2-99c4-46ce-8731-0e100e2fbee7",
"client_info": "",
"init_images": null
}
}Failed Response Example
Response Status: 400
content-type: application/json; charset=utf-8
{
"request_id": "",
"trace_id": "",
"code": 20001,
"error_code": 20001,
"message": "ALGO_MODEL_CRASH",
"tips": null,
"data": {
"status": 2,
"result": {
"id": "t_mt1a3i5n7be8d575cc-2ffb-4e0c-85a8-1824110e31b8",
"code": 20001,
"data": {
"duration": {
"alg_process_time": 0,
"created_timestamp": 1759201989,
"pull_timestamp": 1759201989,
"repost_time": 0,
"upload_time": 0,
"waiting_time": 0
},
"error_code": 20001,
"error_msg": "ALGO_MODEL_CRASH",
"extra": {},
"media_info_list": [],
"msg_id": "c1b09cb2-6e05-4d21-55ab-r007b1f21bec",
"parameter": null
},
"msg": "ALGO_MODEL_CRASH",
"msg_id": "c1b09cb2-6e05-4d21-55ab-r007b1f21bec"
},
"progress": 1,
"predict_elapsed": 10000,
"create_time": 1759201989444,
"task_id": "t_mt1a3i5n7be8d575cc-2ffb-4e0c-85a8-1824110e31b8",
"custom_task_id": "",
"trace_id": "",
"client_info": "",
"init_images": null
}
}API-specific error codes and messages:
| ErrorCode | Error Message | Description |
|---|---|---|
| 21101 | Invalid parameters | |
| 26101 | Failed to obtain the model | |
| 25402 | Model feature extraction failed (for example, because no voiceprint information could be extracted from the input audio or the content did not meet requirements) | |
| 20602 | Model inference failed (possibly due to processing errors such as invalid input characters) | |
| 22201 | Failed to generate the result, including failures when uploading to OBS | |
| 20301 | Unknown exception |
General Error Codes
For details, see API Error Codes.
SDK Examples
Python
import json
import requests
from sign_sdk import sign
def api_call_example():
key = "your_api_key"
secret = "your_api_secret"
url = "https://openapi.meitu.com/api/v1/sdk/sync/push"
method = "POST"
headers = {
"Content-Type": "application/json",
sign.HeaderHost: "openapi.meitu.com",
}
inner_params = {
"rsp_media_type": "url",
"parameter": {
"app": "test",
"uid": "0",
"gid": "123",
"task_type": "asr",
},
}
payload = {
"task": "/v1/ai_audio_asr/481964",
"task_type": "formula",
"init_images": [
{
"url": "http://deepnet-models.zone1.meitudata.com/deepnet/cloud/b98fdb50-be64-11ed-92de-fa163e342caa.wav",
"profile": {
"media_profiles": {"media_data_type": "url"},
"version": "v1",
},
}
],
"params": json.dumps(inner_params, ensure_ascii=False),
"sync_timeout": 30,
}
body = json.dumps(payload, ensure_ascii=False)
signer = sign.Signer(key, secret)
signed_request = signer.sign(url, method, headers, body)
response = requests.Session().send(signed_request)
print(f"Status: {response.status_code}")
print(f"Response: {response.text}")
if __name__ == "__main__":
api_call_example()Go
package main
import (
"fmt"
"io"
"net/http"
"github.com/mtlab/api/signer"
)
func main() {
key := "your_api_key"
secret := "your_api_secret"
signObj := signer.NewSigner(key, secret)
url := "https://openapi.meitu.com/api/v1/sdk/sync/push"
method := http.MethodPost
headers := make(http.Header)
headers.Set(signer.HeaderHost, "openapi.meitu.com")
headers.Set("Content-Type", "application/json")
body := `{
"task": "/v1/ai_audio_asr/481964",
"task_type": "formula",
"init_images": [{
"url": "http://deepnet-models.zone1.meitudata.com/deepnet/cloud/b98fdb50-be64-11ed-92de-fa163e342caa.wav",
"profile": {
"media_profiles": {"media_data_type": "url"},
"version": "v1"
}
}],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"app\":\"test\",\"uid\":\"0\",\"gid\":\"123\",\"task_type\":\"asr\"}}",
"sync_timeout": 30
}`
req, err := signObj.Sign(url, method, headers, body)
if err != nil {
fmt.Println("Failed to sign request:", err)
return
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println("Failed to send request:", err)
return
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Read response failed:", err)
return
}
fmt.Println("Response:", resp.StatusCode, string(responseBody))
}PHP
<?php
require 'signer.php';
$key = 'your_api_key';
$secret = 'your_api_secret';
$signer = new Signer($key, $secret);
$url = 'https://openapi.meitu.com/api/v1/sdk/sync/push';
$method = 'POST';
$headers = ['Content-Type' => 'application/json'];
$innerParams = json_encode([
'rsp_media_type' => 'url',
'parameter' => [
'app' => 'test',
'uid' => '0',
'gid' => '123',
'task_type' => 'asr',
],
]);
$body = json_encode([
'task' => '/v1/ai_audio_asr/481964',
'task_type' => 'formula',
'init_images' => [
[
'url' => 'http://deepnet-models.zone1.meitudata.com/deepnet/cloud/b98fdb50-be64-11ed-92de-fa163e342caa.wav',
'profile' => [
'media_profiles' => ['media_data_type' => 'url'],
'version' => 'v1',
],
],
],
'params' => $innerParams,
'sync_timeout' => 30,
]);
$curl = $signer->sign($url, $method, $headers, $body);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($status === 0) {
echo 'Error: ' . curl_error($curl);
} else {
echo "Status: {$status}\n";
echo "Response: {$response}\n";
}
curl_close($curl);
?>Java
package com.meitu.openai.common;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws Exception {
Signer signer = new Signer("your_api_key", "your_api_secret");
String url = "https://openapi.meitu.com/api/v1/sdk/sync/push";
String method = "POST";
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
headers.put(Signer.HeaderHost, "openapi.meitu.com");
String body = "{\n" +
" \"task\": \"/v1/ai_audio_asr/481964\",\n" +
" \"task_type\": \"formula\",\n" +
" \"init_images\": [{\n" +
" \"url\": \"http://deepnet-models.zone1.meitudata.com/deepnet/cloud/b98fdb50-be64-11ed-92de-fa163e342caa.wav\",\n" +
" \"profile\": {\n" +
" \"media_profiles\": {\"media_data_type\": \"url\"},\n" +
" \"version\": \"v1\"\n" +
" }\n" +
" }],\n" +
" \"params\": \"{\\\"rsp_media_type\\\":\\\"url\\\",\\\"parameter\\\":{\\\"app\\\":\\\"test\\\",\\\"uid\\\":\\\"0\\\",\\\"gid\\\":\\\"123\\\",\\\"task_type\\\":\\\"asr\\\"}}\",\n" +
" \"sync_timeout\": 30\n" +
"}";
Map<String, String> signedHeaders = signer.sign(url, method, headers, body);
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod(method);
for (Map.Entry<String, String> entry : signedHeaders.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
connection.setDoOutput(true);
connection.getOutputStream().write(body.getBytes(StandardCharsets.UTF_8));
int status = connection.getResponseCode();
InputStream stream = status >= 400
? connection.getErrorStream()
: connection.getInputStream();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
System.out.println("Response: " + status + " " + response);
}
}
}