importcom.google.common.collect.ImmutableMap;importcom.google.common.io.ByteArrayDataOutput;importcom.google.common.io.ByteStreams;importcom.google.gson.Gson;importcom.xxx.web.open.service.CacheService;importcom.xxx.web.open.util.AudioStreamHelper;importlombok.Setter;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.lang3.tuple.ImmutablePair;importorg.java_websocket.enums.ReadyState;importorg.java_websocket.client.WebSocketClient;importorg.java_websocket.handshake.ServerHandshake;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.util.DigestUtils;importjava.io.File;importjava.net.URI;importjava.nio.ByteBuffer;importjava.util.Map;importjava.util.Objects;importjava.util.UUID;importjava.util.concurrent.locks.ReentrantLock;/***
* 离线语音合成*/@Slf4j
@Component("ttsService")public class OfflineTTSService extendsWebSocketClient {public String textToSpeech(String text, String speakerId) throwsInterruptedException {/***
* 根据请求的内容计算hash值,防止请求重放,产生不必要的请求,浪费服务器资源(内存、cpu、硬盘空间)
* hash值产生算法:
* 1、byteArrayOf("tts")+byteArrayOf("待转换的文字")
* 2、byteArrayOf("asr")+音频流二进制 byte[]
* 3、byteArrayOf("merge") + 文件流 byteArray1[] + 文件流byteArray2[] + ... 文件流 byteArrayN[]*/ImmutablePair result =findConversion(computeHash(text,speakerId));
Boolean existed=result.getLeft();if(existed)
{
String uuid=result.getRight();
log.warn("重复的合成请求:{}",uuid);returnuuid;
}synchronized (this)
{if(getReadyState()==ReadyState.NOT_YET_CONNECTED) {if(isClosed()) {
reconnectBlocking();
}else{
connectBlocking();
}
}else if(getReadyState() ==ReadyState.CLOSED){
reconnectBlocking();
}
}
}