短文音声認識 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 応答を返します。応答が到着するまで接続を開いたままにしてください。
-
クライアントはサーバーに POST リクエストを送信します。
-
サーバーは認証情報とリクエストパラメーターを検証し、音声を処理します。
-
サーバーはタスク 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))
}
関連ドキュメント
-
プロジェクトを作成し、認識モデルを設定するには、「プロジェクトの管理」をご参照ください。
-
アクセス トークンを生成するには、「アクセス トークンの取得」をご参照ください。