流式TTS-音色需报备
连接
域名(wss://meta-daily.yiwise.com)/openApisocket.io?app_id=xx×tamp=xxx&authorization=xxx&req_from=C```
请使用socket.io连接
### 事件
1. 发送: ttsText,并有ACK消息返回,参数为
- voice:音色,需要提前报备部署
- text:合成文本
- pitchRate:语调,范围是-500~500,可选,默认是0。
- speechRate:语速,范围是-500~500,默认是0。
2. 接收:
- onTTSComplete:合成完毕
- onTTSFail: 合成失败
- onTTSMessage:实时返回音频流字节,PCM,16K
### 示例
import cn.hutool.json.JSONUtil;
import com.aigc.demo.util.RequestUtil;
import com.aigc.demo.util.SocketSSL;
import io.socket.client.Ack;
import io.socket.client.IO;
import io.socket.client.Socket;
import io.socket.emitter.Emitter;
import io.socket.engineio.client.transports.WebSocket;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.FileOutputStream;
import java.net.URI;
*/
public class TTSStream {
private static final Logger logger;
System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager");
logger = LogManager.getLogger(TTSStream.class);
}
try {
IO.Options options = new IO.Options();
options.transports = new String[] {WebSocket.NAME};
options.rememberUpgrade = true;
options.secure = true;
options.path = "/openApisocket.io";;
SocketSSL.set(options);
Long time = System.currentTimeMillis()/1000;
options.query = "app_id=xxxx×tamp=" + time +"&authorization=" + RequestUtil.getAuthorization(time) +"&req_from=C";
Socket socket = IO.socket(URI.create("wss://meta-daily.yiwise.com"), options);
// 监听连接事件
socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("Connected to server");
}
});
@Override
public void call(Object... args) {
System.out.println("Connected to server " + args[0]);
}
});
@Override
public void call(Object... args) {
for (Object arg : args) {
System.out.println("Connected to server error: " + arg);
}
}
});
FileOutputStream fout = new FileOutputStream(file);
// 监听TTS合成完毕事件
socket.on("onTTSComplete", new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("onTTSComplete: " + args[0]);
try {
fout.close();
}catch (Exception e) {
e.printStackTrace();
}
}
});
socket.on("onTTSMessage", new Emitter.Listener() {
@Override
public void call(Object... args) {
//System.out.println("onTTSMessage: " + args[0]);
try {
String encode = (String) args[0];
byte[] bytes = Base64.decode(encode);
System.out.println(bytes.length);
fout.write(bytes);
}catch (Exception e){
e.printStackTrace();
}
}
});
socket.on("onTTSFail", new Emitter.Listener() {
@Override
public void call(Object... args) {
System.out.println("onTTSFail: " + args[0]);
}
});
socket.connect();
//设置要和成的对象
TTSTextRequest request = new TTSTextRequest();
request.setText("你好啊,我是小智,很高兴为您服务。");
// 注意这个音色需要联系技术人员开通,否则无法使用流式输出
request.setVoice("xxxxx");
//语调,范围是-500
request.setPitchRate(10);
//语速,范围是-500
request.setSpeechRate(10);
socket.emit("ttsText", JSONUtil.parse(request), new Ack() {
@Override
public void call(Object... objects) {
if(objects != null) {
System.out.println("ttsText: " + JSONUtil.toJsonStr(objects));
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
修改于 2023-11-07 02:03:17