日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

RESTful API

語音合成RESTful API支持HTTPS GET和POST兩種方法的請求,將待合成的文本上傳到服務端,服務端返回文本的語音合成結果,開發者需要保證在語音合成結果返回之前連接不中斷。

功能介紹

支持如下設置:

  • PCM、WAV、MP3音頻格式。

  • 8000 Hz、16000 Hz采樣率。

  • 多種發音人。

  • 語速、語調、音量。

重要
  • 隨著TTS合成效果不斷提升,算法的復雜度也越來越高,對您而言,可能會遇到合成耗時變長的情況。因此我們建議您使用流式合成機制。本文檔及SDK示例中有相關流式處理示例代碼可供參考。

  • 單次調用傳入文本不能超過300個字符,超過的字符會被截斷。對于更長文本的合成,請參考SDK中的長文本切分及拼接示例。

  • 下載nls-restful-java-demo.zip

前提條件

服務地址

訪問類型

說明

URL

Host

外網訪問(默認上海地域)

所有服務器均可使用外網訪問URL。

  • 上海:nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts

  • 北京:nls-gateway-cn-beijing.aliyuncs.com/stream/v1/tts

  • 深圳:nls-gateway-cn-shenzhen.aliyuncs.com/stream/v1/tts

  • 上海:nls-gateway-cn-shanghai.aliyuncs.com

  • 北京:nls-gateway-cn-beijing.aliyuncs.com

  • 深圳:nls-gateway-cn-shenzhen.aliyuncs.com

ECS內網訪問

使用阿里云上海、北京、深圳ECS(即ECS地域為華東2(上海)、華北2(北京)、華南1(深圳)),可使用內網訪問URL。 ECS的經典網絡不能訪問AnyTunnel,即不能在內網訪問語音服務;如果希望使用AnyTunnel,需要創建專有網絡在其內部訪問。

說明

  • 使用內網訪問方式,將不產生ECS實例的公網流量費用。

  • 關于ECS的網絡類型請參見網絡類型

  • 上海:nls-gateway-cn-shanghai-internal.aliyuncs.com/stream/v1/tts

  • 北京:nls-gateway-cn-beijing-internal.aliyuncs.com/stream/v1/tts

  • 深圳:nls-gateway-cn-shenzhen-internal.aliyuncs.com/stream/v1/tts

  • 上海:nls-gateway-cn-shanghai-internal.aliyuncs.com

  • 北京:nls-gateway-cn-beijing-internal.aliyuncs.com

  • 深圳:nls-gateway-cn-shenzhen-internal.aliyuncs.com

重要

以下將以使用外網訪問URL的方式進行介紹。如果您使用的是阿里云上海、北京、深圳ECS,并需要使用內網訪問URL,則需要使用HTTP協議,并替換外網訪問的URL和Host。以下示例中除了Python,均支持HTTP和HTTPS協議,在使用Python示例時請閱讀其注意事項。

交互流程

客戶端向服務端發送攜帶文本內容的HTTPS GET方法或POST方法的請求,服務端返回攜帶合成語音數據的HTTP響應。

image
說明

服務端的響應除了音頻流之外,都會在返回信息的header包含本次識別任務的task_id參數,是本次請求的唯一標識。

請求參數

語音合成的請求參數如下表所示。

  • 如果使用HTTPS GET方法的請求,需要在HTTPS的URL請求參數中設置這些參數。

  • 如果使用HTTPS POST方法的請求,需要在HTTPS的請求體(Body)中設置這些參數。

名稱

類型

是否必選

描述

appkey

String

項目appkey。

text

String

待合成的文本,需要為UTF-8編碼。使用GET方法,需要再采用RFC 3986規范進行urlencode編碼;使用POST方法不需要urlencode編碼。

token

String

若不設置token參數,需要在HTTP Headers中設置X-NLS-Token字段來指定Token。

format

String

音頻編碼格式,支持PCM/WAV/MP3格式。默認值:pcm

sample_rate

Integer

音頻采樣率,支持16000 Hz和8000 Hz,默認值:16000 Hz。

voice

String

發音人,默認值:xiaoyun。更多發音人請參見接口說明

volume

Integer

音量,取值范圍:0~100,默認值:50。

speech_rate

Integer

語速,取值范圍:-500~500,默認值:0。

pitch_rate

