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

Intelligent Speech Interaction:RESTful API

最終更新日:Oct 28, 2026

音声合成 RESTful API は、HTTPS の GET または POST リクエストを介してテキストを音声に変換し、レスポンスボディで音声を返します。音声フォーマット、サンプルレート、話者、話速、ピッチ、音量を設定できます。

機能

この API は、PCM、WAV、MP3 形式の音声と、さまざまな話者をサポートしています。音声フォーマットとサンプルレートは、リクエストパラメーターで設定します。

重要
  • 各リクエストは最大 300 文字まで受け付けます。超過した文字は切り捨てられます。長いテキストはセグメントに分割し、各セグメントを合成してから音声を連結してください。

  • 合成時間はテキストとモデルによって異なります。レスポンス全体を待つのではなく、レスポンスをストリーミングして音声が届き次第処理してください。レスポンスが完全に読み取られるまで接続を開いたままにしてください。

前提条件

エンドポイント

サービスリージョンに対応する AppKey とトークンを使用します。以下の例では、パブリック HTTPS エンドポイントを使用しています。

リージョン

リクエスト URL

シンガポール

https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts

例

AppKey とトークンのプレースホルダーを有効な認証情報に置き換えてください。トークン、トークンを含む完全な URL、またはトークンを含むリクエストボディをログに記録しないでください。各言語の例では、GET および POST リクエストを示しています。Java にはストリーミングの例も含まれています。

Java

依存関係

Maven プロジェクトの pom.xml に以下の依存関係を追加します。

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.9.1</version>
</dependency>
<!-- http://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>
<dependency>
    <groupId>org.asynchttpclient</groupId>
    <artifactId>async-http-client</artifactId>
    <version>2.5.4</version>
</dependency>

標準リクエスト

