Skip to content

Commit cde8ba3

Browse files
author
zhaoyz
committed
1:增加ffmpeg安装检查,给出告警提醒
2:增加缓存处理
1 parent 8e93e6a commit cde8ba3

File tree

6 files changed

+80
-31
lines changed

6 files changed

+80
-31
lines changed

src/main/java/com/xiaozhi/dialogue/tts/TtsService.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ public interface TtsService {
2323
*
2424
*/
2525
boolean isSupportStreamTts();
26-
26+
/**
27+
* 是否依赖Ffmpeg,如果依赖,检查Ffmpeg是否安装
28+
* @return
29+
*/
30+
boolean isInstallFfmpeg();
2731
/**
2832
* 将文本转换为语音(带自定义语音)
2933
*

src/main/java/com/xiaozhi/dialogue/tts/factory/TtsServiceFactory.java

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class TtsServiceFactory {
2222
private final Map<String, TtsService> serviceCache = new ConcurrentHashMap<>();
2323

2424
// 语音生成文件保存地址
25-
private static final String outputPath = "audio/";
25+
private static final String OUT_PUT_PATH = "audio/";
2626

2727
// 默认服务提供商名称
2828
private static final String DEFAULT_PROVIDER = "edge";
@@ -35,13 +35,32 @@ public class TtsServiceFactory {
3535
*/
3636
public TtsService getDefaultTtsService() {
3737
// 如果缓存中没有默认服务,则创建一个
38-
TtsService edgeService = new EdgeTtsService(DEFAULT_VOICE, outputPath);
39-
40-
return edgeService;
38+
return getTtsService(DEFAULT_VOICE);
4139
}
4240

4341
public TtsService getTtsService() {
44-
return new EdgeTtsService(DEFAULT_VOICE, outputPath);
42+
return getTtsService(DEFAULT_VOICE);
43+
}
44+
45+
private TtsService getTtsService(String voiceName) {
46+
TtsService ttsService = new EdgeTtsService(voiceName, OUT_PUT_PATH);
47+
if(!ttsService.isInstallFfmpeg()){
48+
logger.warn("请先安装ffmpeg");
49+
}
50+
return ttsService;
51+
}
52+
53+
private String createCacheKey(SysConfig config,String provider){
54+
// 对于API服务,使用"provider:configId"作为缓存键,确保每个配置使用独立的服务实例
55+
String configIdStr;
56+
if (config == null) {
57+
configIdStr = "default";
58+
}else{
59+
Integer configId = config.getConfigId();
60+
configIdStr = configId != null ? String.valueOf(configId) : "default";
61+
}
62+
String cacheKey = provider + ":" + configIdStr;
63+
return cacheKey;
4564
}
4665

4766
/**
@@ -56,30 +75,37 @@ public TtsService getTtsService(SysConfig config, String voiceName) {
5675
} else {
5776
provider = config.getProvider();
5877
}
59-
// 如果是默认提供商且尚未初始化,则初始化
60-
if (DEFAULT_PROVIDER.equals(provider)) {
61-
TtsService edgeService = new EdgeTtsService(StringUtils.hasText(voiceName) ? voiceName : DEFAULT_VOICE, outputPath);
62-
return edgeService;
63-
}
64-
65-
// 对于API服务,使用"provider:configId"作为缓存键,确保每个配置使用独立的服务实例
66-
Integer configId = config.getConfigId();
67-
String cacheKey = provider + ":" + (configId != null ? configId : "default");
68-
78+
String cacheKey = createCacheKey(config,provider);
6979
// 检查是否已有该配置的服务实例
7080
if (serviceCache.containsKey(cacheKey)) {
7181
return serviceCache.get(cacheKey);
72-
}
73-
74-
// 创建新的服务实例
75-
try {
76-
TtsService service;
77-
// 创建其他API服务
78-
service = createApiService(config, voiceName, outputPath);
79-
return service;
80-
} catch (Exception e) {
81-
logger.error("创建{}服务失败", provider, e);
82-
return getDefaultTtsService(); // 失败时返回默认服务
82+
}else{
83+
// 如果是默认提供商且尚未初始化,则初始化
84+
if (DEFAULT_PROVIDER.equals(provider)) {
85+
if(StringUtils.hasText(voiceName)){
86+
TtsService ttsService = getTtsService(voiceName);
87+
serviceCache.put(cacheKey, ttsService);
88+
return ttsService;
89+
}else{
90+
TtsService ttsService = getTtsService();
91+
serviceCache.put(cacheKey, ttsService);
92+
return ttsService;
93+
}
94+
}
95+
// 创建新的服务实例
96+
try {
97+
TtsService service;
98+
// 创建其他API服务
99+
service = createApiService(config, voiceName, OUT_PUT_PATH);
100+
if(!service.isInstallFfmpeg()){
101+
logger.warn("请先安装ffmpeg");
102+
}
103+
serviceCache.put(cacheKey, service);
104+
return service;
105+
} catch (Exception e) {
106+
logger.error("创建{}服务失败", provider, e);
107+
return getDefaultTtsService(); // 失败时返回默认服务
108+
}
83109
}
84110
}
85111

src/main/java/com/xiaozhi/dialogue/tts/providers/AliyunTtsService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,10 @@ public String getProviderName() {
6262
public boolean isSupportStreamTts() {
6363
return false;
6464
}
65-
65+
@Override
66+
public boolean isInstallFfmpeg() {
67+
return true;
68+
}
6669
@Override
6770
public String getAudioFileName() {
6871
String uuid = UUID.randomUUID().toString().replace("-", "");

src/main/java/com/xiaozhi/dialogue/tts/providers/EdgeTtsService.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,17 @@ public String getProviderName() {
4141
public boolean isSupportStreamTts() {
4242
return false;
4343
}
44-
44+
@Override
45+
public boolean isInstallFfmpeg() {
46+
try {
47+
logger.info("is Install Ffmpeg");
48+
Process p = new ProcessBuilder("ffmpeg", "-version").start();
49+
p.waitFor();
50+
return true;
51+
} catch (Exception e) {
52+
return false;
53+
}
54+
}
4555
@Override
4656
public String getAudioFileName() {
4757
String uuid = UUID.randomUUID().toString().replace("-", "");

src/main/java/com/xiaozhi/dialogue/tts/providers/VolcengineTtsService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ public String getProviderName() {
5252
public boolean isSupportStreamTts() {
5353
return false;
5454
}
55-
55+
@Override
56+
public boolean isInstallFfmpeg() {
57+
return true;
58+
}
5659
@Override
5760
public String getAudioFileName() {
5861
String uuid = UUID.randomUUID().toString().replace("-", "");

src/main/java/com/xiaozhi/dialogue/tts/providers/XfyunTtsService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ public String getProviderName() {
5353
public boolean isSupportStreamTts() {
5454
return false;
5555
}
56-
56+
@Override
57+
public boolean isInstallFfmpeg() {
58+
return true;
59+
}
5760
@Override
5861
public String getAudioFileName() {
5962
String uuid = UUID.randomUUID().toString().replace("-", "");

0 commit comments

Comments
 (0)