Integer

語調,取值范圍:-500~500,默認值:0。

GET方法上傳文本

一個完整的語音合成RESTful API GET方法的請求包含以下要素:

  • URL

    協議

    URL

    方法

    HTTPS

    nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts

    GET

  • 請求參數

    參見上述請求參數。由URL和請求參數組成的完整請求鏈接如下所示(需對參數進行URL encode),在瀏覽器中打開該鏈接可直接獲取語音合成結果:

    # text文本:"今天是周一,天氣挺好的。"
    https://nls-gateway-cn-shanghai.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
  • HTTPS GET請求頭部

    名稱

    類型

    是否必選

    描述

    X-NLS-Token

    String

    服務鑒權Token。

重要
  • 服務鑒權Token參數有如下兩種設置方式:

    • (推薦)在請求參數token中設置

    • 在HTTPS Headers的X-NLS-Token字段設置

  • 參數text必須采用UTF-8編碼,再采用RFC 3986規范進行urlencode編碼。如加號+ 編碼為%2B,星號*編碼為%2A%7E編碼為~

POST方法上傳文本

一個完整的語音合成RESTful API POST請求包含以下要素:

  • URL

    協議

    URL

    方法

    HTTPS

    nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts

    POST

  • HTTPS POST請求頭部

    名稱

    類型

    是否必選

    描述

    Content-Type

    String

    必須為“application/json”。表明HTTP請求體的內容為JSON格式字符串。

    X-NLS-Token

    String

    服務鑒權Token。

    Content-Length

    long

    HTTP請求體中內容的長度。

  • HTTPS POST請求體

    HTTPS POST請求體由請求參數組成JSON格式的字符串組成,因此在HTTPS POST請求頭部中的Content-Type必須設置為"application/json"。示例如下:

      {
        "appkey":"31f932fb",
        "text":"今天是周一,天氣挺好的。",
        "token":"450343c793aaaaaa****",
        "format":"wav"
      }
重要
  • 服務鑒權Token參數有如下兩種設置方式:

    • 推薦在請求體通過參數token設置.

    • 在HTTPS Headers的X-NLS-Token字段設置。

  • 使用POST方法的請求,請求體中的請求參數text必須采用UTF-8編碼,但是不進行urlencode編碼,注意與GET方法請求的區別。

響應結果

使用HTTPS GET方法和HTTPS POST方法請求的響應是相同的,響應結果都包含在HTTPS的響應體中。響應結果的成功/失敗通過HTTPS Headers的Content-Type字段來區分:

  • 成功響應

    • HTTPS Headers的Content-Type字段內容為audio/mpeg,表示合成成功,合成的語音數據在響應體中。

    • 響應內容為合成音頻的二進制數據。

  • 失敗響應

    • HTTPS Headers沒有Content-Type字段,或者Content-Type字段內容為application/json,表示合成失敗,錯誤信息在響應體中。

    • HTTPS Headers的X-NLS-RequestId字段內容為請求任務的task_id。

    • 響應體內容為錯誤信息,以JSON格式的字符串表示。如下所示:

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

    • 錯誤信息字段如下表

      名稱

      類型

      描述

      task_id

      String

      32位請求任務ID,請記錄該值,用于排查錯誤。

      result

      String

      服務結果

      status

      Integer

      服務狀態碼

      message

      String

      服務狀態描述

服務狀態碼

服務狀態碼

服務狀態描述

解決辦法

20000000

請求成功

無。

40000000

默認的客戶端錯誤碼

檢查對應的錯誤消息。

40000001

身份認證失敗

檢查使用的令牌是否正確,是否過期。

40000002

無效的消息

檢查發送的消息是否符合要求。

40000003

無效的參數

檢查參數值設置是否合理。

40000004

空閑超時

確認是否長時間沒有發送數據到服務端。

40000005

請求數量過多

檢查是否超過了并發連接數或者每秒鐘請求數。

40000010

試用期已結束,并且未開通商用版、或賬戶欠費。

請登錄控制臺確認服務開通狀態以及賬戶余額。

50000000

默認的服務端錯誤

內部服務錯誤,需要客戶端進行重試。

50000001

內部GRPC調用錯誤

內部服務錯誤,需要客戶端進行重試。

Java示例

依賴文件內容如下:

