mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-28 18:33:52 +08:00
Merge pull request #1500 from xinnan-tech/fix-stream-mem
Fix stream mem
This commit is contained in:
@@ -227,7 +227,7 @@ public interface Constant {
|
|||||||
/**
|
/**
|
||||||
* 版本号
|
* 版本号
|
||||||
*/
|
*/
|
||||||
public static final String VERSION = "0.5.4";
|
public static final String VERSION = "0.5.5";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 无效固件URL
|
* 无效固件URL
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
-- 智控台开启唤醒词加速
|
||||||
|
update `sys_params` set param_value = '你好小智;你好小志;小爱同学;你好小鑫;你好小新;小美同学;小龙小龙;喵喵同学;小滨小滨;小冰小冰;嘿你好呀' where param_code = 'wakeup_words';
|
||||||
|
update `sys_params` set param_value = 'true' where param_code = 'enable_wakeup_words_response_cache';
|
||||||
@@ -198,3 +198,10 @@ databaseChangeLog:
|
|||||||
- sqlFile:
|
- sqlFile:
|
||||||
encoding: utf8
|
encoding: utf8
|
||||||
path: classpath:db/changelog/202506051538.sql
|
path: classpath:db/changelog/202506051538.sql
|
||||||
|
- changeSet:
|
||||||
|
id: 202506080955
|
||||||
|
author: hrz
|
||||||
|
changes:
|
||||||
|
- sqlFile:
|
||||||
|
encoding: utf8
|
||||||
|
path: classpath:db/changelog/202506080955.sql
|
||||||
@@ -5,7 +5,7 @@ from config.config_loader import load_config
|
|||||||
from config.settings import check_config_file
|
from config.settings import check_config_file
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
SERVER_VERSION = "0.5.4"
|
SERVER_VERSION = "0.5.5"
|
||||||
_logger_initialized = False
|
_logger_initialized = False
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import json
|
|||||||
import random
|
import random
|
||||||
import asyncio
|
import asyncio
|
||||||
from core.utils.util import audio_to_data
|
from core.utils.util import audio_to_data
|
||||||
from core.handle.sendAudioHandle import send_stt_message
|
from core.handle.sendAudioHandle import sendAudioMessage, send_stt_message
|
||||||
from core.utils.util import remove_punctuation_and_length, opus_datas_to_wav_bytes
|
from core.utils.util import remove_punctuation_and_length, opus_datas_to_wav_bytes
|
||||||
from core.providers.tts.dto.dto import ContentType, SentenceType
|
from core.providers.tts.dto.dto import ContentType, SentenceType
|
||||||
from core.handle.mcpHandle import (
|
from core.handle.mcpHandle import (
|
||||||
@@ -74,8 +74,10 @@ async def checkWakeupWords(conn, text):
|
|||||||
# 播放唤醒词回复
|
# 播放唤醒词回复
|
||||||
conn.client_abort = False
|
conn.client_abort = False
|
||||||
opus_packets, _ = audio_to_data(response["file_path"])
|
opus_packets, _ = audio_to_data(response["file_path"])
|
||||||
conn.tts.tts_audio_queue.put((SentenceType.FIRST, opus_packets, response["text"]))
|
|
||||||
conn.tts.tts_audio_queue.put((SentenceType.LAST, [], None))
|
conn.logger.bind(tag=TAG).info(f"播放唤醒词回复: {response['text']}")
|
||||||
|
await sendAudioMessage(conn, SentenceType.FIRST, opus_packets, response["text"])
|
||||||
|
await sendAudioMessage(conn, SentenceType.LAST, [], None)
|
||||||
|
|
||||||
# 检查是否需要更新唤醒词回复
|
# 检查是否需要更新唤醒词回复
|
||||||
if time.time() - response["time"] > WAKEUP_CONFIG["refresh_time"]:
|
if time.time() - response["time"] > WAKEUP_CONFIG["refresh_time"]:
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ emoji_map = {
|
|||||||
|
|
||||||
async def sendAudioMessage(conn, sentenceType, audios, text):
|
async def sendAudioMessage(conn, sentenceType, audios, text):
|
||||||
# 发送句子开始消息
|
# 发送句子开始消息
|
||||||
|
conn.logger.bind(tag=TAG).info(f"发送音频消息: {sentenceType}, {text}")
|
||||||
if text is not None:
|
if text is not None:
|
||||||
emotion = analyze_emotion(text)
|
emotion = analyze_emotion(text)
|
||||||
emoji = emoji_map.get(emotion, "🙂") # 默认使用笑脸
|
emoji = emoji_map.get(emotion, "🙂") # 默认使用笑脸
|
||||||
|
|||||||
@@ -188,10 +188,8 @@ class TTSProvider(TTSProviderBase):
|
|||||||
|
|
||||||
def tts_text_priority_thread(self):
|
def tts_text_priority_thread(self):
|
||||||
"""火山引擎双流式TTS的文本处理线程"""
|
"""火山引擎双流式TTS的文本处理线程"""
|
||||||
logger.bind(tag=TAG).info("TTS文本处理线程启动")
|
|
||||||
while not self.conn.stop_event.is_set():
|
while not self.conn.stop_event.is_set():
|
||||||
try:
|
try:
|
||||||
logger.bind(tag=TAG).debug("等待TTS文本队列消息...")
|
|
||||||
message = self.tts_text_queue.get(timeout=1)
|
message = self.tts_text_queue.get(timeout=1)
|
||||||
logger.bind(tag=TAG).debug(
|
logger.bind(tag=TAG).debug(
|
||||||
f"收到TTS任务|{message.sentence_type.name} | {message.content_type.name} | 会话ID: {self.conn.sentence_id}"
|
f"收到TTS任务|{message.sentence_type.name} | {message.content_type.name} | 会话ID: {self.conn.sentence_id}"
|
||||||
|
|||||||
@@ -93,6 +93,8 @@ class TTSProvider(TTSProviderBase):
|
|||||||
self.processed_chars += len(full_text)
|
self.processed_chars += len(full_text)
|
||||||
else:
|
else:
|
||||||
self._process_before_stop_play_files()
|
self._process_before_stop_play_files()
|
||||||
|
else:
|
||||||
|
self._process_before_stop_play_files()
|
||||||
|
|
||||||
def to_tts_single_stream(self, text, is_last=False):
|
def to_tts_single_stream(self, text, is_last=False):
|
||||||
try:
|
try:
|
||||||
@@ -171,6 +173,8 @@ class TTSProvider(TTSProviderBase):
|
|||||||
self.pcm_buffer.clear()
|
self.pcm_buffer.clear()
|
||||||
opus_datas_cache = []
|
opus_datas_cache = []
|
||||||
|
|
||||||
|
self.tts_audio_queue.put((SentenceType.FIRST, [], text))
|
||||||
|
|
||||||
# 兼容 iter_chunked / iter_chunks / iter_any
|
# 兼容 iter_chunked / iter_chunks / iter_any
|
||||||
async for chunk in resp.content.iter_any():
|
async for chunk in resp.content.iter_any():
|
||||||
data = chunk[0] if isinstance(chunk, (list, tuple)) else chunk
|
data = chunk[0] if isinstance(chunk, (list, tuple)) else chunk
|
||||||
@@ -191,7 +195,7 @@ class TTSProvider(TTSProviderBase):
|
|||||||
if opus:
|
if opus:
|
||||||
if self.segment_count < 10: # 前10个片段直接发送
|
if self.segment_count < 10: # 前10个片段直接发送
|
||||||
self.tts_audio_queue.put(
|
self.tts_audio_queue.put(
|
||||||
(SentenceType.MIDDLE, opus, text)
|
(SentenceType.MIDDLE, opus, None)
|
||||||
)
|
)
|
||||||
self.segment_count += 1
|
self.segment_count += 1
|
||||||
else:
|
else:
|
||||||
@@ -206,7 +210,7 @@ class TTSProvider(TTSProviderBase):
|
|||||||
if self.segment_count < 10: # 前10个片段直接发送
|
if self.segment_count < 10: # 前10个片段直接发送
|
||||||
# 直接发送
|
# 直接发送
|
||||||
self.tts_audio_queue.put(
|
self.tts_audio_queue.put(
|
||||||
(SentenceType.MIDDLE, opus, text)
|
(SentenceType.MIDDLE, opus, None)
|
||||||
)
|
)
|
||||||
self.segment_count += 1
|
self.segment_count += 1
|
||||||
else:
|
else:
|
||||||
@@ -217,7 +221,7 @@ class TTSProvider(TTSProviderBase):
|
|||||||
# 如果不是前10个片段,发送缓存的数据
|
# 如果不是前10个片段,发送缓存的数据
|
||||||
if self.segment_count >= 10 and opus_datas_cache:
|
if self.segment_count >= 10 and opus_datas_cache:
|
||||||
self.tts_audio_queue.put(
|
self.tts_audio_queue.put(
|
||||||
(SentenceType.MIDDLE, opus_datas_cache, text)
|
(SentenceType.MIDDLE, opus_datas_cache, None)
|
||||||
)
|
)
|
||||||
|
|
||||||
# 如果是最后一段,输出音频获取完毕
|
# 如果是最后一段,输出音频获取完毕
|
||||||
|
|||||||
Reference in New Issue
Block a user