すべてのプロダクト
Search
ドキュメントセンター

Intelligent Speech Interaction:RESTful API

最終更新日:Sep 01, 2026

短文音声認識 RESTful API は、HTTP POST リクエストで最大 1 分間の音声を受け付けます。処理が完了すると、サーバーは HTTP 応答で文字起こし結果を JSON 形式で返します。

前提条件

API を呼び出す前に、次の情報を準備してください。

  • プロジェクトの appkey。プロジェクトの作成方法と appkey の取得方法については、「プロジェクトの作成」をご参照ください。

  • アクセス トークン。トークンの取得方法については、「アクセス トークンの取得」をご参照ください。

音声の要件

要件 説明
エンコーディング 16 ビットのモノラル音声。
フォーマット PCM、PCM エンコード WAV、OGG カプセル化 Opus、OGG カプセル化 Speex、および AMR。
サンプルレート 8,000 Hz または 16,000 Hz。
期間 最大 1 分間。

言語とシナリオモデルはリクエストで指定できません。コンソールでプロジェクトの音声に一致するモデルを選択してください。詳細については、「プロジェクトの管理」をご参照ください。

重要

ブラウザ側のコードからこの API を直接呼び出さないでください。クロスオリジンリソース共有 (CORS) の制限により、ブラウザがリクエストを拒否する可能性があり、コード内の appkey とトークンが公開されてしまいます。

クイックテスト

サンプル音声ファイル nls-sample-16k.wav のダウンロード。このファイルは、汎用モデル用の 16 kHz WAV ファイルです。

appkey とトークンを設定し、次のコマンドを実行してください。

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

成功応答の例:

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

仕組み

クライアントは、認証情報、リクエストパラメーター、および完全な音声を 1 つの HTTP POST リクエストで送信します。音声を処理した後、サーバーは同じ HTTP 接続を介して 1 つの JSON 応答を返します。応答が到着するまで接続を開いたままにしてください。

  1. クライアントはサーバーに POST リクエストを送信します。

  2. サーバーは認証情報とリクエストパラメーターを検証し、音声を処理します。

  3. サーバーはタスク ID、ステータスコード、および文字起こし結果を返します。

サービスエンドポイント

プロジェクトのリージョンとネットワーク環境に基づいてエンドポイントを選択してください。パブリックエンドポイントは HTTPS と HTTP をサポートしています。HTTPS を推奨します。

リージョン ネットワーク エンドポイント
シンガポール インターネット https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/asr

関連 API

リクエストは、リクエスト行、リクエストヘッダー、およびリクエストボディで構成されます。

リクエスト行

POST /stream/v1/asr?appkey=<appkey>&format=pcm&sample_rate=16000&enable_punctuation_prediction=true HTTP/1.1
パラメーター タイプ 必須 デフォルト 説明
appkey 文字列 はい なし プロジェクトの appkey。
format 文字列 いいえ pcm 音声フォーマット。有効値: pcm、wav、opus、speex、amr。
sample_rate 整数 いいえ 16000 音声のサンプルレート (Hz)。有効値: 8000、16000。
vocabulary_id 文字列 いいえ なし ホットワードリストの ID。
customization_id 文字列 いいえ なし カスタム言語モデルの ID。
enable_punctuation_prediction ブール値 いいえ false 句読点予測を有効にするかどうかを指定します。
enable_inverse_text_normalization ブール値 いいえ false 逆テキスト正規化を有効にするかどうかを指定します。たとえば、話し言葉の数字を数字に変換します。
enable_voice_detection ブール値 いいえ false 音声区間検出 (VAD) を有効にして、発話の境界を検出するかどうかを指定します。
disfluency ブール値 いいえ false 言い淀み (フィラーワード、繰り返しなど) を除去するかどうかを指定します。

リクエストヘッダー

