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

Intelligent Speech Interaction:サンプルの実行

最終更新日:Sep 29, 2026

cURL、Postman、Java SDK、Python のサンプルを使用して、音声認識および音声合成サービスを呼び出し、結果を取得して、合成された音声を保存します。

前提条件

クイックスタート に従って、必要なサービスをアクティベートし、プロジェクトを作成し、認証情報を準備します。呼び出すサービスに合わせてプロジェクトモデルを設定します。認識の場合は、モデルの言語とサンプルレートを入力音声に一致させます。

認識と合成のサンプルでは、プロジェクトの appkey と NLS トークンを使用します。トークンを取得するには、「SDK を使用したトークンの取得」をご参照ください。Python の音声ファイル文字起こしサンプルでは、AccessKey ペアでリクエストに署名し、NLS トークンは使用しません。可能な限り、権限を付与された RAM ユーザーの AccessKey ペアを使用し、認証情報をハードコードしないでください。

呼び出しには料金が発生する場合があります。課金ルールについては、「課金項目」をご参照ください。

サンプルの選択

機能

メソッド

目的

短文音声認識

cURL / Postman

60秒以内のローカル音声ファイルを認識します。

リアルタイム音声認識

Java

音声をチャンクでストリームし、文レベルの結果を受信します。

音声ファイルの文字起こし

Python

音声 URL を使用して非同期タスクを送信し、結果をポーリングします。

音声合成

Java

テキストを WAV ファイルに合成します。

アクセスパラメーターの設定

ターミナルまたは IDE の実行設定で、以下の環境変数を設定します。コマンドは Bash 構文を使用しています。Windows では、システムまたは IDE で同じ名前の変数を設定します。プレースホルダーを置き換え、IDE のプロセスが変数を読み取れることを確認してください。

export NLS_APP_KEY="<appkey>"
export NLS_TOKEN="<NLS_TOKEN>"
export NLS_HTTP_URL="https://nls-gateway-ap-southeast-1.aliyuncs.com"
export NLS_WS_URL="wss://nls-gateway-ap-southeast-1.aliyuncs.com/ws/v1"
説明

appkey、トークン、エンドポイントは、プロジェクトアカウントとサービスリージョンに一致している必要があります。トークンが期限切れになった場合は、新しいトークンを取得して環境変数を更新してください。

短文音声認識

サンプル音声ファイルをダウンロードします。これを nls-sample-16k.wav として保存し、一致する 16 kHz の英語認識モデルを使用します。また、ご自身の録音を使用することもできます。その場合、録音ファイルは、長さが 60 秒以内、サンプリングレートが 16 kHz、16 ビットサンプル、1 チャンネルで、認識モデルと一致する言語の PCM 形式の WAV ファイルである必要があります。

export NLS_AUDIO_FILE="./nls-sample-16k.wav"

cURL

認識リクエストを送信します。

curl -X POST "${NLS_HTTP_URL}/stream/v1/asr?appkey=${NLS_APP_KEY}&format=wav&sample_rate=16000" \
  -H "X-NLS-Token: ${NLS_TOKEN}" \
  -H "Content-Type: application/octet-stream" \
  --data-binary "@${NLS_AUDIO_FILE}"

Postman

Postman をインストールして POST リクエストを作成します。 上記のアクセスパラメーターを使用して、NLS_HTTP_URL、NLS_APP_KEY、および NLS_TOKEN を Postman の変数として定義します。

場所

設定

URL

{{NLS_HTTP_URL}}/stream/v1/asr

Params

appkey={{NLS_APP_KEY}}; format=wav; sample_rate=16000

Headers

X-NLS-Token: {{NLS_TOKEN}}

Content-Type: application/octet-stream

Body

[binary] を選択し、WAV ファイルをアップロードします。

成功したレスポンスは次のようになります。 result には認識されたテキストが含まれます:

{
  "task_id": "<TASK_ID>",
  "result": "weather in beijing",
  "status": 20000000,
  "message": "SUCCESS"
}

