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.
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.
Le client envoie une requête POST au serveur.
Le serveur valide les informations d'authentification et les paramètres de requête, puis traite l'audio.
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
Pour créer un projet et configurer le modèle de reconnaissance, consultez la rubrique Gérer les projets.
Pour générer un jeton d'accès, consultez la rubrique Obtenir un jeton d'accès.