<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-cn-shanghai.aliyuncs.com
         * 3.語音識別接口請求路徑:/stream/v1/tts
         * 4.設置必須請求參數:appkey、token、text、format、sample_rate
         * 5.設置可選請求參數:voice、volume、speech_rate、pitch_rate
         */
        String url = "https://nls-gateway-cn-shanghai.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);
        System.out.println("URL: " + url);
        /**
         * 發送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 succeed!");
            }
            else {
                // ContentType 為 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-cn-shanghai.aliyuncs.com
         * 3.語音合成接口請求路徑:/stream/v1/tts
         * 4.設置必須請求參數:appkey、token、text、format、sample_rate
         * 5.設置可選請求參數:voice、volume、speech_rate、pitch_rate
         */
        String url = "https://nls-gateway-cn-shanghai.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();
        System.out.println("POST Body Content: " + bodyContent);
        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 succeed!");
            }
            else {
                // ContentType 為 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 need params: <token> <app-key>");
            System.exit(-1);
        }
        String token = args[0];
        String appkey = args[1];
        SpeechSynthesizerRestfulDemo demo = new SpeechSynthesizerRestfulDemo(appkey, token);
        String text = "今天是周一,天氣挺好的。";
        // 采用RFC 3986規范進行urlencode編碼。
        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 ###");
    }
}

Java(流式合成)示例代碼如下:

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. TTS的RESTFul接口調用。
 * 2. 啟用HTTP chunked機制的處理方式(流式返回)。
 */
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 processGETRequet(String text, String audioSaveFile, String format, int sampleRate, String voice, boolean chunked) {
        /**
         * 設置HTTPS GET請求:
         * 1.使用HTTPS協議
         * 2.語音識別服務域名:nls-gateway-cn-shanghai.aliyuncs.com
         * 3.語音識別接口請求路徑:/stream/v1/tts
         * 4.設置必須請求參數:appkey、token、text、format、sample_rate
         * 5.設置可選請求參數:voice、volume、speech_rate、pitch_rate
         */
        String url = "https://nls-gateway-cn-shanghai.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);
        System.out.println("URL: " + url);
        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 null;
                }
                @Override
                public State onHeadersReceived(HttpHeaders httpHeaders) throws Exception {
                    outs = new FileOutputStream(new File("tts.wav"));
                    return null;
                }
                @Override
                public State onBodyPartReceived(HttpResponseBodyPart httpResponseBodyPart) throws Exception {
                    // 注意:此處一旦接收到數據流,即可向用戶播放或者用于其他處理,以提升響應速度。
                    // 注意:請不要在此回調接口中執行耗時操作,可以以異步或者隊列形式將二進制TTS語音流推送到另一線程中。
                    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 null;
                }
                @Override
                public void onThrowable(Throwable throwable) {
                    logger.error("throwable {}", throwable);
                    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 need params: <token> <app-key>");
            System.exit(-1);
        }
        String token = args[0];
        String appkey = args[1];
        SpeechSynthesizerRestfulChunkedDemo demo = new SpeechSynthesizerRestfulChunkedDemo(appkey, token);
        String text = "我家的后面有一個很大的園,相傳叫作百草園。現在是早已并屋子一起賣給朱文公的子孫了,連那最末次的相見也已經隔了七八年,其中似乎確鑿只有一些野草;但那時卻是我的樂園。";
        // 采用RFC 3986規范進行urlencode編碼。
        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 chunked機制。
        demo.processGETRequet(textUrlEncode, audioSaveFile, format, sampleRate, "aixia", true);
        System.out.println("### Game Over ###");
    }
}

C++示例

說明
  • 下載C++示例

    C++示例使用第三方函數庫curl處理HTTPS的請求和響應,使用jsoncpp處理POST請求體的JSON字符串。

  • Linux環境下,運行環境最低要求:Glibc 2.5及以上, Gcc4或Ccc5。

  • Windows下需解壓lib目錄下的windows.zip庫編譯使用。