import java.io.File;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import com.alibaba.fastjson.JSONObject;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class SpeechSynthesizerRestfulDemo {
    private String accessToken;
    private String appkey;
    public SpeechSynthesizerRestfulDemo(String appkey, String token) {
        this.appkey = appkey;
        this.accessToken = token;
    }
    /**
     * HTTPS GET リクエスト
     */
    public void processGETRequet(String text, String audioSaveFile, String format, int sampleRate, String voice) {
        /**
         * HTTPS GET リクエストを設定します:
         * 1. HTTPS プロトコルを使用します。
         * 2. 音声合成サービスのドメイン名:nls-gateway-ap-southeast-1.aliyuncs.com
         * 3. 音声合成 API のリクエストパス:/stream/v1/tts
         * 4. この例で使用するパラメーターを設定します:appkey、token、text、format、sample_rate。
         * 5. オプションのリクエストパラメーターを設定します:voice、volume、speech_rate、pitch_rate。
         */
        String url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
        url = url + "?appkey=" + appkey;
        url = url + "&token=" + accessToken;
        url = url + "&text=" + text;
        url = url + "&format=" + format;
        url = url + "&voice=" + voice;
        url = url + "&sample_rate=" + String.valueOf(sampleRate);
        // voice: 話者の音声。オプション。デフォルト値:xiaoyun。
        // url = url + "&voice=" + "xiaoyun";
        // volume: 音量。値の範囲は 0~100。オプション。デフォルト値:50。
        // url = url + "&volume=" + String.valueOf(50);
        // speech_rate: 話速。値の範囲は -500~500。オプション。デフォルト値:0。
        // url = url + "&speech_rate=" + String.valueOf(0);
        // pitch_rate: ピッチ。値の範囲は -500~500。オプション。デフォルト値:0。
        // url = url + "&pitch_rate=" + String.valueOf(0);
        /**
         * HTTPS GET リクエストを送信し、サーバーからのレスポンスを処理します。
         */
        Request request = new Request.Builder().url(url).get().build();
        try {
            long start = System.currentTimeMillis();
            OkHttpClient client = new OkHttpClient();
            Response response = client.newCall(request).execute();
            System.out.println("total latency :" + (System.currentTimeMillis() - start) + " ms");
            System.out.println(response.headers().toString());
            String contentType = response.header("Content-Type");
            if ("audio/mpeg".equals(contentType)) {
                File f = new File(audioSaveFile);
                FileOutputStream fout = new FileOutputStream(f);
                fout.write(response.body().bytes());
                fout.close();
                System.out.println("The GET request succeeded!");
            }
            else {
                // Content-Type が null または "application/json" の場合。
                String errorMessage = response.body().string();
                System.out.println("The GET request failed: " + errorMessage);
            }
            response.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * HTTPS POST リクエスト
     */
    public void processPOSTRequest(String text, String audioSaveFile, String format, int sampleRate, String voice) {
        /**
         * HTTPS POST リクエストを設定します:
         * 1. HTTPS プロトコルを使用します。
         * 2. 音声合成サービスのドメイン名:nls-gateway-ap-southeast-1.aliyuncs.com
         * 3. 音声合成 API のリクエストパス:/stream/v1/tts
         * 4. この例で使用するパラメーターを設定します:appkey、token、text、format、sample_rate。
         * 5. オプションのリクエストパラメーターを設定します:voice、volume、speech_rate、pitch_rate。
         */
        String url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
        JSONObject taskObject = new JSONObject();
        taskObject.put("appkey", appkey);
        taskObject.put("token", accessToken);
        taskObject.put("text", text);
        taskObject.put("format", format);
        taskObject.put("voice", voice);
        taskObject.put("sample_rate", sampleRate);
        // voice: 話者の音声。オプション。デフォルト値:xiaoyun。
        // taskObject.put("voice", "xiaoyun");
        // volume: 音量。値の範囲は 0~100。オプション。デフォルト値:50。
        // taskObject.put("volume", 50);
        // speech_rate: 話速。値の範囲は -500~500。オプション。デフォルト値:0。
        // taskObject.put("speech_rate", 0);
        // pitch_rate: ピッチ。値の範囲は -500~500。オプション。デフォルト値:0。
        // taskObject.put("pitch_rate", 0);
        String bodyContent = taskObject.toJSONString();
        RequestBody reqBody = RequestBody.create(MediaType.parse("application/json"), bodyContent);
        Request request = new Request.Builder()
            .url(url)
            .header("Content-Type", "application/json")
            .post(reqBody)
            .build();
        try {
            OkHttpClient client = new OkHttpClient();
            Response response = client.newCall(request).execute();
            String contentType = response.header("Content-Type");
            if ("audio/mpeg".equals(contentType)) {
                File f = new File(audioSaveFile);
                FileOutputStream fout = new FileOutputStream(f);
                fout.write(response.body().bytes());
                fout.close();
                System.out.println("The POST request succeeded!");
            }
            else {
                // Content-Type が null または "application/json" の場合。
                String errorMessage = response.body().string();
                System.out.println("The POST request failed: " + errorMessage);
            }
            response.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        if (args.length < 2) {
            System.err.println("SpeechSynthesizerRestfulDemo needs params: <token> <app-key>");
            System.exit(-1);
        }
        String token = args[0];
        String appkey = args[1];
        SpeechSynthesizerRestfulDemo demo = new SpeechSynthesizerRestfulDemo(appkey, token);
        String text = "Today is Monday. The weather is nice.";
        // RFC 3986 に基づいてテキストを URL エンコードします。
        String textUrlEncode = text;
        try {
            textUrlEncode = URLEncoder.encode(textUrlEncode, "UTF-8")
                .replace("+", "%20")
                .replace("*", "%2A")
                .replace("%7E", "~");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(textUrlEncode);
        String audioSaveFile = "syAudio.wav";
        String format = "wav";
        int sampleRate = 16000;
        demo.processGETRequet(textUrlEncode, audioSaveFile, format, sampleRate, "siyue");
        //demo.processPOSTRequest(text, audioSaveFile, format, sampleRate, "siyue");
        System.out.println("### Game Over ###");
    }
}

ストリーミングレスポンス

レスポンスコールバックを介して音声チャンクを受信します。コールバックは短くしてください。再生やさらなる処理のために、音声を別のスレッドに渡してください。

import java.io.File;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.concurrent.CountDownLatch;
import io.netty.handler.codec.http.HttpHeaders;
import org.asynchttpclient.AsyncHandler;
import org.asynchttpclient.AsyncHttpClient;
import org.asynchttpclient.AsyncHttpClientConfig;
import org.asynchttpclient.DefaultAsyncHttpClient;
import org.asynchttpclient.DefaultAsyncHttpClientConfig;
import org.asynchttpclient.HttpResponseBodyPart;
import org.asynchttpclient.HttpResponseStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
 * この例では、以下の方法を示します:
 * 1. 音声合成の RESTful API を呼び出す。
 * 2. HTTP チャンク転送エンコーディングを有効にして、ストリーミングレスポンスを処理する。
 */
public class SpeechSynthesizerRestfulChunkedDemo {
    private static Logger logger = LoggerFactory.getLogger(SpeechSynthesizerRestfulChunkedDemo.class);
    private String accessToken;
    private String appkey;
    public SpeechSynthesizerRestfulChunkedDemo(String appkey, String token) {
        this.appkey = appkey;
        this.accessToken = token;
    }
    public void processGETRequest(String text, String audioSaveFile, String format, int sampleRate, String voice, boolean chunked) {
        /**
         * HTTPS GET リクエストを設定します:
         * 1. プロトコル:HTTPS
         * 2. 音声合成エンドポイント:nls-gateway-ap-southeast-1.aliyuncs.com
         * 3. リクエストパス:/stream/v1/tts
         * 4. この例で使用するパラメーター:appkey、token、text、format、sample_rate
         * 5. オプションのパラメーター:voice、volume、speech_rate、pitch_rate
         * 6. `chunk` パラメーターを使用して HTTP チャンク転送エンコーディングを有効にします。
         */
        String url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
        url = url + "?appkey=" + appkey;
        url = url + "&token=" + accessToken;
        url = url + "&text=" + text;
        url = url + "&format=" + format;
        url = url + "&voice=" + voice;
        url = url + "&sample_rate=" + String.valueOf(sampleRate);
        url = url + "&chunk=" + String.valueOf(chunked);
        try {
            AsyncHttpClientConfig config = new DefaultAsyncHttpClientConfig.Builder()
                .setConnectTimeout(3000)
                .setKeepAlive(true)
                .setReadTimeout(10000)
                .setRequestTimeout(50000)
                .setMaxConnections(1000)
                .setMaxConnectionsPerHost(200)
                .setPooledConnectionIdleTimeout(-1)
                .build();
            AsyncHttpClient httpClient = new DefaultAsyncHttpClient(config);
            CountDownLatch latch = new CountDownLatch(1);
            AsyncHandler<org.asynchttpclient.Response> handler = new AsyncHandler<org.asynchttpclient.Response>() {
                FileOutputStream outs;
                boolean firstRecvBinary = true;
                long startTime = System.currentTimeMillis();
                int httpCode = 200;
                @Override
                public State onStatusReceived(HttpResponseStatus httpResponseStatus) throws Exception {
                    logger.info("onStatusReceived status {}", httpResponseStatus);
                    httpCode = httpResponseStatus.getStatusCode();
                    if (httpResponseStatus.getStatusCode() != 200) {
                        logger.error("request error " +  httpResponseStatus.toString());
                    }
                    return State.CONTINUE;
                }
                @Override
                public State onHeadersReceived(HttpHeaders httpHeaders) throws Exception {
                    if (httpCode != 200 || !"audio/mpeg".equals(httpHeaders.get("Content-Type"))) {
                        throw new java.io.IOException("Unexpected synthesis response: HTTP " + httpCode);
                    }
                    outs = new FileOutputStream(new File(audioSaveFile));
                    return State.CONTINUE;
                }
                @Override
                public State onBodyPartReceived(HttpResponseBodyPart httpResponseBodyPart) throws Exception {
                    // 注:応答性を向上させるため、最初のデータチャンクを受信したらすぐに音声ストリームを再生または処理してください。
                    // 注:このコールバック内で時間のかかる操作を実行しないでください。バイナリの音声合成ストリームを非同期で、またはキューを使用して別のスレッドにプッシュしてください。
                    logger.info("onBodyPartReceived " + httpResponseBodyPart.getBodyPartBytes().toString());
                    if(httpCode != 200) {
                        System.err.write(httpResponseBodyPart.getBodyPartBytes());
                    }
                    if (firstRecvBinary) {
                        firstRecvBinary = false;
                        // 初回パケットレイテンシーを追跡します。最初のパケットを受信するとすぐに、音声処理 (例:再生や呼び出し元への送信) を開始できます。
                        // 注:この初回パケットレイテンシーには、ネットワーク接続を確立する時間も含まれます。
                        logger.info("tts first latency " + (System.currentTimeMillis() - startTime) + " ms");
                    }
                    // この例では、音声ストリームはファイルに保存されます。
                    outs.write(httpResponseBodyPart.getBodyPartBytes());
                    return State.CONTINUE;
                }
                @Override
                public void onThrowable(Throwable throwable) {
                    logger.error("Synthesis request failed: {}", throwable.getClass().getSimpleName());
                    if (outs != null) {
                        try { outs.close(); } catch (java.io.IOException ignored) { }
                    }
                    latch.countDown();
                }
                @Override
                public org.asynchttpclient.Response onCompleted() throws Exception {
                    logger.info("completed");
                    logger.info("tts total latency " + (System.currentTimeMillis() - startTime) + " ms");
                    outs.close();
                    latch.countDown();
                    return null;
                }
            };
            httpClient.prepareGet(url).execute(handler);
            // 合成が完了するのを待ちます。
            latch.await();
            httpClient.close();
        }catch (Exception e) {
        }
    }
    public static void main(String[] args) {
        if (args.length < 2) {
            System.err.println("SpeechSynthesizerRestfulDemo requires the following parameters:  ");
            System.exit(-1);
        }
        String token = args[0];
        String appkey = args[1];
        SpeechSynthesizerRestfulChunkedDemo demo = new SpeechSynthesizerRestfulChunkedDemo(appkey, token);
        String text = "Today is Monday. The weather is nice.";
        // RFC 3986 に基づいてテキストを URL エンコードします。
        String textUrlEncode = text;
        try {
            textUrlEncode = URLEncoder.encode(textUrlEncode, "UTF-8")
                .replace("+", "%20")
                .replace("*", "%2A")
                .replace("%7E", "~");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(textUrlEncode);
        String audioSaveFile = "syAudio.wav";
        String format = "wav";
        int sampleRate = 16000;
        // 最後のパラメーターを true に設定すると、HTTP チャンク転送エンコーディングが有効になります。
        demo.processGETRequest(textUrlEncode, audioSaveFile, format, sampleRate, "aixia", true);
        System.out.println("### Demo finished ###");
    }
}

長いテキストを分割して合成する完全な例については、nls-restful-java-demo.zip をダウンロードしてください。

C++

説明
  • C++ デモをダウンロード。

    C++ デモでは、HTTPS リクエストとレスポンスの処理に cURL を、POST リクエストボディの JSON 文字列の生成に JsonCpp を使用します。

  • Linux の最小ランタイム要件:Glibc 2.5 以降、および GCC 4 または GCC 5。

  • Windows でコンパイルするには、lib ディレクトリ内の windows.zip パッケージを解凍します。

サンプルディレクトリには以下が含まれています。

  • CMakeLists.txt:デモプロジェクトの CMake 設定ファイル。

  • demo:サンプルソースコードが含まれています。

    ファイル名

    説明

    restfulTtsDemo.cpp

    音声合成 RESTful API の使用方法を示します。

  • include: サードパーティライブラリのヘッダーファイルが含まれています。

    ディレクトリ名

    説明

    curl

    cURL ライブラリのヘッダーファイル。

    json

    JsonCpp ライブラリのヘッダーファイル。

  • lib:cURL および JsonCpp の動的ライブラリが含まれています。

    ご利用のオペレーティングシステムと環境に基づいて、適切なライブラリをロードしてください。

    • Linux (Glibc 2.5 以降、および GCC 4 または 5 が必要)

    • Windows (Visual Studio 2013 または 2015 が必要)

  • readme.txt:Readme ファイル。

  • release.log:リリースノート。

  • version:バージョン番号。

  • build.sh:デモのビルドスクリプト。

デモをコンパイルして実行するには:

デモが path/to に展開されていると仮定し、Linux ターミナルで以下のコマンドを実行してプログラムをコンパイルおよび実行します。

  • CMake を使用する場合:

    1. CMake 2.4 以降がインストールされていることを確認します。

    2. cd path/to/sdk/lib

    3. tar -zxvpf linux.tar.gz

    4. cd path/to/sdk

    5. ./build.sh

    6. cd path/to/sdk/demo

    7. ./restfulTtsDemo <your-token> <your-appkey>

  • CMake を使用しない場合:

    1. cd path/to/sdk/lib。

    2. tar -zxvpf linux.tar.gz

    3. cd path/to/sdk/demo

    4. g++ -o restfulTtsDemo restfulTtsDemo.cpp -I path/to/sdk/include -L path/to/sdk/lib/linux -ljsoncpp -lssl -lcrypto -lcurl -D_GLIBCXX_USE_CXX11_ABI=0

    5. export LD_LIBRARY_PATH=path/to/sdk/lib/linux/

    6. ./restfulTtsDemo <your-token> <your-appkey>

サンプルコード:

#ifdef _WIN32
#include <Windows.h>
#endif
#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <sstream>
#include "curl/curl.h"
#include "json/json.h"
using namespace std;
#ifdef _WIN32
string GBKToUTF8(const string &strGBK) {
    string strOutUTF8 = "";
    WCHAR * str1;
    int n = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
    str1 = new WCHAR[n];
    MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, str1, n);
    n = WideCharToMultiByte(CP_UTF8, 0, str1, -1, NULL, 0, NULL, NULL);
    char * str2 = new char[n];
    WideCharToMultiByte(CP_UTF8, 0, str1, -1, str2, n, NULL, NULL);
    strOutUTF8 = str2;
    delete[] str1;
    str1 = NULL;
    delete[] str2;
    str2 = NULL;
    return strOutUTF8;
}
#endif
void stringReplace(string& src, const string& s1, const string& s2) {
    string::size_type pos = 0;
    while ((pos = src.find(s1, pos)) != string::npos) {
        src.replace(pos, s1.length(), s2);
        pos += s2.length();
    }
}
string urlEncode(const string& src) {
    CURL* curl = curl_easy_init();
    char* output = curl_easy_escape(curl, src.c_str(), src.size());
    string result(output);
    curl_free(output);
    curl_easy_cleanup(curl);
    return result;
}
size_t responseHeadersCallback(void* ptr, size_t size, size_t nmemb, void* userdata)
{
    map<string, string> *headers = (map<string, string>*)userdata;
    string line((char*)ptr, size * nmemb);
    string::size_type pos = line.find(':');
    if (pos != line.npos)
    {
        string name = line.substr(0, pos);
        string value = line.substr(pos + 2);
        size_t p = 0;
        if ((p = value.rfind('\r')) != value.npos) {
            value = value.substr(0, p);
        }
        headers->insert(make_pair(name, value));
    }
    return size * nmemb;
}
size_t responseBodyCallback(void* ptr, size_t size, size_t nmemb, void* userData) {
    size_t len = size * nmemb;
    char* pBuf = (char*)ptr;
    string* bodyContent = (string*)userData;
    (*bodyContent).append(string(pBuf, pBuf + len));
    return len;
}
int processGETRequest(string appKey, string token, string text, 
                      string audioSaveFile, string format, int sampleRate) {
    CURL* curl = NULL;
    CURLcode res;
    curl = curl_easy_init();
    if (curl == NULL) {
        return -1;
    }
    string url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
    /**
     * パラメーター付きのリクエスト URL を構築します。
     */
    ostringstream oss;
    oss << url;
    oss << "?appkey=" << appKey;
    oss << "&token=" << token;
    oss << "&text=" << text;
    oss << "&format=" << format;
    oss << "&sample_rate=" << sampleRate;
    // voice: 合成用の音声。オプション。デフォルト:xiaoyun。
    // oss << "&voice=" << "xiaoyun";
    // volume: 出力音量。オプション。有効範囲:0~100。デフォルト:50。
    // oss << "&volume=" << 50;
    // speech_rate: 話速。オプション。有効範囲:-500~500。デフォルト:0。
    // oss << "&speech_rate=" << 0;
    // pitch_rate: ピッチ。オプション。有効範囲:-500~500。デフォルト:0。
    // oss << "&pitch_rate=" << 0;
    string request = oss.str();
    curl_easy_setopt(curl, CURLOPT_URL, request.c_str());
    /**
     * レスポンスヘッダーのコールバック関数を設定します。
     */
    map<string, string> responseHeaders;
    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, responseHeadersCallback);
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, &responseHeaders);
    /**
     * レスポンスボディのコールバック関数を設定します。
     */
    string bodyContent = "";
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, responseBodyCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &bodyContent);
    /**
     * HTTPS GET リクエストを送信します。
     */
    res = curl_easy_perform(curl);
    /**
     * リソースを解放します。
     */
    curl_easy_cleanup(curl);
    if (res != CURLE_OK) {
        cerr << "curl_easy_perform failed: " << curl_easy_strerror(res) << endl;
        return -1;
    }
    /**
     * サーバーからのレスポンスを処理します。
     */
    map<string, string>::iterator it = responseHeaders.find("Content-Type");
    if (it != responseHeaders.end() && it->second.compare("audio/mpeg") == 0) {
        ofstream fs;
        fs.open(audioSaveFile.c_str(), ios::out | ios::binary);
        if (!fs.is_open()) {
            cout << "Cannot open the audio save file.";
            return -1;
        }
        fs.write(bodyContent.c_str(), bodyContent.size());
        fs.close();
        cout << "GET request succeeded." << endl;
    }
    else {
        cout << "The GET request failed: " + bodyContent << endl;
        return -1;
    }
    return 0;
}
int processPOSTRequest(string appKey, string token, string text,
                       string audioSaveFile, string format, int sampleRate) {
    CURL* curl = NULL;
    CURLcode res;
    curl = curl_easy_init();
    if (curl == NULL) {
        return -1;
    }
    string url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
    /**
     * HTTPS POST リクエストの URL を設定します。
     */
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    /**
     * リクエストヘッダーを設定します。
     */
    struct curl_slist* headers = NULL;
    // Content-Type
    headers = curl_slist_append(headers, "Content-Type:application/json");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    /**
     * リクエストボディを構築します。
     */
    Json::Value root;
    Json::FastWriter writer;
    root["appkey"] = appKey;
    root["token"] = token;
    root["text"] = text;
    root["format"] = format;
    root["sample_rate"] = sampleRate;
    // voice: 合成用の音声。オプション。デフォルト:xiaoyun。
    // root["voice"] = "xiaoyun";
    // volume: 出力音量。オプション。有効範囲:0~100。デフォルト:50。
    // root["volume"] = 50;
    // speech_rate: 話速。オプション。有効範囲:-500~500。デフォルト:0。
    // root["speech_rate"] = 0;
    // pitch_rate: ピッチ。オプション。有効範囲:-500~500。デフォルト:0。
    // root["pitch_rate"] = 0;
    string task = writer.write(root);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, task.c_str());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, task.length());
    /**
     * レスポンスヘッダーのコールバック関数を設定します。
     */
    map<string, string> responseHeaders;
    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, responseHeadersCallback);
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, &responseHeaders);
    /**
     * レスポンスボディのコールバック関数を設定します。
     */
    string bodyContent = "";
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, responseBodyCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &bodyContent);
    /**
     * HTTPS POST リクエストを送信します。
     */
    res = curl_easy_perform(curl);
    /**
     * リソースを解放します。
     */
    curl_slist_free_all(headers);
    curl_easy_cleanup(curl);
    if (res != CURLE_OK) {
        cerr << "curl_easy_perform failed: " << curl_easy_strerror(res) << endl;
        return -1;
    }
    /**
     * サーバーからのレスポンスを処理します。
     */
    map<string, string>::iterator it = responseHeaders.find("Content-Type");
    if (it != responseHeaders.end() && it->second.compare("audio/mpeg") == 0) {
        ofstream fs;
        fs.open(audioSaveFile.c_str(), ios::out | ios::binary);
        if (!fs.is_open()) {
            cout << "Cannot open the audio save file.";
            return -1;
        }
        fs.write(bodyContent.c_str(), bodyContent.size());
        fs.close();
        cout << "The POST request succeeded." << endl;
    }
    else {
        cout << "The POST request failed: " + bodyContent << endl;
        return -1;
    }
    return 0;
}
int main(int argc, char* argv[]) {
    if (argc < 3) {
        cerr << "Invalid parameters. Usage: ./demo your_token your_appkey" << endl;
        return -1;
    }
    string token = argv[1];
    string appKey = argv[2];
    string text = "Today is Monday, and the weather is nice.";
#ifdef _WIN32
    text = GBKToUTF8(text);
#endif
    string textUrlEncode = urlEncode(text);
    stringReplace(textUrlEncode, "+", "%20");
    stringReplace(textUrlEncode, "*", "%2A");
    stringReplace(textUrlEncode, "%7E", "~");
    string audioSaveFile = "syAudio.wav";
    string format = "wav";
    int sampleRate = 16000;
    // cURL を初期化します。これはプロセスごとに一度だけ実行する必要があります。
    curl_global_init(CURL_GLOBAL_ALL);
    processGETRequest(appKey, token, textUrlEncode, audioSaveFile, format, sampleRate);
    //processPOSTRequest(appKey, token, text, audioSaveFile, format, sampleRate);
    curl_global_cleanup();
    return 0;
}

