Skip to content

Commit b5ef628

Browse files
committed
fix:修复 edge 配置为空导致的实例化错误问题
1 parent 1c3b575 commit b5ef628

File tree

5 files changed

+48
-22
lines changed

5 files changed

+48
-22
lines changed

src/main/java/com/xiaozhi/communication/common/SessionManager.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -373,18 +373,6 @@ public ListenMode getMode(String sessionId) {
373373
return ListenMode.Auto;
374374
}
375375

376-
/**
377-
* 清空缓存记忆
378-
*
379-
* @param sessionId
380-
*/
381-
public voic setChatMemory(String sessionId, chatMemory memory) {
382-
ChatSession chatSession = sessions.get(sessionId);
383-
if (chatSession != null) {
384-
chatSession.setChatMemory(memory);
385-
}
386-
}
387-
388376
/**
389377
* 设置流式识别状态
390378
*

src/main/java/com/xiaozhi/controller/ConfigController.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,12 @@ public AjaxResult update(SysConfig config) {
7474
int rows = configService.update(config);
7575
if (rows > 0) {
7676
configManager.getConfig(config.getConfigId());// 更新缓存
77-
if(oldSysConfig != null){
78-
if("stt".equals(oldSysConfig.getConfigType()) && !oldSysConfig.getApiKey().equals(config.getApiKey())){
77+
if (oldSysConfig != null) {
78+
if ("stt".equals(oldSysConfig.getConfigType())
79+
&& !oldSysConfig.getApiKey().equals(config.getApiKey())) {
7980
sttServiceFactory.removeCache(oldSysConfig);
80-
}else if("tts".equals(oldSysConfig.getConfigType()) && !oldSysConfig.getApiKey().equals(config.getApiKey())){
81+
} else if ("tts".equals(oldSysConfig.getConfigType())
82+
&& !oldSysConfig.getApiKey().equals(config.getApiKey())) {
8183
ttsServiceFactory.removeCache(oldSysConfig);
8284
}
8385
}

src/main/java/com/xiaozhi/dialogue/stt/factory/SttServiceFactory.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,4 +169,12 @@ private SttService createApiService(SysConfig config) {
169169
logger.warn("不支持的STT服务提供商: {}", provider);
170170
return null;
171171
}
172+
173+
public void removeCache(SysConfig config) {
174+
// 对于API服务,使用"provider:configId"作为缓存键,确保每个配置使用独立的服务实例
175+
Integer configId = config.getConfigId();
176+
String provider = config.getProvider();
177+
String cacheKey = provider + ":" + (configId != null ? configId : "default");
178+
serviceCache.remove(cacheKey);
179+
}
172180
}

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

Lines changed: 34 additions & 6 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 OUT_PUT_PATH = "audio/";
25+
private static final String OUTPUT_PATH = "audio/";
2626

2727
// 默认服务提供商名称
2828
private static final String DEFAULT_PROVIDER = "edge";
@@ -40,25 +40,30 @@ public TtsService getDefaultTtsService() {
4040

4141
// 创建缓存键,包含provider、configId和voiceName,确保音色变化时创建新的服务实例
4242
private String createCacheKey(SysConfig config, String provider, String voiceName) {
43-
var configId = config.getConfigId();
44-
var configIdStr = configId != null ? String.valueOf(configId) : "default";
45-
return provider + ":" + configIdStr + ":" + voiceName;
43+
Integer configId = -1;
44+
if (config != null && config.getConfigId() != null) {
45+
configId = config.getConfigId();
46+
}
47+
return provider + ":" + configId + ":" + voiceName;
4648
}
4749

4850
/**
4951
* 根据配置获取TTS服务
5052
*/
5153
public TtsService getTtsService(SysConfig config, String voiceName) {
54+
55+
config = !ObjectUtils.isEmpty(config) ? config : new SysConfig().setProvider(DEFAULT_PROVIDER);
56+
5257
// 如果提供商为空,则使用默认提供商
53-
var provider = ObjectUtils.isEmpty(config) ? DEFAULT_PROVIDER : config.getProvider();
58+
var provider = config.getProvider();
5459
var cacheKey = createCacheKey(config, provider, voiceName);
5560

5661
// 检查是否已有该配置的服务实例
5762
if (serviceCache.containsKey(cacheKey)) {
5863
return serviceCache.get(cacheKey);
5964
}
6065

61-
var service = createApiService(config, voiceName, OUT_PUT_PATH);
66+
var service = createApiService(config, voiceName, OUTPUT_PATH);
6267
serviceCache.put(cacheKey, service);
6368
return service;
6469
}
@@ -84,4 +89,27 @@ private void ensureOutputPath(String outputPath) {
8489
File dir = new File(outputPath);
8590
if (!dir.exists()) dir.mkdirs();
8691
}
92+
93+
public void removeCache(SysConfig config) {
94+
if (config == null) {
95+
return;
96+
}
97+
98+
String provider = config.getProvider();
99+
Integer configId = config.getConfigId();
100+
101+
// 遍历缓存的所有键,找到匹配的键并移除
102+
serviceCache.keySet().removeIf(key -> {
103+
String[] parts = key.split(":");
104+
if (parts.length != 3) {
105+
return false;
106+
}
107+
String keyProvider = parts[0];
108+
String keyConfigId = parts[1];
109+
110+
// 检查provider和configId是否匹配
111+
return keyProvider.equals(provider) && keyConfigId.equals(String.valueOf(configId));
112+
});
113+
114+
}
87115
}

src/main/java/com/xiaozhi/service/impl/SysDeviceServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ public int updateNoRefreshCache(SysDevice device) {
239239
message.setDeviceId(device.getDeviceId());
240240
// 清空设备聊天记录
241241
messageMapper.delete(message);
242-
session.setChatMemory(sesseion.getId(), null);
242+
// TODO 未清空已缓存记忆内容
243243
}
244244
}
245245
}

0 commit comments

Comments
 (0)