すべてのパラメーターと音声要件については、「短文音声認識の RESTful API」をご参照ください。

リアルタイム音声認識

この Java サンプルは、ローカルの WAV ファイルを PCM ストリームとして読み取り、チャンクで送信します。このサンプルでは SDK 2.2.1 を使用します。Maven プロジェクトに次の依存関係を追加します。

<dependency>
  <groupId>com.alibaba.nls</groupId>
  <artifactId>nls-sdk-transcriber</artifactId>
  <version>2.2.1</version>
</dependency>

サンプル音声ファイルをダウンロードし、NLS_AUDIO_FILE をそのローカルパスに設定します。NLS_APP_KEY、NLS_TOKEN、および NLS_WS_URL を再利用します。このコードは、16 kHz のサンプルレート、16 ビットサンプル、1 チャンネルのローカル PCM 形式 WAV ファイルを使用して、ライブオーディオストリームをシミュレートします。

import com.alibaba.nls.client.protocol.InputFormatEnum;
import com.alibaba.nls.client.protocol.NlsClient;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriber;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberListener;
import com.alibaba.nls.client.protocol.asr.SpeechTranscriberResponse;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.AudioFormat;
import java.io.File;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

public class RealtimeExample {
    private static String env(String name) {
        String value = System.getenv(name);
        if (value == null || value.isEmpty()) {
            throw new IllegalArgumentException(name + " を設定してください");
        }
        return value;
    }

    public static void main(String[] args) throws Exception {
        String appKey = env("NLS_APP_KEY");
        String token = env("NLS_TOKEN");
        String url = env("NLS_WS_URL");
        String audioFile = env("NLS_AUDIO_FILE");
        CountDownLatch done = new CountDownLatch(1);
        AtomicReference<String> error = new AtomicReference<>();
        SpeechTranscriberListener listener = new SpeechTranscriberListener() {
            public void onTranscriberStart(SpeechTranscriberResponse r) {
                System.out.println("task_id=" + r.getTaskId());
            }
            public void onSentenceBegin(SpeechTranscriberResponse r) {}
            public void onTranscriptionResultChange(SpeechTranscriberResponse r) {}
            public void onSentenceEnd(SpeechTranscriberResponse r) {
                System.out.println(r.getTransSentenceText());
            }
            public void onTranscriptionComplete(SpeechTranscriberResponse r) {
                System.out.println(r.getName() + ": " + r.getStatus());
                done.countDown();
            }
            public void onFail(SpeechTranscriberResponse r) {
                error.set("task_id=" + r.getTaskId() + ", status="
                    + r.getStatus() + ", message=" + r.getStatusText());
                done.countDown();
            }
        };

        NlsClient client = new NlsClient(url, token);
        SpeechTranscriber transcriber = null;
        try (AudioInputStream audio = AudioSystem.getAudioInputStream(new File(audioFile))) {
            AudioFormat f = audio.getFormat();
            if (!f.getEncoding().equals(AudioFormat.Encoding.PCM_SIGNED)
                    || f.getSampleRate() != 16000 || f.getSampleSizeInBits() != 16
                    || f.getChannels() != 1 || f.isBigEndian()) {
                throw new IllegalArgumentException("16 kHz、16ビット、モノラルの PCM WAV ファイルを使用してください");
            }
            transcriber = new SpeechTranscriber(client, listener);
            transcriber.setAppKey(appKey);
            transcriber.setFormat(InputFormatEnum.PCM);
            transcriber.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
            transcriber.setEnablePunctuation(true);
            transcriber.start();
            byte[] buffer = new byte[3200];
            int count;
            while ((count = audio.read(buffer)) != -1) {
                if (error.get() != null) throw new IllegalStateException(error.get());
                transcriber.send(buffer, count);
                Thread.sleep(Math.max(1, count / 32));
            }
            transcriber.stop();
            if (!done.await(30, TimeUnit.SECONDS)) {
                throw new IllegalStateException("文字起こし完了の待機中にタイムアウトしました");
            }
            if (error.get() != null) throw new IllegalStateException(error.get());
        } finally {
            if (transcriber != null) transcriber.close();
            client.shutdown();
        }
    }
}