Python

Python 3 は http.client と urllib.parse を使用します。Python 2 の場合は、コードコメントに示されているように httplib と urllib を使用します。

# -*- coding: UTF-8 -*-
# Python 2.x の場合は httplib をインポートします。
# import httplib
# Python 3.x の場合は http.client をインポートします。
import http.client
# Python 2.x の場合は urllib をインポートします。
# import urllib
# Python 3.x の場合は urllib.parse をインポートします。
import urllib.parse
import json
def processGETRequest(appKey, token, text, audioSaveFile, format, sampleRate) :
    host = 'nls-gateway-ap-southeast-1.aliyuncs.com'
    url = 'https://' + host + '/stream/v1/tts'
    # URL にリクエストパラメーターを設定します。
    url = url + '?appkey=' + appKey
    url = url + '&token=' + token
    url = url + '&text=' + text
    url = url + '&format=' + format
    url = url + '&sample_rate=' + str(sampleRate)
    # voice: オプション。音声。デフォルト:xiaoyun。
    # url = url + '&voice=' + 'xiaoyun'
    # volume: オプション。音量。範囲:0-100。デフォルト:50。
    # url = url + '&volume=' + str(50)
    # speech_rate: オプション。話速。範囲:-500~500。デフォルト:0。
    # url = url + '&speech_rate=' + str(0)
    # pitch_rate: オプション。ピッチ。範囲:-500~500。デフォルト:0。
    # url = url + '&pitch_rate=' + str(0)
    # Python 2.x の場合は httplib を使用します。
    # conn = httplib.HTTPSConnection(host)
    # Python 3.x の場合は http.client を使用します。
    conn = http.client.HTTPSConnection(host)
    conn.request(method='GET', url=url)
    # サーバーのレスポンスを処理します。
    response = conn.getresponse()
    print('Response status and reason:')
    print(response.status ,response.reason)
    contentType = response.getheader('Content-Type')
    print(contentType)
    body = response.read()
    if 'audio/mpeg' == contentType :
        with open(audioSaveFile, mode='wb') as f:
            f.write(body)
        print('The GET request succeeded!')
    else :
        print('The GET request failed: ' + str(body))
    conn.close()
