Tous les produits
Search
Centre de documentation

Intelligent Speech Interaction:RESTful API

Dernière mise à jour :Aug 31, 2026

L'API REST de reconnaissance de phrases courtes accepte des fichiers audio d'une durée maximale d'une minute via une requête HTTP POST. Une fois le traitement terminé, le serveur renvoie le résultat de la transcription au format JSON dans la réponse HTTP.

Prérequis

Préparez les informations suivantes avant d'appeler l'API :

  • Un appkey de projet. Pour savoir comment créer un projet et obtenir l'appkey, consultez la rubrique Créer un projet.

  • Un jeton d'accès. Pour savoir comment obtenir un jeton, consultez la rubrique Obtenir un jeton d'accès.

Exigences audio

Exigence Description
Encodage Audio mono 16 bits.
Formats PCM, WAV encodé en PCM, Opus encapsulé dans OGG, Speex encapsulé dans OGG et AMR.
Fréquence d'échantillonnage 8 000 Hz ou 16 000 Hz.
Durée Jusqu'à 1 minute.

La langue et le modèle de scénario ne peuvent pas être spécifiés dans la requête. Sélectionnez un modèle correspondant à l'audio pour le projet dans la console. Pour plus d'informations, consultez la rubrique Gérer les projets.

Important

N'appelez pas cette API directement depuis du code côté navigateur. Le navigateur risque de rejeter la requête en raison des restrictions CORS (Cross-Origin Resource Sharing), et le code exposerait l'appkey et le jeton.

Test rapide

Téléchargez le fichier audio exemple nls-sample-16k.wav. Il s'agit d'un fichier WAV 16 kHz destiné au modèle générique.

Définissez l'appkey et le jeton, puis exécutez la commande suivante :

curl -X POST \
  -H "X-NLS-Token: <token>" \
  "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/asr?appkey=<appkey>&format=wav&sample_rate=16000" \
  --data-binary @nls-sample-16k.wav

Exemple de réponse réussie :

{
  "task_id": "cf7b0c5339244ee29cd4e43fb97f****",
  "result": "Weather in Beijing.",
  "status": 20000000,
  "message": "SUCCESS"
}

Fonctionnement

Le client envoie les informations d'authentification, les paramètres de requête et l'audio complet en une seule requête HTTP POST. Après avoir traité l'audio, le serveur renvoie une réponse JSON unique sur la même connexion HTTP. Maintenez la connexion ouverte jusqu'à la réception de la réponse.

  1. Le client envoie une requête POST au serveur.

  2. Le serveur valide les informations d'authentification et les paramètres de requête, puis traite l'audio.

  3. Le serveur renvoie l'ID de tâche, le code d'état et le résultat de la transcription.

Endpoints de service

Sélectionnez l'endpoint en fonction de la région du projet et de l'environnement réseau. Les endpoints publics prennent en charge HTTPS et HTTP. L'utilisation de HTTPS est recommandée.

Région Réseau Endpoint
Singapour Internet https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/asr

Référence de l'API

Une requête se compose d'une ligne de requête, d'en-têtes de requête et d'un corps de requête.

Ligne de requête

POST /stream/v1/asr?appkey=<appkey>&format=pcm&sample_rate=16000&enable_punctuation_prediction=true HTTP/1.1
Paramètre Type Obligatoire Valeur par défaut Description
appkey String Oui Aucune Appkey du projet.
format String Non pcm Format audio. Valeurs valides : pcm, wav, opus, speex et amr.
sample_rate Integer Non 16000 Fréquence d'échantillonnage audio en Hz. Valeurs valides : 8000 et 16000.
vocabulary_id String Non Aucune ID de la liste de mots clés.
customization_id String Non Aucune ID du modèle de langage personnalisé.
enable_punctuation_prediction Boolean Non false Indique s'il faut ajouter la ponctuation lors du post-traitement.
enable_inverse_text_normalization Boolean Non false Indique s'il faut activer la normalisation inverse du texte, par exemple la conversion des nombres parlés en chiffres.
enable_voice_detection Boolean Non false Indique s'il faut activer la détection d'activité vocale (VAD) pour détecter les limites de la parole.
disfluency Boolean Non false Indique s'il faut supprimer les mots de remplissage.

