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): formula

Method

POST

Content-Type: application/json

Authentication

Open Platform API Signature

Request Parameters

RequiredParameterTypeDescription
YesparamsstringAlgorithm parameters (JSON string)
Yesinit_imagesobject[]List of audio or video files
YestaskstringFixed value: /v1/ai_audio_asr/481964
Yestask_typestringFixed value: formula
Nosync_timeoutintDefaults to 30; synchronous timeout duration

The structure of each multimedia file in init_images is as follows:

RequiredParameterTypeDescription
YesurlstringAudio/video URL or base64 data
YesprofileobjectAttribute information

The structure of profile is as follows:

RequiredParameterTypeDescription
Yesmedia_profilesobjectMedia attributes
YesversionstringFixed value: v1

The structure of media_profiles is as follows:

RequiredParameterTypeDescription
Yesmedia_data_typestringurl indicates a URL; the corresponding media type indicates base64 data

The params inference parameter is a JSON string with the following structure:

RequiredFieldTypeDescription
Norsp_media_typestringDefaults to url; jpg indicates base64 data
YesparameterobjectCore algorithm parameters

Algorithm parameters in parameter:

RequiredParameterTypeDescription
YesappstringCaller application
YesuidstringUser ID; pass 0 when unavailable
YesgidstringGroup ID
Yestask_typestringTask 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.
FieldTypeDescription
request_idstringRequest identifier
trace_idstringTrace identifier
codeintBusiness status code; 0 indicates that the request was accepted successfully
error_codeintError code; 0 indicates success
messagestringBusiness message
tipsanyAdditional information; may be null
dataobjectTask status and algorithm result

Fields in data:

FieldTypeDescription
statusintStatus code: -1 task not found; 0 created; 1 processing; 2 failed; 9 timed out—use the Query API; 10 succeeded
resultobjectAlgorithm result
progressnumberTask progress
predict_elapsedintEstimated duration in milliseconds
create_timeint64Creation timestamp in milliseconds
task_idstringTask ID
custom_task_idstringCustomer-defined task ID
trace_idstringTrace identifier within data
client_infostringClient information
init_imagesobject[]/nullEchoed input media

Fields in result:

FieldTypeDescription
idstringTask ID
codeintAlgorithm error code
dataobjectReturned result
parameterobjectReturn-information type identifier defined in the source document
msgstringTask message
msg_idstringUnique request identifier

Fields in result.data:

FieldTypeDescription
durationobjectDetailed timing information
parameterobjectAlgorithm result information
error_codeintReturned error code; 0 indicates success
error_msgstringReturned error message
msg_idstringUnique identifier for each request; used for queries. Algorithm results are retained for only 24 hours
extraobjectAdditional information
media_info_listarrayMedia information list

Fields in duration:

FieldTypeDescription
created_timestampintTimestamp when the algorithm received the task, in seconds
pull_timestampintTimestamp when the task was dequeued, in seconds
waiting_timeintQueue wait time in milliseconds
alg_process_timeintAlgorithm processing time in milliseconds, including download time
upload_timeintUpload time in milliseconds
repost_timeintAsynchronous callback duration in milliseconds

Fields in parameter:

FieldTypeDescription
codeint0 for a normal response; nonzero indicates an error
idstringUnique identifier for each request, i.e. the job_id
pathstringOriginal audio file
flash_resultobjectRecognized text when task_type=asr for speech-to-text
languagestringAudio language when task_type=asr_lang for language identification
namestringUser parameter from the request
created_timestringTime when execution of the current task was created
create_timestringCreation-time field in the original success example
updated_timestringTime when execution of the current task ended
msgstringInformation about execution of the current task
latencyfloatAPI latency

Fields in flash_result:

FieldTypeDescription
textstringComplete transcript
sentence_listarrayTimestamp information for each sentence

Fields in sentence_list:

FieldTypeDescription
textstringText of the current sentence
start_timeint64Start time of the current sentence
end_timeint64End time of the current sentence
word_listarrayTimestamp information for each character in the current sentence

Fields in word_list:

FieldTypeDescription
wordstringA single character
start_timeint64Start time of the current character
end_timeint64End 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:

ErrorCodeError MessageDescription
21101Invalid parameters
26101Failed to obtain the model
25402Model feature extraction failed (for example, because no voiceprint information could be extracted from the input audio or the content did not meet requirements)
20602Model inference failed (possibly due to processing errors such as invalid input characters)
22201Failed to generate the result, including failures when uploading to OBS
20301Unknown 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);
        }
    }
}