mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-22 07:03:53 +08:00
fix:修复使用替换词时,火山引擎双向流式tts的文本显示/上报问题
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user