出力には、認識されたテキストと完了イベントが含まれます。例:

task_id=<TASK_ID>
weather in beijing. 
TranscriptionCompleted: 20000000

その他の Java サンプルについては、nls-sdk-java-demo をダウンロードしてください。API の詳細については、「リアルタイム音声認識の API リファレンス」をご参照ください。

音声ファイルの文字起こし

Python を使用して、音声ファイルの文字起こしタスクを送信します。このサービスは、リクエストでファイルの内容を受け取るのではなく、URL から音声を取得します。アクセス可能な音声 URL を準備してください。ファイルは 512 MB を超えてはなりません。フォーマットと長さの要件については、「音声ファイルの文字起こし API リファレンス」をご参照ください。

依存関係をインストールします。この例では、aliyun-python-sdk-core 2.15.1 を使用します。

python3 -m pip install aliyun-python-sdk-core

以下の設定では、サンプル音声ファイルを使用します。上記で設定した NLS_APP_KEY を再利用します。

export ALIYUN_AK_ID="<ACCESS_KEY_ID>"
export ALIYUN_AK_SECRET="<ACCESS_KEY_SECRET>"
export NLS_FILE_URL="https://help-static-aliyun-doc.aliyuncs.com/file-manage-files/en-US/20230426/vsxg/nls-sample-16k-en.wav"

独自の録音を使用するには、OSS にアップロードし、NLS_FILE_URL を置き換えます。 プライベートオブジェクトについては、「署名付き URL を使用してファイルをダウンロードまたはプレビューする」をご参照ください。 サービスがオーディオを取得している間、URL が有効なままであることを確認してください。

export NLS_REGION_ID="ap-southeast-1"
export NLS_FILETRANS_DOMAIN="filetrans.ap-southeast-1.aliyuncs.com"
export NLS_FILETRANS_API_VERSION="2019-08-23"
import json
import os
import time
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest


def main():
    client = AcsClient(os.environ["ALIYUN_AK_ID"],
                       os.environ["ALIYUN_AK_SECRET"],
                       os.environ["NLS_REGION_ID"])

    def call(action, method, params):
        request = CommonRequest()
        request.set_domain(os.environ["NLS_FILETRANS_DOMAIN"])
        request.set_version(os.environ["NLS_FILETRANS_API_VERSION"])
        request.set_product("nls-filetrans")
        request.set_protocol_type("https")
        request.set_accept_format("json")
        request.set_action_name(action)
        request.set_method(method)
        for key, value in params.items():
            if method == "POST":
                request.add_body_params(key, value)
            else:
                request.add_query_param(key, value)
        return json.loads(client.do_action_with_exception(request))

    task = {"appkey": os.environ["NLS_APP_KEY"],
            "file_link": os.environ["NLS_FILE_URL"],
            "version": "4.0", "enable_words": False}
    result = call("SubmitTask", "POST", {"Task": json.dumps(task)})
    if result.get("StatusText") != "SUCCESS" or not result.get("TaskId"):
        raise RuntimeError(result)
    task_id = result["TaskId"]
    print("TaskId:", task_id)

    for _ in range(60):
        result = call("GetTaskResult", "GET", {"TaskId": task_id})
        status = result.get("StatusText")
        if status == "SUCCESS":
            print(json.dumps(result.get("Result"), ensure_ascii=False, indent=2))
            return
        if status == "SUCCESS_WITH_NO_VALID_FRAGMENT":
            print("有効な音声フラグメントは認識されませんでした。")
            return
        if status not in ("RUNNING", "QUEUEING"):
            raise RuntimeError(result)
        time.sleep(10)
    raise TimeoutError("タスクはまだ実行中です。後で TaskId を使用して照会してください: " + task_id)


if __name__ == "__main__":
    main()