def processPOSTRequest(appKey, token, text, audioSaveFile, format, sampleRate) :
    host = 'nls-gateway-ap-southeast-1.aliyuncs.com'
    url = 'https://' + host + '/stream/v1/tts'
    # HTTPS ヘッダーを設定します。
    httpHeaders = {
        'Content-Type': 'application/json'
        }
    # HTTPS ボディを設定します。
    body = {'appkey': appKey, 'token': token, 'text': text, 'format': format, 'sample_rate': sampleRate}
    body = json.dumps(body)
    # Python 2.x の場合は httplib を使用します。
    # conn = httplib.HTTPSConnection(host)
    # Python 3.x の場合は http.client を使用します。
    conn = http.client.HTTPSConnection(host)
    conn.request(method='POST', url=url, body=body, headers=httpHeaders)
    # サーバーのレスポンスを処理します。
    response = conn.getresponse()
    print('Response status and reason:')
    print(response.status ,response.reason)
    contentType = response.getheader('Content-Type')
    print(contentType)
    body = response.read()
    if 'audio/mpeg' == contentType :
        with open(audioSaveFile, mode='wb') as f:
            f.write(body)
        print('The POST request succeeded!')
    else :
        print('The POST request failed: ' + str(body))
    conn.close()
appKey = 'Your AppKey'
token = 'Your Token'
text = 'Today is Monday, and the weather is nice.'
# RFC 3986 に従ってテキストを URL エンコードします。
textUrlencode = text
# Python 2.x の場合は urllib.quote を使用します。
# textUrlencode = urllib.quote(textUrlencode, '')
# Python 3.x の場合は urllib.parse.quote_plus を使用します。
textUrlencode = urllib.parse.quote_plus(textUrlencode)
textUrlencode = textUrlencode.replace("+", "%20")
textUrlencode = textUrlencode.replace("*", "%2A")
textUrlencode = textUrlencode.replace("%7E", "~")
print('text: ' + textUrlencode)
audioSaveFile = 'syAudio.wav'
format = 'wav'
sampleRate = 16000
# GET リクエスト
processGETRequest(appKey, token, textUrlencode, audioSaveFile, format, sampleRate)
# POST リクエスト
# processPOSTRequest(appKey, token, text, audioSaveFile, format, sampleRate)