ヘッダー タイプ 必須 説明
X-NLS-Token 文字列 はい 認証に使用されるアクセス トークン。
Content-Type 文字列 はい application/octet-stream
Content-Length 長整数 はい リクエストボディ内の音声データのサイズ (バイト単位)。
Host 文字列 はい nls-gateway-ap-southeast-1.aliyuncs.com

リクエストボディ

完全なバイナリ音声データをリクエストボディに書き込み、Content-Type を application/octet-stream に設定してください。

リクエストの例

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]

応答

応答パラメーター

パラメーター タイプ 説明
task_id 文字列 32 文字のタスク ID。トラブルシューティングのためにこの ID を提供してください。
result 文字列 文字起こし結果。認識に失敗した場合は、空の文字列が返されます。
status 整数 ステータスコード。
message 文字列 ステータスの説明。

成功応答

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

エラー応答

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

失敗したリクエストのトラブルシューティングのために、応答のタスク ID を記録してください。

ステータスコード

散発的なサーバーエラー (5xxxxxxx) は再試行してください。エラーが解決しない場合は、応答のタスク ID を含めてチケットを送信してください。

ステータスコード 説明 アクション
20000000 リクエストは成功しました。 アクションは不要です。
40000000 クライアントエラー。 エラーメッセージに基づいてリクエストを確認してください。
40000001 認証に失敗しました。 トークンが有効で、有効期限が切れていないことを確認してください。
40000002 無効なリクエスト。 リクエストが API の要件を満たしていることを確認してください。
40000003 無効なパラメーター。 パラメーター値が有効な範囲内にあることを確認してください。
40000004 クライアントがタイムアウトしました。 クライアントがデータの送信を停止したかどうかを確認してください。
40000005 リクエストレートを超過しました。 同時実行数または QPS が制限を超えていないか確認してください。
41010100 サポートされていない音声フォーマット。 format パラメーターと実際の音声フォーマットを確認してください。
41010101 サポートされていないサンプルレート。 sample_rate が音声およびプロジェクトモデルと一致することを確認してください。
50000000 サーバーエラー。 エラーが解決しない場合は、タスク ID を添えてチケットを送信してください。
50000001 内部サービス呼び出しエラー。 エラーが解決しない場合は、タスク ID を添えてチケットを送信してください。

コード例

以下の例では、エンドポイント、appkey、トークン、およびローカルの音声パスを環境変数から読み取り、PCM 音声をバイナリデータとして送信します。

トークンの取得方法については、「アクセス トークンの取得」をご参照ください。

環境変数 説明
NLS_ENDPOINT https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/asr
NLS_APP_KEY プロジェクトの appkey。
NLS_TOKEN 有効なアクセス トークン。
NLS_AUDIO_FILE 16 kHz、16 ビット、モノラルの PCM 音声ファイルのローカルパス。

Java

この例では 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("環境変数がありません: " + 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++

この例では C++17 と 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("環境変数がありません: ") + 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("音声ファイルを開けません");
    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("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

この例では Python 3.12 を使用します。

import os
import urllib.parse
import urllib.request


def required(name):
    value = os.getenv(name)
    if not value:
        raise RuntimeError(f"環境変数がありません: {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

この例では、cURL 拡張機能が有効な PHP 8.3 を使用します。

<?php

function required_env(string $name): string {
    $value = getenv($name);
    if ($value === false || $value === '') {
        throw new RuntimeException("環境変数がありません: " . $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('音声ファイルを読み取れません');
}

$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

この例では 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(`環境変数がありません: ${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#

この例では .NET 8 を使用します。

using System.Net.Http.Headers;

static string Required(string name)
{
    string? value = Environment.GetEnvironmentVariable(name);
    if (string.IsNullOrWhiteSpace(value))
        throw new ArgumentException($"環境変数がありません: {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

この例では Go 1.22 を使用します。

package main

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

func required(name string) string {
	value := os.Getenv(name)
	if value == "" {
		panic("環境変数がありません: " + 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))
}

関連ドキュメント