From a71ce53a687edf13c2aaf7b99f0cc8264abb529d Mon Sep 17 00:00:00 2001 From: rainv123 <2148537152@qq.com> Date: Thu, 30 Apr 2026 17:33:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E8=AF=8D=E6=97=B6=EF=BC=8C=E7=81=AB=E5=B1=B1?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E5=8F=8C=E5=90=91=E6=B5=81=E5=BC=8Ftts?= =?UTF-8?q?=E7=9A=84=E6=96=87=E6=9C=AC=E6=98=BE=E7=A4=BA/=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/core/providers/tts/base.py | 17 ++++++++++++++++- .../core/providers/tts/huoshan_double_stream.py | 6 +++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/main/xiaozhi-server/core/providers/tts/base.py b/main/xiaozhi-server/core/providers/tts/base.py index c2333db3..479ecf41 100644 --- a/main/xiaozhi-server/core/providers/tts/base.py +++ b/main/xiaozhi-server/core/providers/tts/base.py @@ -56,10 +56,18 @@ class TTSProviderBase(ABC): if self.correct_words: # 按key长度降序排列,长的先匹配,避免短词部分干扰 sorted_keys = sorted(self.correct_words.keys(), key=len, reverse=True) - pattern_str = '|'.join(re.escape(k) for k in sorted_keys) + pattern_str = "|".join(re.escape(k) for k in sorted_keys) self._correct_words_pattern = re.compile(pattern_str) + # 构建反向替换正则,用于将TTS服务返回的替换后文本还原为原始文本(字幕显示) + reverse_map = {v: k for k, v in self.correct_words.items()} + sorted_reverse_keys = sorted(reverse_map.keys(), key=len, reverse=True) + reverse_pattern_str = "|".join(re.escape(k) for k in sorted_reverse_keys) + self._reverse_words_pattern = re.compile(reverse_pattern_str) + self._reverse_words_map = reverse_map else: self._correct_words_pattern = None + self._reverse_words_pattern = None + self._reverse_words_map = None self.tts_text_buff = [] self.punctuations = ( @@ -339,6 +347,13 @@ class TTSProviderBase(ABC): if sentence_id in self._sentence_text_map: del self._sentence_text_map[sentence_id] + def _restore_original_text(self, text): + if not self._reverse_words_pattern or not text: + return text + return self._reverse_words_pattern.sub( + lambda m: self._reverse_words_map[m.group(0)], text + ) + # 这里默认是非流式的处理方式 # 流式处理方式请在子类中重写 def tts_text_priority_thread(self): diff --git a/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py b/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py index a6ecc21c..27a734d0 100644 --- a/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py +++ b/main/xiaozhi-server/core/providers/tts/huoshan_double_stream.py @@ -514,9 +514,9 @@ class TTSProvider(TTSProviderBase): json_data = json.loads(res.payload.decode("utf-8")) self.tts_text = json_data.get("text", "") logger.bind(tag=TAG).debug(f"句子语音生成开始: {self.tts_text}") - self.tts_audio_queue.put( - (SentenceType.FIRST, [], self.tts_text) - ) + # 将TTS服务返回的替换后文本还原为原始文本,用于字幕显示 + display_text = self._restore_original_text(self.tts_text) + self.tts_audio_queue.put((SentenceType.FIRST, [], display_text)) elif ( res.optional.event == EVENT_TTSResponse and res.header.message_type == AUDIO_ONLY_RESPONSE