PHP

json_encode をサポートする PHP と、cURL 拡張がインストールされている必要があります。HTTPS リクエストでは証明書検証を有効にしておいてください。

<?php
function processGETRequest($appkey, $token, $text, $audioSaveFile, $format, $sampleRate) {
    $url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
    $url = $url . "?appkey=" . $appkey;
    $url = $url . "&token=" . $token;
    $url = $url . "&text=" . $text;
    $url = $url . "&format=" . $format;
    $url = $url . "&sample_rate=" . strval($sampleRate);
    // voice: 話者。オプション。デフォルト:xiaoyun。
    // $url = $url . "&voice=" . "xiaoyun";
    // volume: 音量。オプション。有効範囲:0~100。デフォルト:50。
    // $url = $url . "&volume=" . strval(50);
    // speech_rate: 話速。オプション。有効範囲:-500~500。デフォルト:0。
    // $url = $url . "&speech_rate=" . strval(0);
    // pitch_rate: ピッチ。オプション。有効範囲:-500~500。デフォルト:0。
    // $url = $url . "&pitch_rate=" . strval(0);
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    /**
     * HTTPS GET URL を設定します。
     */
    curl_setopt($curl, CURLOPT_URL, $url);
    /**
     * HTTPS レスポンスにヘッダーを含めます。
     */
    curl_setopt($curl, CURLOPT_HEADER, TRUE);
    /**
     * HTTPS GET リクエストを送信します。
     */
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2);
    $response = curl_exec($curl);
    if ($response == FALSE) {
        print "curl_exec failed!\n";
        curl_close($curl);
        return;
    }
    /**
     * サーバーからのレスポンスを処理します。
     */
    $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    $headers = substr($response, 0, $headerSize);
    $bodyContent = substr($response, $headerSize);
    curl_close($curl);
    if (stripos($headers, "Content-Type: audio/mpeg") != FALSE || stripos($headers, "Content-Type:audio/mpeg") != FALSE) {
        file_put_contents($audioSaveFile, $bodyContent);
        print "The GET request succeeded!\n";
    }
    else {
        print "The GET request failed: " . $bodyContent . "\n";
    }
}
function processPOSTRequest($appkey, $token, $text, $audioSaveFile, $format, $sampleRate) {
    $url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
    /**
     * リクエストパラメーターを JSON 文字列としてリクエストボディに追加します。
     */
    $taskArr = array(
        "appkey" => $appkey,
        "token" => $token,
        "text" => $text,
        "format" => $format,
        "sample_rate" => $sampleRate
        // voice: 話者。オプション。デフォルト:xiaoyun。
        // "voice" => "xiaoyun",
        // volume: 音量。オプション。有効範囲:0~100。デフォルト:50。
        // "volume" => 50,
        // speech_rate: 話速。オプション。有効範囲:-500~500。デフォルト:0。
        // "speech_rate" => 0,
        // pitch_rate: ピッチ。オプション。有効範囲:-500~500。デフォルト:0。
        // "pitch_rate" => 0
    );
    $body = json_encode($taskArr);
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
    /**
     * HTTPS POST URL を設定します。
     */
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POST, TRUE);
    /**
     * HTTPS POST リクエストヘッダーを設定します。
     * */
    $httpHeaders = array(
        "Content-Type: application/json"
    );
    curl_setopt($curl, CURLOPT_HTTPHEADER, $httpHeaders);
    /**
     * HTTPS POST リクエストボディを設定します。
     */
    curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
    /**
     * HTTPS レスポンスにヘッダーを含めます。
     */
    curl_setopt($curl, CURLOPT_HEADER, TRUE);
    /**
     * HTTPS POST リクエストを送信します。
     */
    $response = curl_exec($curl);
    if ($response == FALSE) {
        print "curl_exec failed!\n";
        curl_close($curl);
        return;
    }
    /**
     * サーバーからのレスポンスを処理します。
     */
    $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
    $headers = substr($response, 0, $headerSize);
    $bodyContent = substr($response, $headerSize);
    curl_close($curl);
    if (stripos($headers, "Content-Type: audio/mpeg") != FALSE || stripos($headers, "Content-Type:audio/mpeg") != FALSE) {
        file_put_contents($audioSaveFile, $bodyContent);
        print "The POST request succeeded!\n";
    }
    else {
        print "The POST request failed: " . $bodyContent . "\n";
    }
}
$appkey = "YOUR_APPKEY";
$token = "YOUR_TOKEN";
$text = "Today is Monday. The weather is nice.";
$textUrlEncode = urlencode($text);
$textUrlEncode = preg_replace('/\+/', '%20', $textUrlEncode);
$textUrlEncode = preg_replace('/\*/', '%2A', $textUrlEncode);
$textUrlEncode = preg_replace('/%7E/', '~', $textUrlEncode);
$audioSaveFile = "syAudio.wav";
$format = "wav";
$sampleRate = 16000;
processGETRequest($appkey, $token, $textUrlEncode, $audioSaveFile, $format, $sampleRate);
// processPOSTRequest($appkey, $token, $text, $audioSaveFile, $format, $sampleRate);
?>

Node.js

サンプルファイルを含むディレクトリに依存関係をインストールします。