En-têtes de requête

En-tête Type Obligatoire Description
X-NLS-Token String Oui Jeton d'accès utilisé pour l'authentification.
Content-Type String Oui application/octet-stream
Content-Length Long Oui Taille des données audio dans le corps de la requête, en octets.
Host String Oui nls-gateway-ap-southeast-1.aliyuncs.com.

Corps de la requête

Écrivez les données audio binaires complètes dans le corps de la requête et définissez Content-Type sur application/octet-stream.

Exemples de requêtes

POST /stream/v1/asr?appkey=23f5****&format=pcm&sample_rate=16000 HTTP/1.1
X-NLS-Token: 450372e4279bcc2b3c793****
Content-Type: application/octet-stream
Content-Length: 94616
Host: nls-gateway-ap-southeast-1.aliyuncs.com

[audio data]

Réponses

Paramètres de réponse

Paramètre Type Description
task_id String ID de tâche de 32 caractères. Fournissez cet ID pour le dépannage.
result String Résultat de la transcription. Une chaîne vide est renvoyée si la reconnaissance échoue.
status Integer Code d'état.
message String Description de l'état.

Réponse réussie

{
  "task_id": "cf7b0c5339244ee29cd4e43fb97f****",
  "result": "Weather in Beijing.",
  "status": 20000000,
  "message": "SUCCESS"
}

Réponse d'erreur

{
  "task_id": "8bae3613dfc54ebfa811a17d8a7a****",
  "result": "",
  "status": 40000001,
  "message": "Gateway:ACCESS_DENIED:The token is invalid"
}

Enregistrez l'ID de tâche figurant dans la réponse pour le dépannage d'une requête ayant échoué.

Codes d'état

Réessayez en cas d'erreur serveur occasionnelle (5xxxxxxx). Si l'erreur persiste, soumettez un ticket en incluant l'ID de tâche issu de la réponse.

Code d'état Description Action
20000000 La requête a abouti. Aucune action n'est requise.
40000000 Erreur client. Vérifiez la requête en vous basant sur le message d'erreur.
40000001 Échec de l'authentification. Vérifiez que le jeton est valide et n'a pas expiré.
40000002 Requête non valide. Vérifiez que la requête respecte les exigences de l'API.
40000003 Paramètres non valides. Vérifiez que les valeurs des paramètres se situent dans les plages valides.
40000004 Délai d'attente du client dépassé. Vérifiez si le client a cessé d'envoyer des données.
40000005 Taux de requêtes dépassé. Vérifiez si la concurrence ou les QPS dépassent la limite.
41010100 Format audio non pris en charge. Vérifiez le paramètre format et le format audio réel.
41010101 Fréquence d'échantillonnage non prise en charge. Vérifiez que sample_rate correspond à l'audio et au modèle du projet.
50000000 Erreur serveur. Si l'erreur persiste, soumettez un ticket avec l'ID de tâche.
50000001 Erreur d'appel de service interne. Si l'erreur persiste, soumettez un ticket avec l'ID de tâche.

Exemples de code

Les exemples suivants lisent l'endpoint, l'appkey, le jeton et le chemin d'accès audio local à partir de variables d'environnement et envoient l'audio PCM sous forme de données binaires.

Pour savoir comment obtenir un jeton, consultez la rubrique Obtenir un jeton d'accès.

Variable d'environnement Description
NLS_ENDPOINT https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/asr
NLS_APP_KEY Appkey du projet.
NLS_TOKEN Jeton d'accès valide.
NLS_AUDIO_FILE Chemin local d'un fichier audio PCM mono 16 bits, 16 kHz.

Java

L'exemple utilise JDK 21.

import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;

public class SpeechRecognition {
    private static String required(String name) {
        String value = System.getenv(name);
        if (value == null || value.isBlank()) {
            throw new IllegalArgumentException("Missing environment variable: " + name);
        }
        return value;
    }