示例目錄說明如下:

  • CMakeLists.txt:示例工程的CMakeList文件。

  • demo:示例文件。

    文件名

    描述

    restfulTtsDemo.cpp

    語音合成RESTful API示例。

  • include

    目錄名

    描述

    curl

    curl庫頭文件目錄。

    json

    jsoncpp庫頭文件目錄。

  • lib:包含curl、jsoncpp動態庫。

    根據平臺不同,使用如下版本軟件加載庫文件:

    • linux(Glibc:2.5及以上,Gcc4或Gcc5)

    • windows(VS2013、VS2015)

  • readme.txt:說明文件。

  • 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);
    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-cn-shanghai.aliyuncs.com/stream/v1/tts";
    /**
     * 設置HTTPS 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();
    cout << request << endl;
    curl_easy_setopt(curl, CURLOPT_URL, request.c_str());
    /**
     * 設置獲取響應的HTTPS Headers回調函數
     */
    map<string, string> responseHeaders;
    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, responseHeadersCallback);
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, &responseHeaders);
    /**
     * 設置獲取響應的HTTPS Body回調函數
     */
    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 << "The audio save file can not open!";
            return -1;
        }
        fs.write(bodyContent.c_str(), bodyContent.size());
        fs.close();
        cout << "The GET request succeed!" << 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-cn-shanghai.aliyuncs.com/stream/v1/tts";
    /**
     * 設置HTTPS POST URL
     */
    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    /**
     * 設置HTTPS POST請求頭部
     */
    struct curl_slist* headers = NULL;
    // Content-Type
    headers = curl_slist_append(headers, "Content-Type:application/json");
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
    /**
     * 設置HTTPS POST請求體
     */
    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);
    cout << "POST request Body: " << task << endl;
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, task.c_str());
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, task.length());
    /**
     * 設置獲取響應的HTTPS Headers回調函數
     */
    map<string, string> responseHeaders;
    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, responseHeadersCallback);
    curl_easy_setopt(curl, CURLOPT_HEADERDATA, &responseHeaders);
    /**
     * 設置獲取響應的HTTPS Body回調函數
     */
    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 << "The audio save file can not open!";
            return -1;
        }
        fs.write(bodyContent.c_str(), bodyContent.size());
        fs.close();
        cout << "The POST request succeed!" << endl;
    }
    else {
        cout << "The POST request failed: " + bodyContent << endl;
        return -1;
    }
    return 0;
}
int main(int argc, char* argv[]) {
    if (argc < 3) {
        cerr << "params is not valid. Usage: ./demo your_token your_appkey" << endl;
        return -1;
    }
    string token = argv[1];
    string appKey = argv[2];
    string text = "今天是周一,天氣挺好的。";
#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_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 2.x請使用httplib模塊;Python 3.x請使用http.client模塊。

  • 采用RFC 3986規范進行urlencode編碼,Python 2.x請使用urllib模塊的urllib.quote,Python 3.x請使用urllib.parse模塊的urllib.parse.quote_plus。

  • 如果使用內網訪問URL,請使用HTTP協議,需要替換如下函數,將HTTPSConnection修改為HTTPConnection

        # Python 2.x 請使用httplib
        # conn = httplib.HTTPConnection(host)
    
        # Python 3.x 請使用http.client
        conn = http.client.HTTPConnection(host)
# -*- 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-cn-shanghai.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)
    print(url)
    # 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 response 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 succeed!')
    else :
        print('The GET request failed: ' + str(body))
    conn.close()
def processPOSTRequest(appKey, token, text, audioSaveFile, format, sampleRate) :
    host = 'nls-gateway-cn-shanghai.aliyuncs.com'
    url = 'https://' + host + '/stream/v1/tts'
    # 設置HTTPS Headers。
    httpHeaders = {
        'Content-Type': 'application/json'
        }
    # 設置HTTPS Body。
    body = {'appkey': appKey, 'token': token, 'text': text, 'format': format, 'sample_rate': sampleRate}
    body = json.dumps(body)
    print('The POST request body content: ' + 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 response 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 succeed!')
    else :
        print('The POST request failed: ' + str(body))
    conn.close()
appKey = '您的appkey'
token = '您的token'
text = '今天是周一,天氣挺好的。'
# 采用RFC 3986規范進行urlencode編碼。
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示例

重要

PHP示例中使用了cURL函數,要求PHP版本在4.0.2以上,并且確保已安裝cURL擴展。

<?php
function processGETRequest($appkey, $token, $text, $audioSaveFile, $format, $sampleRate) {
    $url = "https://nls-gateway-cn-shanghai.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);
    print $url . "\n";
    $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, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    $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 succeed!\n";
    }
    else {
        print "The GET request failed: " . $bodyContent . "\n";
    }
}
function processPOSTRequest($appkey, $token, $text, $audioSaveFile, $format, $sampleRate) {
    $url = "https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts";
    /**
     * 請求參數,以JSON格式字符串填入HTTPS POST請求的Body中。
     */
    $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);
    print "The POST request body content: " . $body . "\n";
    $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 succeed!\n";
    }
    else {
        print "The POST request failed: " . $bodyContent . "\n";
    }
}
$appkey = "您的appkey";
$token = "您的token";
$text = "今天是周一,天氣挺好的。";
$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示例