npm install request --save
const request = require('request');
const fs = require('fs');
function processGETRequest(appkey, token, text, audioSaveFile, format, sampleRate) {
    var url = 'https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts';
    /**
     * URL にリクエストパラメーターを設定します。
     */
    url = url + '?appkey=' + appkey;
    url = url + '&token=' + token;
    url = url + '&text=' + text;
    url = url + '&format=' + format;
    url = url + '&sample_rate=' + sampleRate;
    // voice: オプション。合成音声。デフォルト:xiaoyun。
    // url = url + "&voice=" + "xiaoyun";
    // volume: オプション。音量。範囲:0–100。デフォルト:50。
    // url = url + "&volume=" + 50;
    // speech_rate: オプション。話速。範囲:-500–500。デフォルト:0。
    // url = url + "&speech_rate=" + 0;
    // pitch_rate: オプション。ピッチ。範囲:-500–500。デフォルト:0。
    // url = url + "&pitch_rate=" + 0;
    /**
     * HTTPS GET リクエストを設定します。
     * レスポンスボディをバイナリの Buffer として受け取るには、`encoding` パラメーターを null に設定する必要があります。
     */
    var options = {
        url: url,
        method: 'GET',
        encoding: null
    };
    request(options, function (error, response, body) {
        /**
         * サーバーのレスポンスを処理します。
         */
        if (error != null) {
            console.log(error);
        }
        else {
            var contentType = response.headers['content-type'];
            if (contentType === undefined || contentType != 'audio/mpeg') {
                console.log('The GET request failed!');
            }
            else {
                fs.writeFileSync(audioSaveFile, body);
                console.log('The GET request succeeded!');
            }
        }
    });
}
function processPOSTRequest(appkeyValue, tokenValue, textValue, audioSaveFile, formatValue, sampleRateValue) {
    var url = 'https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts';
    /**
     * POST リクエストボディにリクエストパラメーターを JSON 文字列として設定します。
    */
    var task = {
        appkey : appkeyValue,
        token : tokenValue,
        text : textValue,
        format : formatValue,
        sample_rate : sampleRateValue
        // voice: オプション。合成音声。デフォルト:xiaoyun。
        // voice : 'xiaoyun',
        // volume: オプション。音量。範囲:0–100。デフォルト:50。
        // volume : 50,
        // speech_rate: オプション。話速。範囲:-500–500。デフォルト:0。
        // speech_rate : 0,
        // pitch_rate: オプション。ピッチ。範囲:-500–500。デフォルト:0。
        // pitch_rate : 0
    };
    var bodyContent = JSON.stringify(task);
    /**
     * POST リクエストヘッダーを設定します。
     */
    var httpHeaders = {
        'Content-type' : 'application/json'
    }
    /**
     * HTTPS POST リクエストを設定します。
     * レスポンスボディをバイナリの Buffer として受け取るには、`encoding` パラメーターを null に設定する必要があります。
     */
    var options = {
        url: url,
        method: 'POST',
        headers: httpHeaders,
        body: bodyContent,
        encoding: null
    };
    request(options, function (error, response, body) {
        /**
         * サーバーのレスポンスを処理します。
         */
        if (error != null) {
            console.log(error);
        }
        else {
            var contentType = response.headers['content-type'];
            if (contentType === undefined || contentType != 'audio/mpeg') {
                console.log('The POST request failed!');
            }
            else {
                fs.writeFileSync(audioSaveFile, body);
                console.log('The POST request succeeded!');
            }
        }
    });
}
var appkey = 'Your AppKey';
var token = 'Your Token';
var text = 'Today is Monday, and the weather is nice.';
var textUrlEncode = encodeURIComponent(text)
                    .replace(/[!'()*]/g, function(c) {
                        return '%' + c.charCodeAt(0).toString(16);
                    });
console.log(textUrlEncode);
var audioSaveFile = 'syAudio.wav';
var format = 'wav';
// 合成された音声のサンプルレート (Hz)。
var sampleRate = 16000;
processGETRequest(appkey, token, textUrlEncode, audioSaveFile, format, sampleRate);
// processPOSTRequest(appkey, token, text, audioSaveFile, format, sampleRate);

.NET

この例では、System.Net.Http、System.Web、および Newtonsoft.Json.Linq が必要です。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net.Http;
using System.Web;
using Newtonsoft.Json.Linq;
namespace RESTfulAPI
{
    class SpeechSynthesizerRESTfulDemo
    {
        private string appkey;
        private string token;
        public SpeechSynthesizerRESTfulDemo(string appkey, string token)
        {
            this.appkey = appkey;
            this.token = token;
        }
        public void processGETRequest(string text, string audioSaveFile, string format, int sampleRate)
        {
            /**
             * HTTPS GET リクエストを設定します。
             * 1. HTTPS プロトコルを使用します。
             * 2. 音声合成サービスのドメイン名:nls-gateway-ap-southeast-1.aliyuncs.com
             * 3. 音声合成 API のリクエストパス:/stream/v1/tts
             * 4. この例で使用するパラメーターを設定します:appkey、token、text、format、sample_rate。
             * 5. オプションのリクエストパラメーターを設定します:voice、volume、speech_rate、pitch_rate。
             */
            string url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
            url = url + "?appkey=" + appkey;
            url = url + "&token=" + token;
            url = url + "&text=" + text;
            url = url + "&format=" + format;
            url = url + "&sample_rate=" + sampleRate.ToString();
            // voice: 音声。オプション。デフォルト値:xiaoyun。
            // url = url + "&voice=" + "xiaoyun";
            // volume: 音量。値の範囲:0~100。オプション。デフォルト値:50。
            // url = url + "&volume=" + 50;
            // speech_rate: 話速。値の範囲:-500~500。オプション。デフォルト値:0。
            // url = url + "&speech_rate=" + 0;
            // pitch_rate: ピッチ。値の範囲:-500~500。オプション。デフォルト値:0。
            // url = url + "&pitch_rate=" + 0;
            /**
             * HTTPS GET リクエストを送信し、サーバーからのレスポンスを処理します。
             */
            HttpClient client = new HttpClient();
            HttpResponseMessage response = null;
            response = client.GetAsync(url).Result;
            string contentType = null;
            if (response.IsSuccessStatusCode)
            {
                string[] typesArray = response.Content.Headers.GetValues("Content-Type").ToArray();
                if (typesArray.Length > 0)
                {
                    contentType = typesArray.First();
                }
            }
            if ("audio/mpeg".Equals(contentType))
            {
                byte[] audioBuff = response.Content.ReadAsByteArrayAsync().Result;
                FileStream fs = new FileStream(audioSaveFile, FileMode.Create);
                fs.Write(audioBuff, 0, audioBuff.Length);
                fs.Flush();
                fs.Close();
                System.Console.WriteLine("The GET request succeed!");
            }
            else
            {
                // ContentType が null または "application/json" の場合。
                System.Console.WriteLine("Response status code and reason phrase: " +
                    response.StatusCode + " " + response.ReasonPhrase);
                string responseBodyAsText = response.Content.ReadAsStringAsync().Result;
                System.Console.WriteLine("The GET request failed: " + responseBodyAsText);
            }
        }
        public void processPOSTRequest(string text, string audioSaveFile, string format, int sampleRate)
        {
            /**
             * HTTPS POST リクエストを設定します。
             * 1. HTTPS プロトコルを使用します。
             * 2. 音声合成サービスのドメイン名:nls-gateway-ap-southeast-1.aliyuncs.com
             * 3. 音声合成 API のリクエストパス:/stream/v1/tts
             * 4. この例で使用するパラメーターを設定します:appkey、token、text、format、sample_rate。
             * 5. オプションのリクエストパラメーターを設定します:voice、volume、speech_rate、pitch_rate。
             */
            string url = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts";
            JObject obj = new JObject();
            obj["appkey"] = appkey;
            obj["token"] = token;
            obj["text"] = text;
            obj["format"] = format;
            obj["sample_rate"] = sampleRate;
            // voice: 音声。オプション。デフォルト値:xiaoyun。
            // obj["voice"] = "xiaoyun";
            // volume: 音量。値の範囲:0~100。オプション。デフォルト値:50。
            // obj["volume"] = 50;
            // speech_rate: 話速。値の範囲:-500~500。オプション。デフォルト値:0。
            // obj["speech_rate"] = 0;
            // pitch_rate: ピッチ。値の範囲:-500~500。オプション。デフォルト値:0。
            // obj["pitch_rate"] = 0;
            String bodyContent = obj.ToString();
            StringContent content = new StringContent(bodyContent, Encoding.UTF8, "application/json");
            /**
             * HTTPS POST リクエストを送信し、サーバーからのレスポンスを処理します。
             */
            HttpClient client = new HttpClient();
            HttpResponseMessage response = client.PostAsync(url, content).Result;
            string contentType = null;
            if (response.IsSuccessStatusCode)
            {
                string[] typesArray = response.Content.Headers.GetValues("Content-Type").ToArray();
                if (typesArray.Length > 0)
                {
                    contentType = typesArray.First();
                }
            }
            if ("audio/mpeg".Equals(contentType))
            {
                byte[] audioBuff = response.Content.ReadAsByteArrayAsync().Result;
                FileStream fs = new FileStream(audioSaveFile, FileMode.Create);
                fs.Write(audioBuff, 0, audioBuff.Length);
                fs.Flush();
                fs.Close();
                System.Console.WriteLine("The POST request succeed!");
            }
            else
            {
                System.Console.WriteLine("Response status code and reason phrase: " +
                    response.StatusCode + " " + response.ReasonPhrase);
                string responseBodyAsText = response.Content.ReadAsStringAsync().Result;
                System.Console.WriteLine("The POST request failed: " + responseBodyAsText);
            }
        }
        static void Main(string[] args)
        {
            if (args.Length < 2)
            {
                System.Console.WriteLine("SpeechSynthesizerRESTfulDemo requires the following parameters: <token> <app-key>");
                return;
            }
            string token = args[0];
            string appkey = args[1];
            SpeechSynthesizerRESTfulDemo demo = new SpeechSynthesizerRESTfulDemo(appkey, token);
            string text = "Today is Monday, and the weather is nice.";
            // RFC 3986 に基づいてテキストを URL エンコードします。
            string textUrlEncode = text;
            textUrlEncode = HttpUtility.UrlEncode(textUrlEncode, Encoding.UTF8)
                .Replace("+", "%20")
                .Replace("*", "%2A")
                .Replace("%7E", "~");
            System.Console.WriteLine(textUrlEncode);
            string audioSaveFile = "syAudio.wav";
            string format = "wav";
            int sampleRate = 16000;
            demo.processGETRequest(textUrlEncode, audioSaveFile, format, sampleRate);
            //demo.processPOSTRequest(text, audioSaveFile, format, sampleRate);
        }
    }
}

