优化语音聊天和实时聊切入问题
This commit is contained in:
parent
a034837584
commit
dde2895f13
@ -43,7 +43,7 @@
|
||||
</div>
|
||||
<!-- AI正在输入指示器 -->
|
||||
<div
|
||||
v-if="isAiTyping"
|
||||
v-if="false"
|
||||
class="pet-typing"
|
||||
:style="petTypingStyle"
|
||||
>
|
||||
@ -1263,7 +1263,51 @@ export default {
|
||||
localStorage.setItem('selectedPet', JSON.stringify(pet))
|
||||
}
|
||||
|
||||
const selectPet = (pet) => {
|
||||
const refreshActiveVoiceModeWithCurrentPet = async () => {
|
||||
// 切换主角后,重建当前语音会话,确保音色/人设使用新主角配置
|
||||
if (chatMode.value === 'call' && isInCall.value) {
|
||||
chatStore.exitRealtimeCallMode()
|
||||
stopCallTimer()
|
||||
|
||||
const callConfig = {
|
||||
speaker: currentPet.value?.volcano_voice_id || 'zh_female_vv_jupiter_bigtts',
|
||||
model: currentPet.value?.volcano_model_version || 'O',
|
||||
bot_name: currentPet.value?.volcano_bot_name || currentPet.value?.name || 'AI助手',
|
||||
system_role: currentPet.value?.volcano_system_role || currentPet.value?.global_prompt || '你是一个友善的AI助手,用简洁自然的语言和用户交流。',
|
||||
character_manifest: currentPet.value?.volcano_character_manifest || '',
|
||||
speaking_style: '语气自然亲切,回复简洁',
|
||||
hello_text: `你好!我是${currentPet.value?.volcano_bot_name || currentPet.value?.name || 'AI助手'},有什么可以帮助你的吗?`
|
||||
}
|
||||
|
||||
const success = await chatStore.enterRealtimeCallMode(callConfig)
|
||||
if (success) {
|
||||
isInCall.value = true
|
||||
startCallTimer()
|
||||
await startRecording()
|
||||
} else {
|
||||
await switchToTextMode()
|
||||
ElMessage.warning('已切换主角,但实时通话重连失败,已回到文字模式')
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if (chatMode.value === 'voice') {
|
||||
chatStore.exitVoiceChatMode()
|
||||
await chatStore.connectVoiceWebSocket()
|
||||
await new Promise(resolve => setTimeout(resolve, 300))
|
||||
|
||||
await chatStore.startVoiceSession({
|
||||
speaker: currentPet.value?.volcano_voice_id || 'zh_female_vv_jupiter_bigtts',
|
||||
model: currentPet.value?.volcano_model_version || 'O',
|
||||
bot_name: currentPet.value?.volcano_bot_name || currentPet.value?.name || 'AI助手',
|
||||
system_role: currentPet.value?.volcano_system_role || currentPet.value?.global_prompt || '',
|
||||
character_manifest: currentPet.value?.volcano_character_manifest || '',
|
||||
input_mod: 'keep_alive'
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const selectPet = async (pet) => {
|
||||
currentPet.value = pet
|
||||
const petBinding = backgroundPets.value.find(binding => binding.pet.id === pet.id)
|
||||
if (petBinding) {
|
||||
@ -1283,7 +1327,14 @@ export default {
|
||||
selectedHistoryPetId.value = pet.id
|
||||
}
|
||||
saveChatConfig()
|
||||
ElMessage.success(`已切换到${pet.name}`)
|
||||
|
||||
try {
|
||||
await refreshActiveVoiceModeWithCurrentPet()
|
||||
ElMessage.success(`已切换到${pet.name}`)
|
||||
} catch (err) {
|
||||
console.error('切换主角后重建语音会话失败:', err)
|
||||
ElMessage.warning(`已切换到${pet.name},但语音会话重建失败`)
|
||||
}
|
||||
}
|
||||
|
||||
const togglePetSelector = () => {
|
||||
@ -1346,11 +1397,15 @@ export default {
|
||||
await stopRecording()
|
||||
}
|
||||
if (chatMode.value === 'voice') {
|
||||
// 退出语音模式时主动销毁会话,避免下次进入沿用旧主角音色
|
||||
chatStore.exitVoiceChatMode()
|
||||
await switchToTextMode()
|
||||
} else {
|
||||
try {
|
||||
const hasPermission = await chatStore.requestMicrophonePermission()
|
||||
if (hasPermission) {
|
||||
// 进入语音模式前先清理历史语音会话,确保按当前主角重新建会话
|
||||
chatStore.exitVoiceChatMode()
|
||||
chatMode.value = 'voice'
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user