Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions mvn/src/main/java/com/tinet/ttssc/TtsGet.java
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr
if(vid == 1 || vid == 3){
ttsRequest.setVid(vid);
}else{
out.append("vid只能为1(普通话)或者3(粤语)");
out.append("vid只能为1(普通话)或者2(粤语)");
out.flush();
out.close();
return;
Expand All @@ -155,10 +155,8 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr
ttsRequest.setRequestTime(new Date());
ttsRequest.setText(text);
ttsRequest.setHash(MD5Encoder.encode(text));


String fileName = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav";
List<JSONObject> list = AwsDynamoDbService.query(Const.DYNAMODB_TABLE, Const.DYNAMODB_PRIMARY_ID, ttsRequest.getHash());
String key = ttsRequest.getVid() + "-" + ttsRequest.getHash();
List<JSONObject> list = AwsDynamoDbService.query(Const.DYNAMODB_TABLE, Const.DYNAMODB_PRIMARY_ID, key);
if(list.size() > 0){
ttsRequest.setStartTime(new Date());
ttsRequest.setHitCache(1);
Expand Down Expand Up @@ -200,7 +198,7 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) thr
if(ttsRequest.isDone()){
String bucketName = SystemSettingService.getSystemSetting(Const.S3_BUCKET).getValue();

String webfileName = "http://" + bucketName + "." + Const.AWS_TTS_CACHE_URL_POSTFIX + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav";
String webfileName = "http://" + bucketName + "." + Const.AWS_TTS_CACHE_URL_POSTFIX + "/" + ttsRequest.getVid() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav";
//System.out.println("合成完成,文件:"+webfileName + "时间=" + System.currentTimeMillis() + " thread:" + Thread.currentThread());
//System.out.println("合成完成,文件绝对路径:"+fileName);

Expand Down
132 changes: 72 additions & 60 deletions mvn/src/main/java/com/tinet/ttssc/TtssEngine.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.tinet.ttssc.service.AwsDynamoDbService;
import com.tinet.ttssc.service.AwsS3Service;
import com.tinet.ttssc.service.SystemSettingService;
import com.tinet.ttssc.util.DateUtil;


public class TtssEngine extends Thread{
Expand Down Expand Up @@ -73,70 +74,81 @@ public void run(){
try {
TtsRequest ttsRequest = queue.poll(10, TimeUnit.SECONDS);
if (ttsRequest != null ) {
if(ttsRequest.isValid(ttsServer)){//说明可以使用这个server转换
running = true;
dealCount.incrementAndGet();
threadDealCount++;
try{
ttsRequest.setTtsServer(ttsServer);
ttsRequest.setThreadId(threadId);
ttsRequest.setStartTime(new Date());
ttsRequest.setUuid(UUID.randomUUID().toString());
String fileName = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav";
int res = jni.request(ttsRequest.getText(), fileName, ttsServer.getIp(), ttsRequest.getSpeed().intValue(), ttsRequest.getVid().intValue(), ttsRequest.getVolume().intValue());
//System.out.println("jni.request ok res= " + res + " time=" + System.currentTimeMillis() + " thread:" + ttsRequest.getNotifyThread() + " ttsRequest:" + ttsRequest);
ttsRequest.setEndTime(new Date());
ttsRequest.setResult(res);
//存储到数据库日志中
TtsRequest.saveTtsLog(ttsRequest);
if (res !=0){
failCount.incrementAndGet();
threadFailCount++;
if(ttsRequest.getRetry() > 0){
ttsRequest.setRetry(ttsRequest.getRetry() - 1);
ttsRequest.removeValid(ttsServer);
if(ttsRequest.hasValid()){//如果还有有效的server再丢进去,否则就丢弃了
TtssEngine.pushRequest(ttsRequest);
//加上超时后退出机制,防止因为没有找到server最后一直卡在queue里面的情况。
if(DateUtil.diffSecond(ttsRequest.getRequestTime(), new Date()) < ttsRequest.getTimeout()){
if(ttsRequest.isValid(ttsServer)){//说明可以使用这个server转换
running = true;
dealCount.incrementAndGet();
threadDealCount++;
try{
ttsRequest.setTtsServer(ttsServer);
ttsRequest.setThreadId(threadId);
ttsRequest.setStartTime(new Date());
ttsRequest.setUuid(UUID.randomUUID().toString());
String fileName = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue() + "/" + ttsRequest.getVid() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav";
int res = jni.request(ttsRequest.getText(), fileName, ttsServer.getIp(), ttsRequest.getSpeed().intValue(), ttsRequest.getVid().intValue(), ttsRequest.getVolume().intValue());
//System.out.println("jni.request ok res= " + res + " time=" + System.currentTimeMillis() + " thread:" + ttsRequest.getNotifyThread() + " ttsRequest:" + ttsRequest);
ttsRequest.setEndTime(new Date());
ttsRequest.setResult(res);
//存储到数据库日志中
TtsRequest.saveTtsLog(ttsRequest);
if (res !=0){
failCount.incrementAndGet();
threadFailCount++;
if(ttsRequest.getRetry() > 0){
ttsRequest.setRetry(ttsRequest.getRetry() - 1);
ttsRequest.removeValid(ttsServer);
if(ttsRequest.hasValid()){//如果还有有效的server再丢进去,否则就丢弃了
TtssEngine.pushRequest(ttsRequest);
}
}
}else{
boolean success = false;
File tmp = new File(fileName);
if(tmp.exists()){
FileInputStream fis = null;
fis = new FileInputStream(tmp);
Integer size = fis.available();
System.out.println(fileName + " size=" + size);
if(size > 44){
String s3FileName = ttsRequest.getVid() + "/" + ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav";
if(AwsS3Service.upload(fileName, s3FileName)){
long createTime = new Date().getTime()/1000;
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("createTime", createTime);
params.put("text", ttsRequest.getText());
params.put("vid", ttsRequest.getVid());
String key = ttsRequest.getVid() + "-" + ttsRequest.getHash();
if(AwsDynamoDbService.createItem(Const.DYNAMODB_TABLE, Const.DYNAMODB_PRIMARY_ID, key, params)){
success = true;
}
}
}
fis.close();
tmp.delete();
}
synchronized (ttsRequest.getNotifyThread()) {
ttsRequest.setDone(success);
ttsRequest.getNotifyThread().notifyAll();
}
}
}else{
boolean success = false;
File tmp = new File(fileName);
if(tmp.exists()){
FileInputStream fis = null;
fis = new FileInputStream(tmp);
Integer size = fis.available();
System.out.println(fileName + " size=" + size);
if(size > 44){
String s3FileName = ttsRequest.getHash().substring(0,2) + "/" + ttsRequest.getHash() + ".wav";
if(AwsS3Service.upload(fileName, s3FileName)){
long createTime = new Date().getTime()/1000;
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("createTime", createTime);
params.put("text", ttsRequest.getText());
if(AwsDynamoDbService.createItem(Const.DYNAMODB_TABLE, Const.DYNAMODB_PRIMARY_ID, ttsRequest.getHash(), params)){
success = true;
}
}
}
fis.close();
tmp.delete();
}
synchronized (ttsRequest.getNotifyThread()) {
ttsRequest.setDone(success);
ttsRequest.getNotifyThread().notifyAll();
}
}
catch (Exception e){
e.printStackTrace();
}
finally{
running = false;
}
}else {
//说明这个server试过了,换下一个
TtssEngine.pushRequest(ttsRequest);
}
catch (Exception e){
e.printStackTrace();
}
finally{
running = false;
}
}else {
//说明这个server试过了,换下一个
TtssEngine.pushRequest(ttsRequest);
}else{
ttsRequest.setResult(Const.REQUEST_RESULT_TIMEOUT);//没有找到server超时
ttsRequest.setTtsServer(null);
ttsRequest.setEndTime(new Date());
ttsRequest.setDone(false);
TtsRequest.saveTtsLog(ttsRequest);
}
}
}catch (Exception e) {
Expand Down
10 changes: 9 additions & 1 deletion mvn/src/main/java/com/tinet/ttssc/entity/TtsRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public class TtsRequest implements Serializable, Comparable<TtsRequest>{
private Integer redirect;
private Integer sync;
private boolean done;
private Integer timeout;

public String getText() {
return text;
Expand Down Expand Up @@ -191,6 +192,13 @@ public Integer getSync() {
public void setSync(Integer sync) {
this.sync = sync;
}

public Integer getTimeout() {
return timeout;
}
public void setTimeout(Integer timeout) {
this.timeout = timeout;
}
public boolean isValid(TtsServer ttsServer){
if(validServer.contains(ttsServer)){
boolean vidValid = false;
Expand All @@ -200,7 +208,7 @@ public boolean isValid(TtsServer ttsServer){
}else{
vidValid = false;
}
}else if(vid==3){//粤语
}else if(vid==2){//粤语
if (ttsServer.getVid().equals(2) || ttsServer.getVid().equals(3)){
vidValid = true;
}else{
Expand Down
1 change: 1 addition & 0 deletions mvn/src/main/java/com/tinet/ttssc/inc/Const.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ public class Const {
public static String DYNAMODB_PRIMARY_ID = "key";
public static String AWS_TTS_CACHE_URL_POSTFIX = "s3-website.cn-north-1.amazonaws.com.cn";

public static Integer REQUEST_RESULT_TIMEOUT=-999;
}
68 changes: 36 additions & 32 deletions mvn/src/main/java/com/tinet/ttssc/init/Daemon.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,40 +64,15 @@ public void contextInitialized(ServletContextEvent sce) {
//初始化AWS
AwsS3Service.init();
AwsDynamoDbService.init();
//初始化ttsServer
Macro.ttsServers = TtsServerService.init();
//初始化目录
String path = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue();
if(StringUtil.isNotEmpty(path)){
String cmd= "/bin/mkdir -p " + path;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
for(char i='a'; i<= 'f'; i++){
for(int j=0; j<= 9; j++){
cmd = "/bin/mkdir -p " + path + "/" + i + j;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
}
for(char j='a'; j<= 'f'; j++){
cmd = "/bin/mkdir -p " + path + "/" + i + j;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
}
}
for(int i=0; i<= 9; i++){
for(int j=0; j<= 9; j++){
cmd = "/bin/mkdir -p " + path + "/" + i + j;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
}
for(char j='a'; j<= 'f'; j++){
cmd = "/bin/mkdir -p " + path + "/" + i + j;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
}
}
String pathSetting = SystemSettingService.getSystemSetting(Const.TTS_CACHE_ABS_PATH).getValue();
if(StringUtil.isNotEmpty(pathSetting)){
mkdir(pathSetting, 1);//普通话
mkdir(pathSetting, 2);//粤语
}

//初始化ttsServer
Macro.ttsServers = TtsServerService.init();
//启动转换线程
for(TtsServer server: Macro.ttsServers){
if(server.getActive() == 1){
Expand All @@ -122,7 +97,36 @@ public void contextInitialized(ServletContextEvent sce) {
System.out.println("开启清理过期数据线程,每天清理一次");
return;
}

public static void mkdir(String path, Integer vid){
path = path + "/" + vid;//创建普通话目录
String cmd= "/bin/mkdir -p " + path;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
for(char i='a'; i<= 'f'; i++){
for(int j=0; j<= 9; j++){
cmd = "/bin/mkdir -p " + path + "/" + i + j;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
}
for(char j='a'; j<= 'f'; j++){
cmd = "/bin/mkdir -p " + path + "/" + i + j;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
}
}
for(int i=0; i<= 9; i++){
for(int j=0; j<= 9; j++){
cmd = "/bin/mkdir -p " + path + "/" + i + j;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
}
for(char j='a'; j<= 'f'; j++){
cmd = "/bin/mkdir -p " + path + "/" + i + j;
System.out.println("创建目录 cmd=[" + cmd + "]");
SystemCmd.executeCmd(cmd);
}
}
}
/**
* 关闭
*/
Expand Down