Go

package main
import (
    "fmt"
    "net/url"
    "net/http"
    "io/ioutil"
    "encoding/json"
    "strconv"
    "os"
    "bytes"
    "strings"
)
func processGETRequest(appkey string, token string, text string, audioSaveFile string, format string, sampleRate int) {
    /**
     * HTTPS GET リクエストを設定します。
     * 1. プロトコル:HTTPS
     * 2. エンドポイント:nls-gateway-ap-southeast-1.aliyuncs.com
     * 3. リクエストパス:/stream/v1/tts
     * 4. この例で使用するパラメーター:appkey、token、text、format、sample_rate。
     * 5. オプションのパラメーター:voice、volume、speech_rate、pitch_rate。
     */
    var url string = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts"
    url = url + "?appkey=" + appkey
    url = url + "&token=" + token
    url = url + "&text=" + text
    url = url + "&format=" + format
    url = url + "&sample_rate=" + strconv.Itoa(sampleRate)
    // voice: 合成音声。オプション。デフォルト:xiaoyun。
    // url = url + "&voice=" + "xiaoyun"
    // volume: 音量。オプション。有効範囲:0~100。デフォルト:50。
    // url = url + "&volume=" + strconv.Itoa(50)
    // speech_rate: 話速。オプション。有効範囲:-500~500。デフォルト:0。
    // url = url + "&speech_rate=" + strconv.Itoa(0)
    // pitch_rate: ピッチ。オプション。有効範囲:-500~500。デフォルト:0。
    // url = url + "&pitch_rate=" + strconv.Itoa(0)
    /**
     * GET リクエストを送信し、サーバーのレスポンスを処理します。
     */
    response, err := http.Get(url)
    if err != nil {
        fmt.Println("The GET request failed!")
        panic(err)
    }
    defer response.Body.Close()    
    contentType := response.Header.Get("Content-Type")
    body, _ := ioutil.ReadAll(response.Body)
    if ("audio/mpeg" == contentType) {
        file, _ := os.Create(audioSaveFile)
        defer file.Close()
        file.Write([]byte(body))
        fmt.Println("The GET request succeeded!")
    } else {
        // Content-Type が null または "application/json" の場合は、リクエストが失敗したことを示します。
        statusCode := response.StatusCode
        fmt.Println("HTTP status code: " + strconv.Itoa(statusCode))
        fmt.Println("The GET request failed: " + string(body))
    }
}
func processPOSTRequest(appkey string, token string, text string, audioSaveFile string, format string, sampleRate int) {
    /**
     * HTTPS POST リクエストを設定します。
     * 1. プロトコル:HTTPS
     * 2. エンドポイント:nls-gateway-ap-southeast-1.aliyuncs.com
     * 3. リクエストパス:/stream/v1/tts
     * 4. この例で使用するパラメーター:appkey、token、text、format、sample_rate。
     * 5. オプションのパラメーター:voice、volume、speech_rate、pitch_rate。
     */
    var url string = "https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts"
    bodyContent := make(map[string]interface{})
    bodyContent["appkey"] = appkey
    bodyContent["text"] = text
    bodyContent["token"] = token
    bodyContent["format"] = format
    bodyContent["sample_rate"] = sampleRate
    // voice: 合成音声。オプション。デフォルト:xiaoyun。
    // bodyContent["voice"] = "xiaoyun"
    // volume: 音量。オプション。有効範囲:0~100。デフォルト:50。
    // bodyContent["volume"] = 50
    // speech_rate: 話速。オプション。有効範囲:-500~500。デフォルト:0。
    // bodyContent["speech_rate"] = 0
    // pitch_rate: ピッチ。オプション。有効範囲:-500~500。デフォルト:0。
    // bodyContent["pitch_rate"] = 0
    bodyJson, err := json.Marshal(bodyContent)
    if err != nil {
        panic(nil)
    }
    /**
     * POST リクエストを送信し、サーバーのレスポンスを処理します。
     */
    response, err := http.Post(url, "application/json;charset=utf-8", bytes.NewBuffer([]byte(bodyJson)))
    if err != nil {
        panic(err)
    }
    defer response.Body.Close()
    contentType := response.Header.Get("Content-Type")
    body, _ := ioutil.ReadAll(response.Body)
    if ("audio/mpeg" == contentType) {
        file, _ := os.Create(audioSaveFile)
        defer file.Close()
        file.Write([]byte(body))
        fmt.Println("The POST request succeeded!")
    } else {
        // Content-Type が null または "application/json" の場合は、リクエストが失敗したことを示します。
        statusCode := response.StatusCode
        fmt.Println("HTTP status code: " + strconv.Itoa(statusCode))
        fmt.Println("The POST request failed: " + string(body))
    }    
}
func main() {
    var appkey string = "YOUR_APPKEY"
    var token  string = "YOUR_TOKEN"
    var text string = "Today is Monday, and the weather is nice."
    var textUrlEncode = text
    textUrlEncode = url.QueryEscape(textUrlEncode)
    textUrlEncode = strings.Replace(textUrlEncode, "+", "%20", -1)
    textUrlEncode = strings.Replace(textUrlEncode, "*", "%2A", -1)
    textUrlEncode = strings.Replace(textUrlEncode, "%7E", "~", -1)
    fmt.Println(textUrlEncode)
    var audioSaveFile string = "syAudio.wav"
    var format string = "wav"
    var sampleRate int = 16000
    processGETRequest(appkey, token, textUrlEncode, audioSaveFile, format, sampleRate)
    // processPOSTRequest(appkey, token, text, audioSaveFile, format, sampleRate)
}

