mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-27 01:23:55 +08:00
fix:修复使用替换词时,火山引擎双向流式tts的文本显示/上报问题
This commit is contained in:
@@ -56,10 +56,18 @@ class TTSProviderBase(ABC):
|
|||||||
if self.correct_words:
|
if self.correct_words:
|
||||||
# 按key长度降序排列,长的先匹配,避免短词部分干扰
|
# 按key长度降序排列,长的先匹配,避免短词部分干扰
|
||||||
sorted_keys = sorted(self.correct_words.keys(), key=len, reverse=True)
|
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)
|
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:
|
else:
|
||||||
self._correct_words_pattern = None
|
self._correct_words_pattern = None
|
||||||
|
self._reverse_words_pattern = None
|
||||||
|
self._reverse_words_map = None
|
||||||
|
|
||||||
self.tts_text_buff = []
|
self.tts_text_buff = []
|
||||||
self.punctuations = (
|
self.punctuations = (
|
||||||
@@ -339,6 +347,13 @@ class TTSProviderBase(ABC):
|
|||||||
if sentence_id in self._sentence_text_map:
|
if sentence_id in self._sentence_text_map:
|
||||||
del self._sentence_text_map[sentence_id]
|
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):
|
def tts_text_priority_thread(self):
|
||||||
|
|||||||
@@ -514,9 +514,9 @@ class TTSProvider(TTSProviderBase):
|
|||||||
json_data = json.loads(res.payload.decode("utf-8"))
|
json_data = json.loads(res.payload.decode("utf-8"))
|
||||||
self.tts_text = json_data.get("text", "")
|
self.tts_text = json_data.get("text", "")
|
||||||
logger.bind(tag=TAG).debug(f"句子语音生成开始: {self.tts_text}")
|
logger.bind(tag=TAG).debug(f"句子语音生成开始: {self.tts_text}")
|
||||||
self.tts_audio_queue.put(
|
# 将TTS服务返回的替换后文本还原为原始文本,用于字幕显示
|
||||||
(SentenceType.FIRST, [], self.tts_text)
|
display_text = self._restore_original_text(self.tts_text)
|
||||||
)
|
self.tts_audio_queue.put((SentenceType.FIRST, [], display_text))
|
||||||
elif (
|
elif (
|
||||||
res.optional.event == EVENT_TTSResponse
|
res.optional.event == EVENT_TTSResponse
|
||||||
and res.header.message_type == AUDIO_ONLY_RESPONSE
|
and res.header.message_type == AUDIO_ONLY_RESPONSE
|
||||||
|
|||||||
Reference in New Issue
Block a user