    public static void main(String[] args) throws Exception {
        String endpoint = required("NLS_ENDPOINT");
        String appKey = URLEncoder.encode(required("NLS_APP_KEY"), StandardCharsets.UTF_8);
        String token = required("NLS_TOKEN");
        Path audioFile = Path.of(required("NLS_AUDIO_FILE"));
        String url = endpoint + "?appkey=" + appKey
                + "&format=pcm&sample_rate=16000"
                + "&enable_punctuation_prediction=true"
                + "&enable_inverse_text_normalization=true";

        HttpRequest request = HttpRequest.newBuilder(URI.create(url))
                .header("X-NLS-Token", token)
                .header("Content-Type", "application/octet-stream")
                .POST(HttpRequest.BodyPublishers.ofFile(audioFile))
                .build();
        HttpResponse<String> response = HttpClient.newHttpClient().send(
                request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
        System.out.println(response.body());
    }
}

C++

L'exemple utilise C++17 et libcurl 8.7.1.

#include <curl/curl.h>

#include <cstdlib>
#include <fstream>
#include <iostream>
#include <iterator>
#include <stdexcept>
#include <string>

std::string required(const char* name) {
    const char* value = std::getenv(name);
    if (value == nullptr || *value == '\0') {
        throw std::runtime_error(std::string("Missing environment variable: ") + name);
    }
    return value;
}

size_t writeResponse(char* data, size_t size, size_t count, void* target) {
    static_cast<std::string*>(target)->append(data, size * count);
    return size * count;
}

int main() {
    std::ifstream file(required("NLS_AUDIO_FILE"), std::ios::binary);
    if (!file) throw std::runtime_error("Cannot open audio file");
    std::string audio((std::istreambuf_iterator<char>(file)),
                      std::istreambuf_iterator<char>());

    curl_global_init(CURL_GLOBAL_DEFAULT);
    CURL* curl = curl_easy_init();
    if (curl == nullptr) throw std::runtime_error("Cannot initialize cURL");
    char* escaped = curl_easy_escape(curl, required("NLS_APP_KEY").c_str(), 0);
    std::string url = required("NLS_ENDPOINT") + "?appkey=" + escaped
            + "&format=pcm&sample_rate=16000"
            + "&enable_punctuation_prediction=true"
            + "&enable_inverse_text_normalization=true";
    curl_free(escaped);

    std::string response;
    std::string tokenHeader = "X-NLS-Token: " + required("NLS_TOKEN");
    curl_slist* headers = nullptr;
    headers = curl_slist_append(headers, tokenHeader.c_str());
    headers = curl_slist_append(headers, "Content-Type: application/octet-stream");
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, audio.data());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, static_cast<curl_off_t>(audio.size()));
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeResponse);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    CURLcode code = curl_easy_perform(curl);
    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);
    curl_global_cleanup();
    if (code != CURLE_OK) throw std::runtime_error(curl_easy_strerror(code));
    std::cout << response << std::endl;
}

Python

L'exemple utilise Python 3.14.

import os
import urllib.parse
import urllib.request

def required(name):
    value = os.getenv(name)
    if not value:
        raise RuntimeError(f"Missing environment variable: {name}")
    return value

endpoint = required("NLS_ENDPOINT")
query = urllib.parse.urlencode({
    "appkey": required("NLS_APP_KEY"),
    "format": "pcm",
    "sample_rate": 16000,
    "enable_punctuation_prediction": "true",
    "enable_inverse_text_normalization": "true",
})
with open(required("NLS_AUDIO_FILE"), "rb") as audio_file:
    request = urllib.request.Request(
        f"{endpoint}?{query}",
        data=audio_file.read(),
        headers={
            "X-NLS-Token": required("NLS_TOKEN"),
            "Content-Type": "application/octet-stream",
        },
        method="POST",
    )
with urllib.request.urlopen(request) as response:
    print(response.read().decode("utf-8"))

PHP

L'exemple utilise PHP 8.5 avec l'extension cURL.

<?php

function required_env(string $name): string {
    $value = getenv($name);
    if ($value === false || $value === '') {
        throw new RuntimeException("Missing environment variable: " . $name);
    }
    return $value;
}

