1、配置Python3 HTTP Endpoint
#!/usr/bin/python
from http.server import HTTPServer, BaseHTTPRequestHandler
import json
class TestHTTPHandle(BaseHTTPRequestHandler):
def do_POST(self):
print("demo job")
print(self.headers)
content_len = int(self.headers.get('content-length',0))
post_body = self.rfile.read(content_len)
print("receive message from server: ")
print("---------打印输出监听到的结果----------")
print(post_body)
print("-------------------")
self.send_response(200) # 应答机制,接收到消息后,响应服务端,告知服务端已经收到消息,避免消息重复发送
self.end_headers()
def start_server(port):
# 0.0.0.0 映射测试机器的公网地址、在回掉地址测和订阅测,配置对应机器的公务地址
http_server = HTTPServer(('0.0.0.0', int(port)), TestHTTPHandle)
http_server.serve_forever()
if __name__ == '__main__':
start_server(8080)
2 MNS Topic Http订阅监听
3 异步长文本语音合成配置回调地址
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 此示例演示了长文本语音合成的使用方式。
*/
public class SpeechLongSynthesizerRestfulDemo {
private static Logger logger = LoggerFactory.getLogger(SpeechLongSynthesizerRestfulDemo.class);
private String accessToken;
private String appkey;
public SpeechLongSynthesizerRestfulDemo(String appkey, String token) {
this.appkey = appkey;
this.accessToken = token;
}
public void processPOSTRequest(String text, String format, int sampleRate, String voice) {
String url = "https://nls-gateway.cn-shanghai.aliyuncs.com/rest/v1/tts/async";
// 拼接HTTP Post请求的消息体内容。
JSONObject context = new JSONObject();
// device_id设置,可以设置为自定义字符串或者设备信息id。
context.put("device_id", "my_device_id");
JSONObject header = new JSONObject();
// 设置你的appkey。
header.put("appkey", appkey);
// 设置你的token。
header.put("token", accessToken);
// voice 发音人,可选,默认是xiaoyun。
// volume 音量,范围是0~100,可选,默认50。
// speech_rate 语速,范围是-500~500,可选,默认是0。
// pitch_rate 语调,范围是-500~500,可选,默认是0。
JSONObject tts = new JSONObject();
tts.put("text", text);
// 设置发音人。
tts.put("voice", voice);
// 设置编码格式。
tts.put("format", format);
// 设置采样率。
tts.put("sample_rate", sampleRate);
// 设置声音大小,可选。
//tts.put("volume", 100);
// 设置语速,可选。
//tts.put("speech_rate", 200);
// 长文本tts restful接口支持句级时间戳,默认为false。
tts.put("enable_subtitle", true);
JSONObject payload = new JSONObject();
// 可选,是否设置回调。如果设置,则服务端在完成长文本语音合成之后回调用户此处设置的回调接口,将请求状态推送给用户侧。
payload.put("enable_notify", true);
payload.put("notify_url", "http://47.105.***.***:8080");
payload.put("tts_request", tts);
JSONObject json = new JSONObject();
json.put("context", context);
json.put("header", header);
json.put("payload", payload);
String bodyContent = json.toJSONString();
logger.info("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");
System.out.println("contentType = " + contentType);
// 获取结果,并根据返回进一步进行处理。
String result = response.body().string();
response.close();
System.out.println("result = " + result);
JSONObject resultJson = JSON.parseObject(result);
if(resultJson.containsKey("error_code") && resultJson.getIntValue("error_code") == 20000000) {
logger.info("Request Success! task_id = " + resultJson.getJSONObject("data").getString("task_id"));
String task_id = resultJson.getJSONObject("data").getString("task_id");
String request_id = resultJson.getString("request_id");
/// 可选:轮询检查服务端的合成状态,该轮询操作非必须,如果设置了回调url,则服务端会在合成完成后主动回调。
// waitLoop4Complete(url, appkey, accessToken, task_id, request_id);
}else {
logger.error("Request Error: status=" + resultJson.getIntValue("status")
+ ", error_code=" + resultJson.getIntValue("error_code")
+ ", error_message=" + resultJson.getString("error_message"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
/// 根据特定信息轮询检查某个请求在服务端的合成状态,轮询操作非必须,如果设置了回调url,则服务端会在合成完成后主动回调。
private void waitLoop4Complete(String url, String appkey, String token, String task_id, String request_id) {
String fullUrl = url + "?appkey=" + appkey + "&task_id=" + task_id + "&token=" + token + "&request_id=" + request_id;
System.out.println("query url = " + fullUrl);
while(true) {
Request request = new Request.Builder().url(fullUrl).get().build();
try {
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
String result = response.body().string();
response.close();
System.out.println("waitLoop4Complete = " + result);
JSONObject resultJson = JSON.parseObject(result);
if(resultJson.containsKey("error_code")
&& resultJson.getIntValue("error_code") == 20000000
&& resultJson.containsKey("data")
&& resultJson.getJSONObject("data").getString("audio_address") != null) {
logger.info("Tts Finished! task_id = " + resultJson.getJSONObject("data").getString("task_id"));
logger.info("Tts Finished! audio_address = " + resultJson.getJSONObject("data").getString("audio_address"));
break;
}else {
logger.info("Tts Queuing...");
}
// 每隔10秒钟轮询一次状态。
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
String token ="4cf95a8e********";
String appkey = "vkvDk*******";
SpeechLongSynthesizerRestfulDemo demo = new SpeechLongSynthesizerRestfulDemo(appkey, token);
String text = "我家的后面有一个很大的园,相传叫作百草园。现在是早已并屋子一起卖给朱文公的子孙了,连那最末次的相见也已经隔了七八年,其中似乎确凿只有一些野草;但那时却是我的乐园。";
String format = "wav";
int sampleRate = 16000;
String voice = "siyue";
demo.processPOSTRequest(text, format, sampleRate, voice);
}
}
更多参考
异步长文本语音合成
HTTP Endpoint 订阅
使用PHP Web Server监听MNS Topic消息