リクエストフロー

クライアントはテキストを含む GET または POST リクエストを送信します。サーバーは HTTP レスポンスボディで音声を返します。ストリーミングクライアントは、レスポンスが終了するまでレスポンスボディを読み続けます。

リクエストパラメーター

GET リクエストの場合、パラメーターは URL のクエリ文字列に含めます。POST リクエストの場合、JSON ボディに含めます。トークンは X-NLS-Token リクエストヘッダーで渡すこともできます。

パラメーター

タイプ

必須

説明

appkey

String

はい

プロジェクトの AppKey。

text

String

はい

合成する UTF-8 テキスト。GET リクエストでは、RFC 3986 に従った URL エンコーディングも必要です。POST リクエストでは URL エンコーディングは不要です。

token

String

いいえ

アクセストークン。省略した場合、X-NLS-Token リクエストヘッダーが必須です。

format

String

いいえ

音声フォーマット。小文字の pcm、wav、または mp3 を使用します。デフォルト:pcm。

sample_rate

Integer

いいえ

サンプルレート (Hz)。8000 と 16000 をサポートします。デフォルト:16000。デフォルトの音声 xiaoyun は 24000 もサポートします。他の音声については、音声ドキュメントでサポートされているサンプルレートを確認してください。

voice

String

いいえ

音声。デフォルト:xiaoyun。利用可能な音声とそのサポート設定については、「API リファレンス」をご参照ください。

volume

Integer

いいえ

音量。範囲:0–100。デフォルト:50。

speech_rate

Integer

いいえ

話速。範囲:-500–500。デフォルト:0。

pitch_rate

Integer

いいえ

ピッチ。範囲:-500–500。デフォルト:0。

chunk

Boolean

いいえ

GET ストリーミングの例では、HTTP チャンク転送エンコーディングで音声を受信するために、このパラメーターを true に設定します。クライアントは依然としてレスポンスを増分的に読み取る必要があります。このパラメーターが省略された場合でも、レスポンスはチャンク転送エンコーディングを使用することがあります。

GET リクエスト

text を UTF-8 としてエンコードし、URL エンコーディングを適用します。たとえば、+ を %2B に、* を %2A にエンコードし、~ は変更しません。以下のリクエストでは、<appkey> と <token> はプレースホルダーです。

https://nls-gateway-ap-southeast-1.aliyuncs.com/stream/v1/tts?appkey=<appkey>&token=<token>&text=%E4%BB%8A%E5%A4%A9%E6%98%AF%E5%91%A8%E4%B8%80%EF%BC%8C%E5%A4%A9%E6%B0%94%E6%8C%BA%E5%A5%BD%E7%9A%84%E3%80%82&format=wav&sample_rate=16000

または、クエリ文字列から token を省略し、リクエストヘッダーを使用します。

ヘッダー

タイプ

必須

説明

X-NLS-Token

String

条件付き

クエリ文字列から token が省略された場合に必須です。

POST リクエスト

UTF-8 の JSON リクエストボディを使用します。text を URL エンコードしないでください。

ヘッダー

タイプ

必須

説明

Content-Type

String

はい

application/json に設定します。

X-NLS-Token

String

条件付き

リクエストボディから token が省略された場合に必須です。

Content-Length

Long

いいえ

リクエストボディのサイズ (バイト単位)。通常、HTTP クライアントによって自動的に設定されます。

リクエストボディの例:

{
  "appkey": "<appkey>",
  "text": "Today is Monday. The weather is nice.",
  "token": "<token>",
  "format": "wav",
  "sample_rate": 16000
}

レスポンス

GET と POST は同じレスポンスフォーマットを使用します。HTTP ステータスコードと Content-Type の両方を確認してください。エラーレスポンスを音声として保存しないでください。

成功したレスポンス

Content-Type は audio/mpeg で、レスポンスボディにはバイナリ音声が含まれます。このヘッダーは、リクエストされたフォーマットが必ずしも MP3 であることを意味するわけではありません。format パラメーターが音声フォーマットを決定します。

成功したレスポンスに X-NLS-RequestId が含まれていない場合があります。ヘッダーが存在する場合は、トラブルシューティングのためにその値を記録してください。

失敗したレスポンス

Content-Type が application/json の場合、レスポンスボディには JSON 形式のエラー情報が含まれます。また、Content-Type がないか、予期しない値である場合もエラーレスポンスとして扱ってください。

{
    "task_id":"8f95d0b9b6e948bc98e8d0ce64b0****",
    "result":"",
    "status":40000000,
    "message":"Gateway:CLIENT_ERROR:in post data, json format illegal"
}

フィールド

タイプ

説明

task_id

String

リクエストのタスク ID。通常は 32 文字の文字列です。

result

String

サービスの結果。

status

Integer

サービスステータスコード。

message

String

エラーメッセージ。

X-NLS-RequestId または task_id、HTTP ステータスコード、および利用可能な場合はエラーメッセージを記録してください。テクニカルサポートに連絡する際は、この情報を提供してください。トークンは共有しないでください。

サービスステータスコード

JSON レスポンスの status フィールドは、HTTP ステータスコードではなく、サービスステータスコードです。

サービスステータスコード

意味

アクション

20000000

成功

なし。

40000000

クライアントエラー

エラーメッセージを確認してください。必要に応じてテクニカルサポートに連絡してください。

40000001

認証失敗

トークンが有効か、または期限切れでないかを確認してください。

40000002

無効なメッセージ

リクエストメッセージのフォーマットを確認してください。

40000003

無効なパラメーター

パラメーターの値を確認してください。

40000004

アイドルタイムアウト

長期間データが送信されなかったかどうかを確認してください。

40000005

リクエストが多すぎます

同時接続数と秒間リクエスト数を確認してください。

41020001

音声合成クライアントエラー

message に基づいて合成パラメーターを確認してください。たとえば、音声フォーマットには小文字の pcm、wav、または mp3 を使用します。

50000000

サーバーエラー

エラー情報を記録してください。エラーが続く場合は、テクニカルサポートに連絡してください。

50000001

内部 GRPC 呼び出しエラー

エラー情報を記録してください。エラーが続く場合は、テクニカルサポートに連絡してください。