Skip to content

Commit d5d403b

Browse files
committed
Auto enabling new voice id.
1 parent 37a1855 commit d5d403b

3 files changed

Lines changed: 50 additions & 2 deletions

File tree

main_server.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1084,9 +1084,36 @@ async def update_catgirl_voice_id(name: str, request: Request):
10841084
}, status_code=400)
10851085
characters['猫娘'][name]['voice_id'] = voice_id
10861086
_config_manager.save_characters(characters)
1087+
1088+
# 如果是当前活跃的猫娘,需要结束当前session以应用新的voice_id
1089+
is_current_catgirl = (name == characters.get('当前猫娘', ''))
1090+
session_ended = False
1091+
1092+
if is_current_catgirl and name in session_manager:
1093+
# 检查是否有活跃的session
1094+
if session_manager[name].is_active:
1095+
logger.info(f"检测到 {name} 的voice_id已更新,正在结束当前session...")
1096+
try:
1097+
await session_manager[name].end_session(by_server=True)
1098+
session_ended = True
1099+
logger.info(f"{name} 的session已结束,新的voice_id将在下次对话时生效")
1100+
except Exception as e:
1101+
logger.error(f"结束session时出错: {e}")
1102+
10871103
# 自动重新加载配置
10881104
await initialize_character_data()
1089-
return {"success": True}
1105+
1106+
# 如果结束了session,通过WebSocket通知前端
1107+
if session_ended and name in session_manager and session_manager[name].websocket:
1108+
try:
1109+
await session_manager[name].websocket.send_text(json.dumps({
1110+
"type": "voice_id_updated",
1111+
"message": "语音已更新,请重新开始对话"
1112+
}))
1113+
except Exception as e:
1114+
logger.warning(f"通知前端voice_id更新失败: {e}")
1115+
1116+
return {"success": True, "session_restarted": session_ended}
10901117

10911118
@app.post('/api/characters/clear_voice_ids')
10921119
async def clear_voice_ids():

static/app.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,21 @@ function init_app(){
316316
sessionStartedResolver(response.input_mode);
317317
sessionStartedResolver = null;
318318
}
319+
} else if (response.type === 'voice_id_updated') {
320+
console.log('收到voice_id_updated事件:', response.message);
321+
// 语音ID已更新,session已重置
322+
showStatusToast(response.message || '语音已更新,请重新开始对话', 5000);
323+
324+
// 如果正在录音,停止录音
325+
if (isRecording) {
326+
stopRecording();
327+
micButton.disabled = false;
328+
muteButton.disabled = true;
329+
screenButton.disabled = true;
330+
}
331+
332+
// 清空音频队列
333+
clearAudioQueue();
319334
} else if (response.type === 'auto_close_mic') {
320335
console.log('收到auto_close_mic事件,自动关闭麦克风');
321336
// 长时间无语音输入,自动关闭麦克风但不关闭live2d

templates/voice_clone.html

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,15 @@ <h2>音色注册</h2>
7575
resultDiv.innerHTML += '<br><span class="error">voice_id自动保存失败: ' + (res.error || '未知错误') + '</span>';
7676
} else {
7777
resultDiv.innerHTML += '<br>voice_id已自动保存到角色';
78+
// 如果session被重启了,提示用户
79+
if (res.session_restarted) {
80+
resultDiv.innerHTML += '<br><span style="color: blue;">当前对话已重置,新语音将立即生效</span>';
81+
} else {
82+
resultDiv.innerHTML += '<br><span style="color: blue;">新语音将在下次对话时生效</span>';
83+
}
7884
// 通知父页面voice_id已更新
7985
if (window.parent !== window) {
80-
window.parent.postMessage({type: 'voice_id_updated', voice_id: data.voice_id}, '*');
86+
window.parent.postMessage({type: 'voice_id_updated', voice_id: data.voice_id, session_restarted: res.session_restarted}, '*');
8187
}
8288
}
8389
}).catch(e => {

0 commit comments

Comments
 (0)