优化语音聊天和实时聊切入问题

This commit is contained in:
taiyi 2026-04-12 19:06:35 +08:00
parent a034837584
commit dde2895f13

View File

@ -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) {