說明

首先安裝request依賴,請在您的示例文件所在目錄執行如下命令:

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-cn-shanghai.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;
    console.log(url);
    /**
     * 設置HTTPS GET請求。
     * encoding必須設置為null,HTTPS響應的Body為二進制Buffer類型。
     */
    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(body.toString());
                console.log('The GET request failed!');
            }
            else {
                fs.writeFileSync(audioSaveFile, body);
                console.log('The GET request is succeed!');
            }
        }
    });
}
function processPOSTRequest(appkeyValue, tokenValue, textValue, audioSaveFile, formatValue, sampleRateValue) {
    var url = 'https://nls-gateway-cn-shanghai.aliyuncs.com/stream/v1/tts';
    /**
     * 請求參數,以JSON格式字符串填入HTTPS POST請求的Body中。
    */
    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);
    console.log('The POST request body content: ' + bodyContent);
    /**
     * 設置HTTPS POST請求頭部。
     */
    var httpHeaders = {
        'Content-type' : 'application/json'
    }
    /**
     * 設置HTTPS POST請求。
     * encoding必須設置為null,HTTPS響應的Body為二進制Buffer類型。
     */
    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(body.toString());
                console.log('The POST request failed!');
            }
            else {
                fs.writeFileSync(audioSaveFile, body);
                console.log('The POST request is succeed!');
            }
        }
    });
}
var appkey = '您的appkey';
var token = '您的token';
var text = '今天是周一,天氣挺好的。';
var textUrlEncode = encodeURIComponent(text)
                    .replace(/[!'()*]/g, function(c) {
                        return '%' + c.charCodeAt(0).toString(16);
                    });
console.log(textUrlEncode);
var audioSaveFile = 'syAudio.wav';
var format = 'wav';
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-cn-shanghai.aliyuncs.com
             * 3.語音識別接口請求路徑:/stream/v1/tts
             * 4.設置必須請求參數:appkey、token、text、format、sample_rate
             * 5.設置可選請求參數:voice、volume、speech_rate、pitch_rate
             */
            string url = "http://nls-gateway.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;
            System.Console.WriteLine(url);
            /**
             * 發送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-cn-shanghai.aliyuncs.com
             * 3.語音合成接口請求路徑:/stream/v1/tts
             * 4.設置必須請求參數:appkey、token、text、format、sample_rate
             * 5.設置可選請求參數:voice、volume、speech_rate、pitch_rate
             */
            string url = "https://nls-gateway-cn-shanghai.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 need params: <token> <app-key>");
                return;
            }
            string token = args[0];
            string appkey = args[1];
            SpeechSynthesizerRESTfulDemo demo = new SpeechSynthesizerRESTfulDemo(appkey, token);
            string text = "今天是周一,天氣挺好的。";
            // 采用RFC 3986規范進行urlencode編碼。
            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-cn-shanghai.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-cn-shanghai.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)
    fmt.Println(url)
    /**
     * 發送HTTPS 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 succeed!")
    } else {
        // ContentType 為 null 或者為 "application/json"
        statusCode := response.StatusCode
        fmt.Println("The HTTP statusCode: " + 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-cn-shanghai.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-cn-shanghai.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)
    }
    fmt.Println(string(bodyJson))
    /**
     * 發送HTTPS 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 succeed!")
    } else {
        // ContentType 為 null 或者為 "application/json"
        statusCode := response.StatusCode
        fmt.Println("The HTTP statusCode: " + strconv.Itoa(statusCode))
        fmt.Println("The POST request failed: " + string(body))
    }    
}
func main() {
    var appkey string = "您的appkey"
    var token  string = "您的token"
    var text string = "今天是周一,天氣挺好的。"
    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)
}