音声合成 RESTful API は、HTTPS の GET または POST リクエストを介してテキストを音声に変換し、レスポンスボディで音声を返します。音声フォーマット、サンプルレート、話者、話速、ピッチ、音量を設定できます。
機能
この API は、PCM、WAV、MP3 形式の音声と、さまざまな話者をサポートしています。音声フォーマットとサンプルレートは、リクエストパラメーターで設定します。
各リクエストは最大 300 文字まで受け付けます。超過した文字は切り捨てられます。長いテキストはセグメントに分割し、各セグメントを合成してから音声を連結してください。
合成時間はテキストとモデルによって異なります。レスポンス全体を待つのではなく、レスポンスをストリーミングして音声が届き次第処理してください。レスポンスが完全に読み取られるまで接続を開いたままにしてください。
前提条件
プロジェクトの AppKey。手順については、「プロジェクトの作成」をご参照ください。
有効なアクセストークン。手順については、「SDK でのトークンの取得」をご参照ください。
エンドポイント
サービスリージョンに対応する AppKey とトークンを使用します。以下の例では、パブリック HTTPS エンドポイントを使用しています。
|
リージョン |
リクエスト URL |
|
シンガポール |
|
例
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++ デモでは、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 を使用する場合:
CMake 2.4 以降がインストールされていることを確認します。
cd path/to/sdk/libtar -zxvpf linux.tar.gzcd path/to/sdk./build.shcd path/to/sdk/demo./restfulTtsDemo <your-token> <your-appkey>
-
CMake を使用しない場合:
cd path/to/sdk/lib。tar -zxvpf linux.tar.gzcd path/to/sdk/demog++ -o restfulTtsDemo restfulTtsDemo.cpp -I path/to/sdk/include -L path/to/sdk/lib/linux -ljsoncpp -lssl -lcrypto -lcurl -D_GLIBCXX_USE_CXX11_ABI=0export LD_LIBRARY_PATH=path/to/sdk/lib/linux/./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 リクエストヘッダーで渡すこともできます。
|
パラメーター |
タイプ |
必須 |
説明 |
|
|
String |
はい |
プロジェクトの AppKey。 |
|
|
String |
はい |
合成する UTF-8 テキスト。GET リクエストでは、RFC 3986 に従った URL エンコーディングも必要です。POST リクエストでは URL エンコーディングは不要です。 |
|
|
String |
いいえ |
アクセストークン。省略した場合、 |
|
|
String |
いいえ |
音声フォーマット。小文字の |
|
|
Integer |
いいえ |
サンプルレート (Hz)。 |
|
|
String |
いいえ |
音声。デフォルト: |
|
|
Integer |
いいえ |
音量。範囲:0–100。デフォルト:50。 |
|
|
Integer |
いいえ |
話速。範囲:-500–500。デフォルト:0。 |
|
|
Integer |
いいえ |
ピッチ。範囲:-500–500。デフォルト:0。 |
|
|
Boolean |
いいえ |
GET ストリーミングの例では、HTTP チャンク転送エンコーディングで音声を受信するために、このパラメーターを |
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 を省略し、リクエストヘッダーを使用します。
|
ヘッダー |
タイプ |
必須 |
説明 |
|
|
String |
条件付き |
クエリ文字列から |
POST リクエスト
UTF-8 の JSON リクエストボディを使用します。text を URL エンコードしないでください。
|
ヘッダー |
タイプ |
必須 |
説明 |
|
|
String |
はい |
|
|
|
String |
条件付き |
リクエストボディから |
|
|
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"
}
|
フィールド |
タイプ |
説明 |
|
|
String |
リクエストのタスク ID。通常は 32 文字の文字列です。 |
|
|
String |
サービスの結果。 |
|
|
Integer |
サービスステータスコード。 |
|
|
String |
エラーメッセージ。 |
X-NLS-RequestId または task_id、HTTP ステータスコード、および利用可能な場合はエラーメッセージを記録してください。テクニカルサポートに連絡する際は、この情報を提供してください。トークンは共有しないでください。
サービスステータスコード
JSON レスポンスの status フィールドは、HTTP ステータスコードではなく、サービスステータスコードです。
|
サービスステータスコード |
意味 |
アクション |
|
|
成功 |
なし。 |
|
|
クライアントエラー |
エラーメッセージを確認してください。必要に応じてテクニカルサポートに連絡してください。 |
|
|
認証失敗 |
トークンが有効か、または期限切れでないかを確認してください。 |
|
|
無効なメッセージ |
リクエストメッセージのフォーマットを確認してください。 |
|
|
無効なパラメーター |
パラメーターの値を確認してください。 |
|
|
アイドルタイムアウト |
長期間データが送信されなかったかどうかを確認してください。 |
|
|
リクエストが多すぎます |
同時接続数と秒間リクエスト数を確認してください。 |
|
|
音声合成クライアントエラー |
|
|
|
サーバーエラー |
エラー情報を記録してください。エラーが続く場合は、テクニカルサポートに連絡してください。 |
|
|
内部 GRPC 呼び出しエラー |
エラー情報を記録してください。エラーが続く場合は、テクニカルサポートに連絡してください。 |