$query = http_build_query([
    'appkey' => required_env('NLS_APP_KEY'),
    'format' => 'pcm',
    'sample_rate' => 16000,
    'enable_punctuation_prediction' => 'true',
    'enable_inverse_text_normalization' => 'true',
]);
$audio = file_get_contents(required_env('NLS_AUDIO_FILE'));
if ($audio === false) {
    throw new RuntimeException('Cannot read the audio file');
}

$curl = curl_init(required_env('NLS_ENDPOINT') . '?' . $query);
curl_setopt_array($curl, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $audio,
    CURLOPT_HTTPHEADER => [
        'X-NLS-Token: ' . required_env('NLS_TOKEN'),
        'Content-Type: application/octet-stream',
    ],
    CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($curl);
if ($response === false) {
    throw new RuntimeException(curl_error($curl));
}
echo $response . PHP_EOL;

Node.js

L'exemple utilise Node.js 22.

import fs from "node:fs";
import http from "node:http";
import https from "node:https";

function required(name) {
  const value = process.env[name];
  if (!value) throw new Error(`Missing environment variable: ${name}`);
  return value;
}

const endpoint = new URL(required("NLS_ENDPOINT"));
endpoint.search = new URLSearchParams({
  appkey: required("NLS_APP_KEY"),
  format: "pcm",
  sample_rate: "16000",
  enable_punctuation_prediction: "true",
  enable_inverse_text_normalization: "true",
});
const audio = fs.readFileSync(required("NLS_AUDIO_FILE"));
const transport = endpoint.protocol === "https:" ? https : http;

const request = transport.request(endpoint, {
  method: "POST",
  headers: {
    "X-NLS-Token": required("NLS_TOKEN"),
    "Content-Type": "application/octet-stream",
    "Content-Length": audio.length,
  },
}, (response) => {
  let body = "";
  response.setEncoding("utf8");
  response.on("data", (chunk) => { body += chunk; });
  response.on("end", () => console.log(body));
});
request.on("error", (error) => { throw error; });
request.end(audio);

C#

L'exemple utilise .NET 8.

using System.Net.Http.Headers;

static string Required(string name)
{
    string? value = Environment.GetEnvironmentVariable(name);
    if (string.IsNullOrWhiteSpace(value))
        throw new ArgumentException($"Missing environment variable: {name}");
    return value;
}

string query = string.Join("&", new Dictionary<string, string>
{
    ["appkey"] = Required("NLS_APP_KEY"),
    ["format"] = "pcm",
    ["sample_rate"] = "16000",
    ["enable_punctuation_prediction"] = "true",
    ["enable_inverse_text_normalization"] = "true",
}.Select(item => $"{Uri.EscapeDataString(item.Key)}={Uri.EscapeDataString(item.Value)}"));

using HttpClient client = new();
using ByteArrayContent audio = new(await File.ReadAllBytesAsync(Required("NLS_AUDIO_FILE")));
audio.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
using HttpRequestMessage request = new(HttpMethod.Post, $"{Required("NLS_ENDPOINT")}?{query}");
request.Headers.Add("X-NLS-Token", Required("NLS_TOKEN"));
request.Content = audio;
using HttpResponseMessage response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());

Go

L'exemple utilise Go 1.24.

package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"os"
)

func required(name string) string {
	value := os.Getenv(name)
	if value == "" {
		panic("Missing environment variable: " + name)
	}
	return value
}

func main() {
	audio, err := os.ReadFile(required("NLS_AUDIO_FILE"))
	if err != nil {
		panic(err)
	}
	query := url.Values{
		"appkey":                            {required("NLS_APP_KEY")},
		"format":                            {"pcm"},
		"sample_rate":                       {"16000"},
		"enable_punctuation_prediction":     {"true"},
		"enable_inverse_text_normalization": {"true"},
	}
	request, err := http.NewRequest(
		http.MethodPost, required("NLS_ENDPOINT")+"?"+query.Encode(), bytes.NewReader(audio))
	if err != nil {
		panic(err)
	}
	request.Header.Set("X-NLS-Token", required("NLS_TOKEN"))
	request.Header.Set("Content-Type", "application/octet-stream")
	response, err := http.DefaultClient.Do(request)
	if err != nil {
		panic(err)
	}
	defer response.Body.Close()
	body, err := io.ReadAll(response.Body)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(body))
}

Documents connexes