From d5cededd8ba87fe6dd7a896b0a7268ffeeeffddc Mon Sep 17 00:00:00 2001 From: 1600822305 <1600822305@qq.com> Date: Fri, 11 Apr 2025 19:08:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=20TTS=20=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=9C=8D=E5=8A=A1=E5=B9=B6=E6=9B=B4=E6=96=B0=E4=BA=86?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/DraggableVoiceCallWindow.tsx | 4 ++-- src/renderer/src/components/VoiceCallModal.tsx | 12 ++++++------ src/renderer/src/pages/VoiceCallWindow.tsx | 6 +++--- src/renderer/src/services/tts/TTSTextFilter.ts | 2 +- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/renderer/src/components/DraggableVoiceCallWindow.tsx b/src/renderer/src/components/DraggableVoiceCallWindow.tsx index e67ee1b769..25a3e64978 100644 --- a/src/renderer/src/components/DraggableVoiceCallWindow.tsx +++ b/src/renderer/src/components/DraggableVoiceCallWindow.tsx @@ -76,7 +76,7 @@ const DraggableVoiceCallWindow: React.FC = ({ // 启动语音通话 await VoiceCallService.startCall({ onTranscript: (text) => setTranscript(text), - onResponse: (_) => { + onResponse: () => { // 这里不设置response,因为响应会显示在聊天界面中 }, onListeningStateChange: setIsListening, @@ -118,7 +118,7 @@ const DraggableVoiceCallWindow: React.FC = ({ // 移除事件监听器 window.removeEventListener('tts-state-change', handleTTSStateChange as EventListener) } - }, [visible, t]) + }, [visible, t, dispatch, onClose]) // 拖拽相关处理 const handleDragStart = (e: React.MouseEvent) => { diff --git a/src/renderer/src/components/VoiceCallModal.tsx b/src/renderer/src/components/VoiceCallModal.tsx index 3e1310f7f1..3f89c41f39 100644 --- a/src/renderer/src/components/VoiceCallModal.tsx +++ b/src/renderer/src/components/VoiceCallModal.tsx @@ -29,6 +29,11 @@ const VoiceCallModal: React.FC = ({ visible, onClose }) => { const [isRecording, setIsRecording] = useState(false); const [isProcessing, setIsProcessing] = useState(false); + const handleClose = () => { + VoiceCallService.endCall(); + onClose(); + }; + useEffect(() => { const startVoiceCall = async () => { try { @@ -78,12 +83,7 @@ const VoiceCallModal: React.FC = ({ visible, onClose }) => { // 移除事件监听器 window.removeEventListener('tts-state-change', handleTTSStateChange as EventListener); }; - }, [visible, t]); - - const handleClose = () => { - VoiceCallService.endCall(); - onClose(); - }; + }, [visible, t, handleClose]); const toggleMute = () => { const newMuteState = !isMuted; diff --git a/src/renderer/src/pages/VoiceCallWindow.tsx b/src/renderer/src/pages/VoiceCallWindow.tsx index cebeb1750a..d0838b297f 100644 --- a/src/renderer/src/pages/VoiceCallWindow.tsx +++ b/src/renderer/src/pages/VoiceCallWindow.tsx @@ -22,7 +22,7 @@ import { setIsVoiceCallActive, setLastPlayedMessageId, setSkipNextAutoTTS } from const VoiceCallWindow: React.FC = () => { const { t } = useTranslation(); const dispatch = useDispatch(); - + // 语音通话状态 const [transcript, setTranscript] = useState(''); const [isListening, setIsListening] = useState(false); @@ -49,7 +49,7 @@ const VoiceCallWindow: React.FC = () => { // 启动语音通话 await VoiceCallService.startCall({ onTranscript: (text) => setTranscript(text), - onResponse: (_) => { + onResponse: () => { // 这里不设置response,因为响应会显示在聊天界面中 }, onListeningStateChange: setIsListening, @@ -78,7 +78,7 @@ const VoiceCallWindow: React.FC = () => { dispatch(setLastPlayedMessageId(null)); // 设置跳过下一次自动TTS,确保打开窗口时不会自动播放最后一条消息 dispatch(setSkipNextAutoTTS(true)); - + startVoiceCall(); // 添加事件监听器 window.addEventListener('tts-state-change', handleTTSStateChange as EventListener); diff --git a/src/renderer/src/services/tts/TTSTextFilter.ts b/src/renderer/src/services/tts/TTSTextFilter.ts index 11a29d3f44..6a95efd799 100644 --- a/src/renderer/src/services/tts/TTSTextFilter.ts +++ b/src/renderer/src/services/tts/TTSTextFilter.ts @@ -163,7 +163,7 @@ export class TTSTextFilter { text = text.replace(/[\u{1F300}-\u{1F5FF}\u{1F600}-\u{1F64F}\u{1F680}-\u{1F6FF}\u{1F700}-\u{1F77F}\u{1F780}-\u{1F7FF}\u{1F800}-\u{1F8FF}\u{1F900}-\u{1F9FF}\u{1FA00}-\u{1FA6F}\u{1FA70}-\u{1FAFF}\u{2600}-\u{26FF}\u{2700}-\u{27BF}]/gu, '') // 过滤符号表情,如 :) :( :D 等 - text = text.replace(/[:;][\-']?[\)\(DOPdop\|\\\/\{\}\[\]\*]+/g, '') + text = text.replace(/[:;][-']?[)(DOPdop|\/{\}\[\]\*]+/g, '') // 过滤文本表情,如 (smile) (sad) 等 text = text.replace(/\([a-zA-Z]+\)/g, '')