このプログラムはタスクを送信し、文字起こしが完了するのを待ちます。出力例:

TaskId: <TASK_ID>
{
  "Sentences": [
    {
      "EndTime": 1300,
      "SilenceDuration": 0,
      "SpeakerId": "1",
      "BeginTime": 0,
      "Text": "weather in beijing. ",
      "ChannelId": 0,
      "SpeechRate": 138,
      "EmotionValue": 7.1
    }
  ]
}

音声合成

Java SDK を使用して、テキストを 16 kHz の WAV ファイルに合成します。このサンプルでは SDK 2.2.1 を使用します。Maven プロジェクトに次の依存関係を追加します。

<dependency>
  <groupId>com.alibaba.nls</groupId>
  <artifactId>nls-sdk-tts</artifactId>
  <version>2.2.1</version>
</dependency>

NLS_APP_KEY、NLS_TOKEN、および NLS_WS_URLを再利用し、音声とテキストを設定します:

export NLS_VOICE="abby"
export NLS_TEXT="Hello. The weather is nice today."
import com.alibaba.nls.client.protocol.NlsClient;
import com.alibaba.nls.client.protocol.OutputFormatEnum;
import com.alibaba.nls.client.protocol.SampleRateEnum;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizer;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerListener;
import com.alibaba.nls.client.protocol.tts.SpeechSynthesizerResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;

public class SynthesisExample {
    private static String env(String name) {
        String value = System.getenv(name);
        if (value == null || value.isEmpty()) throw new IllegalArgumentException(name + " を設定してください");
        return value;
    }

    public static void main(String[] args) throws Exception {
        String appKey = env("NLS_APP_KEY");
        String token = env("NLS_TOKEN");
        String url = env("NLS_WS_URL");
        String voice = env("NLS_VOICE");
        String text = env("NLS_TEXT");
        CountDownLatch done = new CountDownLatch(1);
        AtomicReference<String> error = new AtomicReference<>();
        NlsClient client = new NlsClient(url, token);
        SpeechSynthesizer synthesizer = null;
        try (FileOutputStream output = new FileOutputStream("speech.wav")) {
            SpeechSynthesizerListener listener = new SpeechSynthesizerListener() {
                public void onMessage(ByteBuffer message) {
                    byte[] bytes = new byte[message.remaining()];
                    message.get(bytes);
                    try { output.write(bytes); }
                    catch (IOException e) { error.set(e.getMessage()); done.countDown(); }
                }
                public void onComplete(SpeechSynthesizerResponse r) {
                    System.out.println(r.getName() + ": " + r.getStatus());
                    done.countDown();
                }
                public void onFail(SpeechSynthesizerResponse r) {
                    error.set("task_id=" + r.getTaskId() + ", status="
                        + r.getStatus() + ", message=" + r.getStatusText());
                    done.countDown();
                }
                public void onMetaInfo(SpeechSynthesizerResponse r) {}
            };
            synthesizer = new SpeechSynthesizer(client, listener);
            synthesizer.setAppKey(appKey);
            synthesizer.setFormat(OutputFormatEnum.WAV);
            synthesizer.setSampleRate(SampleRateEnum.SAMPLE_RATE_16K);
            synthesizer.setVoice(voice);
            synthesizer.setText(text);
            synthesizer.start();
            if (!done.await(60, TimeUnit.SECONDS)) {
                throw new IllegalStateException("合成完了の待機中にタイムアウトしました");
            }
            if (error.get() != null) throw new IllegalStateException(error.get());
            System.out.println("音声が speech.wav に保存されました");
        } finally {
            if (synthesizer != null) synthesizer.close();
            client.shutdown();
        }
    }
}

合成に成功したら、保存された speech.wav ファイルを再生します。出力は次のとおりです。

SynthesisCompleted: 20000000
音声が speech.wav に保存されました

その他の Java サンプルについては、nls-sdk-java-demo をダウンロードしてください。その他のボイス、言語、パラメーターについては、「音声合成 API リファレンス」をご参照ください。