From a2d827c055fbd932b46911b5e928a4789b9170d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Sun, 21 Sep 2025 16:00:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=93=E6=9D=9F=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processes.py | 325 ++++++++++++++++---------- control_system.py | 27 +-- logs/InputProcess_20250921_154603.log | 3 + logs/InputProcess_20250921_154743.log | 3 + test_first_playback.py | 177 ++++++++++++++ test_optimization.py | 173 ++++++++++++++ tts_test.mp3 | Bin 0 -> 149274 bytes verify_timeout.py | 40 ++++ 8 files changed, 608 insertions(+), 140 deletions(-) create mode 100644 logs/InputProcess_20250921_154603.log create mode 100644 logs/InputProcess_20250921_154743.log create mode 100644 test_first_playback.py create mode 100644 test_optimization.py create mode 100644 tts_test.mp3 create mode 100644 verify_timeout.py diff --git a/audio_processes.py b/audio_processes.py index c3bd385..de44915 100644 --- a/audio_processes.py +++ b/audio_processes.py @@ -106,7 +106,7 @@ class InputProcess: # TTS 工作线程 self.tts_worker_running = True self.tts_worker_thread = None - self.tts_task_queue = mp.Queue(maxsize=10) + self.tts_task_queue = mp.Queue(maxsize=20) # 增加到20个任务容量 # TTS 配置 self.tts_url = "https://openspeech.bytedance.com/api/v3/tts/unidirectional" @@ -463,13 +463,10 @@ class InputProcess: def _add_tts_task(self, content): """添加TTS任务到队列""" - print(f"🔊 OutputProcess添加TTS任务到队列: '{content[:30]}...' (队列大小: {self.tts_task_queue.qsize()})") try: self.tts_task_queue.put_nowait(("tts_sentence", content)) - print(f"✅ OutputProcess TTS任务添加成功,队列大小: {self.tts_task_queue.qsize()}") return True except queue.Full: - print(f"❌ OutputProcess TTS任务队列已满,丢弃任务") self.logger.warning("TTS任务队列已满,丢弃任务") return False @@ -543,7 +540,14 @@ class InputProcess: self.logger.info(progress) continue + if data.get("code", 0) == 0 and "sentence" in data and data["sentence"]: + # 处理句子信息 + continue + if data.get("code", 0) == 20000000: + # 真正的结束信号 + print(f"🎵 收到TTS流结束信号,总共处理了 {chunk_count} 个音频块") + print(f"🎵 总音频大小: {total_audio_size} 字节 ({total_audio_size/1024:.1f} KB)") break if data.get("code", 0) > 0: @@ -586,7 +590,7 @@ class OutputProcess: self.FORMAT = pyaudio.paInt16 self.CHANNELS = 1 self.RATE = 16000 - self.CHUNK_SIZE = 2048 # 增加缓冲区大小,减少卡顿 + self.CHUNK_SIZE = 1024 # 减小缓冲区大小,提高响应性 # 播放状态管理 - 借鉴 recorder.py 的状态管理模式 self.is_playing = False @@ -595,22 +599,25 @@ class OutputProcess: self.total_chunks_played = 0 self.total_audio_size = 0 self.last_playback_time = 0 # 最后播放时间戳 - self.playback_cooldown_period = 0.1 # 播放冷却时间(秒)- 防止回声,减少到0.1秒 + self.playback_cooldown_period = 0.05 # 播放冷却时间(秒)- 防止回声,减少到0.05秒 self.playback_completed = False # 播放完成标志 self.end_signal_received = False # 结束信号接收标志 # 智能缓冲系统 - 借鉴 recorder.py 的智能句子累积策略 self.preload_buffer = [] # 预加载缓冲区(保留用于音频块) - self.preload_size = 3 # 预加载3个音频块 + self.preload_size = 6 # 预加载6个音频块(增加缓冲减少卡顿) + + # 简化的音频系统 - 直接使用预加载缓冲区 + self.audio_queue_lock = None # 音频队列操作锁(在run方法中初始化) # 智能句子缓冲系统 - 从 recorder.py 借鉴的核心机制 self.tts_buffer = [] # 智能句子缓冲区 - self.tts_buffer_max_size = 3 # 最多缓冲3个句子 - self.tts_buffer_min_size = 1 # 最少1个句子 - self.tts_accumulation_time = 0.2 # 200ms积累窗口 + self.tts_buffer_max_size = 5 # 最多缓冲5个句子(增加缓冲减少卡顿) + self.tts_buffer_min_size = 2 # 最少2个句子(增加最小缓冲) + self.tts_accumulation_time = 0.15 # 150ms积累窗口(减少等待时间) self.tts_last_trigger_time = 0 # 上次触发TTS的时间 self.tts_pending_sentences = [] # 待处理的句子 - self.min_buffer_size = 1 # 最小缓冲区大小 + self.min_buffer_size = 2 # 最小缓冲区大小(增加最小缓冲) self.audio_device_healthy = True # 音频设备健康状态 @@ -623,6 +630,16 @@ class OutputProcess: self.playback_timeout = 5.0 # 播放超时时间(秒) self.completion_sent = False # 防止重复发送完成事件 + # 性能监控 + self.performance_stats = { + 'total_chunks_played': 0, + 'total_audio_size': 0, + 'avg_buffer_size': 0, + 'max_buffer_size': 0, + 'tts_wait_time': 0, + 'playback_delay': 0 + } + # 增强的播放完成检测状态 self.llm_generation_complete = False # LLM生成是否完成 self.tts_generation_complete = False # TTS生成是否完成 @@ -642,7 +659,7 @@ class OutputProcess: # TTS 工作线程 self.tts_worker_running = True self.tts_worker_thread = None - self.tts_task_queue = mp.Queue(maxsize=10) + self.tts_task_queue = mp.Queue(maxsize=20) # 增加到20个任务容量 # TTS 配置 self.tts_url = "https://openspeech.bytedance.com/api/v3/tts/unidirectional" @@ -681,7 +698,6 @@ class OutputProcess: max_wait_time = 10 # 最多等待10秒 wait_start_time = time.time() - print(f"🔊 播放工作线程等待音频设备就绪... audio={self.audio is not None}, running={self.running}") while (self.audio is None or not self.running) and (time.time() - wait_start_time) < max_wait_time: time.sleep(0.1) @@ -741,15 +757,11 @@ class OutputProcess: # 播放音频块 if chunks_played == 0: # 只在第一次播放时打印详细信息 print(f"🔊 开始播放音频块 {chunks_played + 1}") - print(f"🔍 播放工作线程检查: 音频块大小={len(audio_chunk)}字节, " - f"冷却期检查={in_cooldown}, 距离上次播放={time_since_last_play:.2f}s, " - f"冷却阈值={self.playback_cooldown_period}s") # 确保播放状态正确 if not self.currently_playing: self.currently_playing = True self.last_audio_chunk_time = time.time() # 记录最后播放时间 - print(f"🔊 播放工作线程:开始播放,设置 currently_playing = True") # 如果是第一次播放,不设置冷却期 if chunks_played == 0: @@ -762,6 +774,10 @@ class OutputProcess: chunks_played += 1 total_size += len(audio_chunk) + # 更新性能统计 + self.performance_stats['total_chunks_played'] += 1 + self.performance_stats['total_audio_size'] += len(audio_chunk) + # 减少进度显示频率 if chunks_played % 10 == 0 or chunks_played <= 3: progress = f"🔊 播放工作: {chunks_played} 块 | {total_size / 1024:.1f} KB" @@ -774,38 +790,45 @@ class OutputProcess: len(self.preload_buffer) == 0 and self.tts_task_queue.qsize() == 0 and not self.playback_completed): # 防止重复设置 - print(f"🔊 播放工作线程:播放完成,设置播放完成标志") - print(f"🔊 播放工作线程:播放缓冲={len(self.playback_buffer)}, 预加载={len(self.preload_buffer)}, TTS队列={self.tts_task_queue.qsize()}") self.playback_completed = True - print(f"🔊 播放工作线程:playback_completed标志已设置为{self.playback_completed}") # 不在这里直接调用_finish_playback,让主处理循环处理 else: # 空音频块,不改变播放状态,继续下一个 - print(f"🔊 播放工作线程:遇到空音频块,跳过") continue else: # 缓冲区为空,短暂休眠,减少CPU占用 - # 只有在确定没有音频播放时才设置状态为 False + # 只有在确定两个缓冲区都为空且没有音频播放时才设置状态为 False if self.currently_playing: - # 检查是否真的没有音频在播放 + # 检查是否真的没有音频在播放(同时检查两个缓冲区) time_since_last_chunk = time.time() - self.last_audio_chunk_time - if time_since_last_chunk > 0.5: # 超过0.5秒没有播放新音频 + # 只有在两个缓冲区都为空且超过1秒没有播放新音频时才停止播放 + if (len(self.playback_buffer) == 0 and + len(self.preload_buffer) == 0 and + time_since_last_chunk > 1.0): self.currently_playing = False - print(f"🔊 播放工作线程:缓冲区为空且{time_since_last_chunk:.1f}秒无新音频,设置 currently_playing = False") + elif len(self.playback_buffer) == 0 and len(self.preload_buffer) > 0: + # 播放缓冲区为空但预加载缓冲区有数据,自动转移数据 + transfer_count = min(3, len(self.preload_buffer)) # 一次转移3个块 + for _ in range(transfer_count): + if self.preload_buffer: + self.playback_buffer.append(self.preload_buffer.pop(0)) + # 保持 currently_playing 为 True,因为有新数据要播放 time.sleep(0.01) continue except Exception as e: print(f"❌ 播放工作线程错误: {e}") self.logger.error(f"播放工作线程错误: {e}") - # 异常情况下,只有在确定音频停止播放时才重置状态 + # 异常情况下,只有在确定两个缓冲区都为空且音频停止播放时才重置状态 if self.currently_playing: time_since_last_chunk = time.time() - self.last_audio_chunk_time - if time_since_last_chunk > 1.0: # 异常情况下,等待更长时间 + if (len(self.playback_buffer) == 0 and + len(self.preload_buffer) == 0 and + time_since_last_chunk > 1.5): # 异常情况下,等待更长时间且确保缓冲区为空 self.currently_playing = False - print(f"🔊 播放工作线程:异常情况下设置 currently_playing = False") else: - print(f"🔊 播放工作线程:异常但保持 currently_playing = True(最后播放于{time_since_last_chunk:.1f}秒前)") + # 保持播放状态,继续处理 + pass time.sleep(0.1) print(f"\n✅ 播放工作线程结束: 总计 {chunks_played} 块, {total_size / 1024:.1f} KB") @@ -814,7 +837,6 @@ class OutputProcess: # 线程结束时确保状态正确 if self.currently_playing: self.currently_playing = False - print(f"🔊 播放工作线程:线程结束,设置 currently_playing = False") if playback_stream: try: playback_stream.stop_stream() @@ -836,12 +858,19 @@ class OutputProcess: self.logger.info("输出进程启动") self._setup_audio() + # 初始化线程锁(必须在run方法中初始化,避免pickle错误) + self.audio_queue_lock = threading.Lock() + try: while self.running: # 1. 处理音频队列(数据接收) self._process_audio_queue() - # 2. 检查设备健康状态和冷却期 - 防止回声 + # 2. 检查播放状态 + if self.end_signal_received: + self._check_playback_completion() + + # 3. 检查设备健康状态和冷却期 - 防止回声 current_time = time.time() time_since_last_play = current_time - self.last_playback_time in_cooldown = (self.last_playback_time > 0 and @@ -874,7 +903,6 @@ class OutputProcess: if self.end_signal_received: # 使用增强的播放完成检测 if self._check_enhanced_playback_completion(): - print(f"📥 播放状态时增强播放完成检测通过,处理结束信号") self._finish_playback() time.sleep(0.1) # 播放时增加延迟减少CPU使用 @@ -891,14 +919,14 @@ class OutputProcess: self.last_playback_time = time.time() print(f"🎵 主循环检测:开始播放预加载音频,播放缓冲区大小: {len(self.playback_buffer)}") - # 4. 显示播放进度 + # 4. 显示播放进度和性能监控 self._show_progress() + self._update_performance_stats() # 5. 主动检查播放完成(无论什么状态都要检查) if self.end_signal_received: # 使用增强的播放完成检测 if self._check_enhanced_playback_completion(): - print(f"📥 主循环增强播放完成检测通过,处理结束信号") self._finish_playback() # 6. 借鉴 recorder.py: 根据播放状态调整休眠时间,优化性能 @@ -983,7 +1011,6 @@ class OutputProcess: # 使用增强的播放完成检测 if self._check_enhanced_playback_completion(): - print(f"📥 增强播放完成检测通过,处理结束信号") self._finish_playback() return else: @@ -1067,12 +1094,7 @@ class OutputProcess: print(f"📥 输出进程收到音频数据: {len(audio_data)} 字节") # 直接添加到预加载缓冲区 - print(f"🔍 添加音频到预加载缓冲区: 音频大小={len(audio_data)}字节, " - f"添加前预加载缓冲区大小={len(self.preload_buffer)}, " - f"添加前播放缓冲区大小={len(self.playback_buffer)}, " - f"is_playing={self.is_playing}") self.preload_buffer.append(audio_data) - print(f"🔍 添加后预加载缓冲区大小={len(self.preload_buffer)}") # 检查是否应该开始播放或补充播放缓冲区 if not self.is_playing and len(self.preload_buffer) >= self.preload_size: @@ -1083,20 +1105,17 @@ class OutputProcess: self.last_playback_time = 0 # 重置播放时间,避免立即触发冷却期 # 确保播放工作线程知道有数据要播放 if not self.currently_playing: - print(f"🔍 启动播放时确保 currently_playing = True") # 播放工作线程会自动检测播放缓冲区并开始播放 + pass print(f"🎵 开始播放音频(预加载完成),播放缓冲区大小: {len(self.playback_buffer)}") - print(f"🔍 已重置last_playback_time,避免立即触发冷却期") - elif self.is_playing and len(self.playback_buffer) < 3 and len(self.preload_buffer) > 0: - # 正在播放时,保持播放缓冲区有足够的数据 - transfer_count = min(2, len(self.preload_buffer)) # 每次转移2个块 + elif self.is_playing and len(self.playback_buffer) < 4 and len(self.preload_buffer) > 0: + # 正在播放时,保持播放缓冲区有足够的数据(增加到4个块) + transfer_count = min(3, len(self.preload_buffer)) # 每次转移3个块 for _ in range(transfer_count): if self.preload_buffer: self.playback_buffer.append(self.preload_buffer.pop(0)) - print(f"🔍 播放中补充数据: 转移{transfer_count}个块,播放缓冲区={len(self.playback_buffer)}, 预加载={len(self.preload_buffer)}") elif end_signal_received and not self.is_playing and len(self.playback_buffer) == 0 and len(self.preload_buffer) > 0: # 关键修复:收到结束信号后,如果播放缓冲区为空但预加载缓冲区有数据,强制转移 - print(f"🔍 结束信号模式下强制转移数据: 预加载缓冲区有 {len(self.preload_buffer)} 个数据块") self.playback_buffer.extend(self.preload_buffer) self.preload_buffer.clear() self.is_playing = True @@ -1111,11 +1130,9 @@ class OutputProcess: if end_signal_received: # 使用增强的播放完成检测 if self._check_enhanced_playback_completion(): - print(f"📥 队列空时增强播放完成检测通过,处理结束信号") self._finish_playback() return else: - print(f"📥 队列空时增强播放完成检测未通过,继续等待") # 如果还有数据要播放,继续等待 tts_queue_size = self.tts_task_queue.qsize() playback_queue_size = len(self.playback_buffer) + len(self.preload_buffer) @@ -1151,7 +1168,6 @@ class OutputProcess: for _ in range(transfer_count): if self.preload_buffer: self.playback_buffer.append(self.preload_buffer.pop(0)) - print(f"🔍 队列空时补充数据: 转移{transfer_count}个块,播放缓冲区={len(self.playback_buffer)}, 预加载={len(self.preload_buffer)}") # 退出循环,避免过度占用CPU if processed_count > 0: @@ -1161,7 +1177,6 @@ class OutputProcess: if self.end_signal_received: # 使用增强的播放完成检测 if self._check_enhanced_playback_completion(): - print(f"📥 无数据处理时增强播放完成检测通过,处理结束信号") self._finish_playback() time.sleep(0.01) @@ -1215,6 +1230,7 @@ class OutputProcess: print("📡 输出进程:开始执行播放完成逻辑") + self.is_playing = False self.playback_buffer.clear() self.preload_buffer.clear() @@ -1267,27 +1283,16 @@ class OutputProcess: tts_queue_size = self.tts_task_queue.qsize() - print(f"🔍 增强播放完成检查:") - print(f" - LLM生成完成: {self.llm_generation_complete}") - print(f" - TTS生成完成: {self.tts_generation_complete}") - print(f" - 所有音频已接收: {self.all_audio_received}") - print(f" - 预缓冲区为空: {self.pre_buffer_empty}") - print(f" - 播放缓冲区为空: {self.playback_buffer_empty}") - print(f" - 无活跃播放: {self.no_active_playback} (currently_playing={self.currently_playing})") - print(f" - TTS队列大小: {tts_queue_size}") # 添加时间维度检查 if self.last_audio_chunk_time > 0: time_since_last_chunk = time.time() - self.last_audio_chunk_time - print(f" - 最后播放时间: {time_since_last_chunk:.2f}秒前") else: time_since_last_chunk = 0 - print(f" - 最后播放时间: 尚未开始播放") # 检查TTS是否正在生成 - 新增条件 # TTS正在生成的条件:队列中有任务 或 TTS生成未完成 或 还有待处理的缓冲区内容 tts_is_generating = (tts_queue_size > 0 or not self.tts_generation_complete or len(self.tts_buffer) > 0) - print(f" - TTS正在生成: {tts_is_generating} (队列:{tts_queue_size}, 完成:{self.tts_generation_complete}, 缓冲:{len(self.tts_buffer)})") # 检查是否所有条件都满足 - 使用更新的状态变量,添加TTS生成状态检查 all_conditions_met = ( @@ -1378,7 +1383,6 @@ class OutputProcess: # 如果TTS还未完成,但LLM已完成,等待TTS完成 if not self.tts_generation_complete: - print(f"⏳ 等待TTS生成完成...") return False # 如果音频还未完全接收,等待接收完成 @@ -1388,39 +1392,37 @@ class OutputProcess: return False + def _check_playback_completion(self): - """检查播放完成状态 - 独立的播放完成检测方法""" + """简化的播放完成状态检查""" if not self.end_signal_received: return tts_queue_size = self.tts_task_queue.qsize() playback_queue_size = len(self.playback_buffer) + len(self.preload_buffer) - print(f"🔍 播放完成检查: TTS队列={tts_queue_size}, 播放缓冲={len(self.playback_buffer)}, 预加载={len(self.preload_buffer)}, 正在播放={self.currently_playing}, 播放完成标志={self.playback_completed}") + # 调试日志:播放完成状态 + print(f"🔍 播放完成检查:") + print(f" - end_signal_received: {self.end_signal_received}") + print(f" - tts_queue_size: {tts_queue_size}") + print(f" - playback_buffer: {len(self.playback_buffer)}") + print(f" - preload_buffer: {len(self.preload_buffer)}") + print(f" - currently_playing: {self.currently_playing}") + print(f" - playback_completed: {self.playback_completed}") + print(f" - completion_sent: {self.completion_sent}") - # 检查条件1: 播放完成标志被设置 - if self.playback_completed: - print(f"✅ 检测到播放完成标志,触发播放完成") - print(f"📥 调用 _finish_playback() 前,completion_sent={self.completion_sent}") - self._finish_playback() - print(f"📥 调用 _finish_playback() 后,completion_sent={self.completion_sent}") - # 重要:重置播放完成标志,防止重复触发 - self.playback_completed = False - print(f"📥 已重置播放完成标志,防止重复触发") - return - - # 检查条件2: 所有队列为空且没有在播放 + # 检查条件:所有队列为空且没有在播放 if tts_queue_size == 0 and playback_queue_size == 0 and not self.currently_playing: print(f"✅ 所有队列已清空且播放器空闲,触发播放完成") print(f"📥 调用 _finish_playback() 前,completion_sent={self.completion_sent}") self._finish_playback() print(f"📥 调用 _finish_playback() 后,completion_sent={self.completion_sent}") - # 重要:重置结束信号标志,防止重复触发 + # 重置结束信号标志,防止重复触发 self.end_signal_received = False print(f"📥 已重置结束信号标志,防止重复触发") return - # 检查条件3: 所有队列为空但播放器还在播放(最后一个音频块) + # 检查条件:所有队列为空但播放器还在播放(最后一个音频块) if tts_queue_size == 0 and playback_queue_size == 0 and self.currently_playing: print(f"⏳ 等待最后一个音频块播放完成...") time.sleep(0.3) @@ -1429,7 +1431,7 @@ class OutputProcess: print(f"📥 调用 _finish_playback() 前,completion_sent={self.completion_sent}") self._finish_playback() print(f"📥 调用 _finish_playback() 后,completion_sent={self.completion_sent}") - # 重要:重置结束信号标志,防止重复触发 + # 重置结束信号标志,防止重复触发 self.end_signal_received = False print(f"📥 已重置结束信号标志,防止重复触发") return @@ -1492,7 +1494,7 @@ class OutputProcess: task_type, content = task if task_type == "tts_sentence": - # 生成音频数据并发送到统一播放队列 + # 生成音频数据并发送到播放队列 self._generate_tts_audio(content) except queue.Empty: @@ -1503,31 +1505,26 @@ class OutputProcess: def _add_tts_task(self, content): """添加TTS任务到队列""" - print(f"🔊 OutputProcess添加TTS任务到队列: '{content[:30]}...' (队列大小: {self.tts_task_queue.qsize()})") try: self.tts_task_queue.put_nowait(("tts_sentence", content)) - print(f"✅ OutputProcess TTS任务添加成功,队列大小: {self.tts_task_queue.qsize()}") return True except queue.Full: - print(f"❌ OutputProcess TTS任务队列已满,丢弃任务") self.logger.warning("TTS任务队列已满,丢弃任务") return False def _generate_tts_audio(self, text): """生成TTS音频数据并发送到统一播放队列 - 借鉴 recorder.py 的流式处理""" try: - print(f"🔊 TTS开始生成音频,文本长度: {len(text)} 文本内容: {text[:50]}...") - self.logger.info(f"生成TTS音频: {text[:50]}...") + print(f"🎵 OutputProcess开始生成TTS音频: {text[:50]}...") + print(f"🎵 文本总长度: {len(text)} 字符") - # 清空所有缓冲区,确保新的音频不被旧数据干扰 - self.playback_buffer.clear() - self.preload_buffer.clear() - self.is_playing = False - self.completion_sent = False # 重置完成标记 + # 简化:直接使用预加载缓冲区 + print(f"🎵 开始生成TTS音频,将直接添加到预加载缓冲区") - # 重置TTS生成完成状态 - 关键修复 + # 重置播放状态 + self.completion_sent = False + self._last_audio_size = 0 self.tts_generation_complete = False - print(f"🔊 已重置TTS生成完成状态为False,开始新的TTS生成") # 构建请求头 headers = { @@ -1565,12 +1562,14 @@ class OutputProcess: self.logger.error(f"TTS请求失败: {response.status_code}") return False + print(f"🎵 TTS请求成功,状态码: {response.status_code}") + # 处理流式响应 - 借鉴 recorder.py 的优化策略 total_audio_size = 0 chunk_count = 0 success_count = 0 - self.logger.info("开始接收TTS音频流...") + print(f"🎵 开始接收TTS音频流...") for chunk in response.iter_lines(decode_unicode=True): if not chunk: @@ -1578,19 +1577,29 @@ class OutputProcess: try: data = json.loads(chunk) - if data.get("code", 0) == 0 and "data" in data and data["data"]: chunk_audio = base64.b64decode(data["data"]) audio_size = len(chunk_audio) total_audio_size += audio_size chunk_count += 1 - # 借鉴 recorder.py: 使用预加载缓冲区机制 + # 检查音频数据是否异常小 + if audio_size < 100: + print(f"⚠️ 警告:音频块 {chunk_count} 大小异常小: {audio_size} 字节") + + # 检查是否连续收到小音频块(但不警告最后一个块,通常较小) + if hasattr(self, '_last_audio_size') and self._last_audio_size > 0 and chunk_count < 15: # 不检查最后几个块 + if audio_size < self._last_audio_size * 0.5: + print(f"⚠️ 警告:音频块 {chunk_count} 大小突然减小: {self._last_audio_size} -> {audio_size}") + self._last_audio_size = audio_size + + # 简化:直接添加到预加载缓冲区 try: self.preload_buffer.append(chunk_audio) success_count += 1 - # 检查是否应该开始播放(借鉴 recorder.py 的预加载策略) + + # 检查是否应该开始播放 if (not self.is_playing and len(self.preload_buffer) >= self.preload_size): # 将预加载的数据移到播放缓冲区 @@ -1601,12 +1610,9 @@ class OutputProcess: self.logger.info("开始播放TTS音频(预加载完成)") # 减少进度显示频率 - if chunk_count % 20 == 0: # 减少显示频率 - progress = (f"生成音频: {chunk_count} 块 | 成功: {success_count} | " - f"{total_audio_size / 1024:.1f} KB | " - f"预加载: {len(self.preload_buffer)} | " - f"播放缓冲: {len(self.playback_buffer)}") - self.logger.info(progress) + if chunk_count % 50 == 0: # 进一步减少显示频率 + progress = (f"🎵 TTS生成中: {chunk_count} 块 | {total_audio_size / 1024:.1f} KB") + print(f"\r{progress}", end='', flush=True) except Exception as e: self.logger.error(f"添加音频到预加载缓冲区失败: {e}") @@ -1614,7 +1620,14 @@ class OutputProcess: continue + if data.get("code", 0) == 0 and "sentence" in data and data["sentence"]: + # 处理句子信息 + continue + if data.get("code", 0) == 20000000: + # 真正的结束信号 + print(f"🎵 收到TTS流结束信号,总共处理了 {chunk_count} 个音频块") + print(f"🎵 总音频大小: {total_audio_size} 字节 ({total_audio_size/1024:.1f} KB)") break if data.get("code", 0) > 0: @@ -1625,7 +1638,6 @@ class OutputProcess: continue # 处理剩余的预加载数据 - print(f"🔊 TTS生成结束,检查剩余预加载数据: preload_buffer={len(self.preload_buffer)} 块") if self.preload_buffer: print(f"🔊 将剩余的 {len(self.preload_buffer)} 个音频块转移到播放缓冲区") self.playback_buffer.extend(self.preload_buffer) @@ -1638,15 +1650,13 @@ class OutputProcess: print(f"⚠️ TTS生成完成但预加载缓冲区为空!") success_rate = (success_count / chunk_count * 100) if chunk_count > 0 else 0 - print(f"🔊 TTS音频生成完成统计: chunk_count={chunk_count}, success_count={success_count}, success_rate={success_rate:.1f}%, total_size={total_audio_size / 1024:.1f} KB") self.logger.info(f"TTS音频生成完成: {chunk_count} 块, 成功率 {success_rate:.1f}% | 总大小: {total_audio_size / 1024:.1f} KB") # 通知自己TTS生成已完成 self.tts_generation_complete = True print(f"🎵 OutputProcess TTS生成已完成") - # 注意:不在这里直接调用等待播放完成,让统一的增强播放完成检测机制处理 - # 这样可以避免在TTS还在生成后续音频时就误判播放完成 + # 简化:直接使用统一播放完成检测机制 self.logger.info("TTS生成完成,等待统一播放完成检测机制处理...") return success_count > 0 @@ -1662,9 +1672,54 @@ class OutputProcess: # ========== 智能句子缓冲系统 - 从 recorder.py 借鉴 ========== def _should_trigger_tts(self, sentence): - """智能判断是否应该触发TTS - 借鉴 recorder.py 的策略""" + """智能判断是否应该触发TTS - 确保首句足够长且积累足够内容""" current_time = time.time() + # 修改策略:允许合理的TTS并行生成,但控制队列长度 + tts_queue_size = self.tts_task_queue.qsize() + if tts_queue_size >= 3: # 允许最多3个TTS任务在队列中 + print(f"🎵 TTS队列达到上限: 当前队列大小={tts_queue_size}, 暂时跳过") + return False + + # 首次播放的特殊处理:确保有足够内容 + if not hasattr(self, '_first_playback_started') or not self._first_playback_started: + total_buffered_text = ''.join(self.tts_buffer) + sentence + + # 首次播放必须满足以下条件之一: + # 1. 总文本长度超过40字符且至少有2个句子 + if len(total_buffered_text) >= 40 and len(self.tts_buffer) >= 1: + print(f"🎵 首次播放触发:总长度{len(total_buffered_text)}字符,{len(self.tts_buffer)+1}个句子") + self._first_playback_started = True + return True + # 2. 有1个完整长句子(超过25字符) + elif len(sentence) >= 25 and self._is_complete_sentence(sentence) and len(self.tts_buffer) >= 1: + print(f"🎵 首次播放触发:长句子{len(sentence)}字符+缓冲内容") + self._first_playback_started = True + return True + # 3. 缓冲区达到最大值 + elif len(self.tts_buffer) >= self.tts_buffer_max_size: + print(f"🎵 首次播放触发:缓冲区达到最大值{len(self.tts_buffer)}") + self._first_playback_started = True + return True + # 4. 超过5秒还没触发(防止无限等待) + elif hasattr(self, '_first_text_time') and (current_time - self._first_text_time) > 5.0: + print(f"🎵 首次播放触发:超时5秒,当前长度{len(total_buffered_text)}字符") + self._first_playback_started = True + return True + else: + # 首次播放前记录第一个文本的时间 + if not hasattr(self, '_first_text_time'): + self._first_text_time = current_time + return False + + # 非首次播放的正常逻辑 + + # 再次检查TTS队列状态(防止在首次播放检查后队列又有变化) + tts_queue_size = self.tts_task_queue.qsize() + if tts_queue_size >= 3: # 保持一致的队列限制 + print(f"🎵 TTS队列达到上限(非首次): 当前队列大小={tts_queue_size}, 暂时跳过") + return False + # 检查缓冲区大小 if len(self.tts_buffer) >= self.tts_buffer_max_size: return True @@ -1678,24 +1733,26 @@ class OutputProcess: if self._is_complete_sentence(sentence): return True - # 检查句子特征 - 长句子优先(50字符以上) - if len(sentence) > 50: # 超过50字符的句子立即触发 + # 检查句子特征 - 优化:降低长句子触发阈值(30字符以上) + if len(sentence) > 30: # 超过30字符的句子立即触发 return True - # 中等长度句子(30-50字符)如果有结束标点也触发 - if len(sentence) > 30: + # 中等长度句子(20-30字符)如果有结束标点也触发 + if len(sentence) > 20: end_punctuations = ['。', '!', '?', '.', '!', '?'] if any(sentence.strip().endswith(p) for p in end_punctuations): return True + # 优化:即使短句子,如果缓冲区有内容且时间过半也触发 + if len(self.tts_buffer) > 0 and time_since_last >= (self.tts_accumulation_time * 0.7): + return True + # 短句子只在缓冲区较多或时间窗口到期时触发 return False def _process_tts_buffer(self): """处理TTS缓冲区 - 发送累积的句子到TTS""" - print(f"🔊 处理TTS缓冲区,当前缓冲区内容: {self.tts_buffer}") if not self.tts_buffer: - print(f"🔊 TTS缓冲区为空,跳过处理") return # 合并缓冲区的句子 @@ -1704,10 +1761,8 @@ class OutputProcess: # 重置TTS生成完成状态 - 关键修复 self.tts_generation_complete = False - print(f"🔊 触发新TTS任务,已重置TTS生成完成状态为False") # 添加到TTS任务队列 - print(f"🔊 尝试添加TTS任务到队列") if self._add_tts_task(combined_text): print(f"🎵 触发TTS: {combined_text[:50]}...") self.tts_last_trigger_time = time.time() @@ -1716,23 +1771,18 @@ class OutputProcess: # 清空缓冲区 self.tts_buffer.clear() - print(f"🔊 TTS缓冲区已清空") def _add_sentence_to_buffer(self, sentence): """添加句子到智能缓冲区 - 核心方法""" - print(f"🔊 添加句子到TTS缓冲区: '{sentence}' (缓冲区大小: {len(self.tts_buffer)} -> {len(self.tts_buffer)+1})") if not sentence.strip(): print(f"🔊 句子为空,不添加到缓冲区") return self.tts_buffer.append(sentence) - print(f"🔊 已添加到TTS缓冲区,当前缓冲区: {self.tts_buffer}") # 检查是否应该触发TTS should_trigger = self._should_trigger_tts(sentence) - print(f"🔊 是否应该触发TTS: {should_trigger}") if should_trigger: - print(f"🔊 触发TTS缓冲区处理") self._process_tts_buffer() def _flush_tts_buffer(self): @@ -1830,6 +1880,11 @@ class OutputProcess: self.all_audio_received = False self.end_signal_received = False self.completion_sent = False + # 重置首次播放状态 + self._first_playback_started = False + if hasattr(self, '_first_text_time'): + delattr(self, '_first_text_time') + print(f"🔊 已重置首次播放状态,新的对话将重新积累内容") # 使用智能句子缓冲系统 print(f"🔊 添加文本到智能缓冲区") @@ -1852,6 +1907,10 @@ class OutputProcess: self.all_audio_received = False self.end_signal_received = False self.completion_sent = False + # 重置首次播放状态 + self._first_playback_started = False + if hasattr(self, '_first_text_time'): + delattr(self, '_first_text_time') print(f"🔊 处理完整文本:已重置所有播放完成检测状态") # 直接添加到缓冲区并强制处理 @@ -1860,6 +1919,30 @@ class OutputProcess: # ========== 原有方法保持不变 ========== + def _update_performance_stats(self): + """更新性能统计信息""" + current_buffer_size = len(self.playback_buffer) + len(self.preload_buffer) + self.performance_stats['avg_buffer_size'] = ( + self.performance_stats['avg_buffer_size'] * 0.9 + current_buffer_size * 0.1 + ) + if current_buffer_size > self.performance_stats['max_buffer_size']: + self.performance_stats['max_buffer_size'] = current_buffer_size + + # 每5秒打印一次性能统计 + if hasattr(self, '_last_stats_time'): + if time.time() - self._last_stats_time >= 5.0: + self._print_performance_stats() + self._last_stats_time = time.time() + else: + self._last_stats_time = time.time() + + def _print_performance_stats(self): + """打印性能统计信息""" + stats = self.performance_stats + print(f"📊 性能统计: 平均缓冲={stats['avg_buffer_size']:.1f}, " + f"最大缓冲={stats['max_buffer_size']}, 已播放={stats['total_chunks_played']}块, " + f"音频大小={stats['total_audio_size']/1024:.1f}KB") + def process_tts_request(self, text): """处理TTS请求的公共接口 - 兼容原有接口""" # 使用新的智能缓冲系统 diff --git a/control_system.py b/control_system.py index 5dafecb..8d10e9c 100644 --- a/control_system.py +++ b/control_system.py @@ -329,7 +329,6 @@ class ControlSystem: if event.event_type == 'playback_complete': print("📡 主控制:收到播放完成事件") - print(f"📡 主控制:事件详情 - 类型: {event.event_type}, 元数据: {event.metadata}") self._handle_playback_complete(event) except queue.Empty: @@ -356,17 +355,12 @@ class ControlSystem: def _handle_playback_complete(self, event: ProcessEvent): """处理播放完成事件""" - print(f"📡 主控制:开始处理播放完成事件") - print(f"📡 主控制:当前状态 = {self.state.value}") - print(f"📡 主控制:事件元数据 = {event.metadata}") # 标记播放完成 self.playback_complete = True - print(f"📡 主控制:已设置 playback_complete = True") # 更新统计 self.stats['total_conversations'] += 1 - print(f"📡 主控制:已更新统计,对话数 = {self.stats['total_conversations']}") # 切换到空闲状态,但先不启用录音 old_state = self.state.value @@ -376,7 +370,6 @@ class ControlSystem: print(f"🎯 状态:{old_state} → IDLE") # 延迟重新启用录音,确保音频设备完全停止 - print(f"📡 主控制:延迟重新启用录音,避免录制到回声...") # 延迟启用录音的函数 def delayed_enable_recording(): @@ -389,14 +382,11 @@ class ControlSystem: # 检查输出队列是否还有音频数据 output_queue_size = self.output_audio_queue.qsize() if output_queue_size > 0: - print(f"📡 主控制:检测到输出队列仍有 {output_queue_size} 个音频块,继续等待...") time.sleep(1.0) # 重新启用输入进程录音功能 try: self.input_command_queue.put(ControlCommand('enable_recording')) - print(f"📡 主控制:延迟发送 enable_recording 命令到输入进程") - print(f"📡 主控制:输入进程已重新启用,可以开始新的录音") # 更新状态为录音状态 self.state = RecordingState.RECORDING print(f"🎯 状态:IDLE → RECORDING(延迟启用)") @@ -406,7 +396,6 @@ class ControlSystem: # 在新线程中延迟启用录音 threading.Thread(target=delayed_enable_recording, daemon=True).start() - print(f"📡 主控制:播放完成事件处理完成,将在后台延迟启用录音") def _process_audio_pipeline(self): """处理音频流水线:STT + LLM + TTS""" @@ -443,8 +432,7 @@ class ControlSystem: return # 在禁用LLM的情况下,也需要发送完成信号 - print("📡 主控制:禁用LLM模式下发送完成信号") - # 由于LLM未启用,直接发送LLM完成信号 + # 由于LLM未启用,直接发送LLM完成信号 self._notify_llm_complete() # 发送TTS完成信号 tts_complete_command = "TTS_COMPLETE:" @@ -475,7 +463,6 @@ class ControlSystem: self.playback_complete = True # 发送完成信号,防止输出进程等待 - print("📡 主控制:失败处理模式下发送完成信号") try: # 发送LLM完成信号 self._notify_llm_complete() @@ -484,7 +471,6 @@ class ControlSystem: self.output_audio_queue.put(tts_complete_command) # 发送结束信号 self.output_audio_queue.put(None) - print("📡 主控制:已发送失败处理完成信号") except Exception as e: print(f"❌ 发送失败处理信号失败: {e}") @@ -1024,9 +1010,7 @@ class ControlSystem: # 在流式模式下,只发送结束信号,不发送TTS完成信号 # 让OutputProcess在真正完成TTS生成时自己设置TTS完成状态 - print("📡 主控制:流式模式下发送结束信号") self.output_audio_queue.put(None) - print("📡 主控制:已发送流式模式结束信号") return accumulated_text != "" @@ -1077,7 +1061,6 @@ class ControlSystem: # 发送LLM完成信号 llm_complete_command = "LLM_COMPLETE:" self.output_audio_queue.put(llm_complete_command) - print("📡 主控制:已发送LLM生成完成信号") return True except Exception as e: print(f"❌ 发送LLM完成信号失败: {e}") @@ -1246,8 +1229,14 @@ class ControlSystem: progress = f"📥 TTS生成: {chunk_count} 块 | {total_audio_size / 1024:.1f} KB" print(f"\r{progress}", end='', flush=True) + elif data.get("code", 0) == 0 and "sentence" in data and data["sentence"]: + # 处理句子信息 - 新增 + sentence_info = data["sentence"] + print(f"📝 TTS句子信息: {sentence_info}") + continue + elif data.get("code", 0) == 20000000: - print(f"🏁 收到TTS结束信号") + print(f"🏁 收到TTS流结束信号") break elif data.get("code", 0) > 0: print(f"❌ TTS错误响应: {data}") diff --git a/logs/InputProcess_20250921_154603.log b/logs/InputProcess_20250921_154603.log new file mode 100644 index 0000000..9231cb8 --- /dev/null +++ b/logs/InputProcess_20250921_154603.log @@ -0,0 +1,3 @@ +2025-09-21 15:46:03 - InputProcess_logger - INFO - 日志系统初始化完成 - 进程: InputProcess +2025-09-21 15:46:03 - InputProcess_logger - INFO - 日志文件: logs/InputProcess_20250921_154603.log +2025-09-21 15:46:03 - InputProcess_logger - INFO - [InputProcess] TTS工作线程已启动 diff --git a/logs/InputProcess_20250921_154743.log b/logs/InputProcess_20250921_154743.log new file mode 100644 index 0000000..2f01639 --- /dev/null +++ b/logs/InputProcess_20250921_154743.log @@ -0,0 +1,3 @@ +2025-09-21 15:47:43 - InputProcess_logger - INFO - 日志系统初始化完成 - 进程: InputProcess +2025-09-21 15:47:43 - InputProcess_logger - INFO - 日志文件: logs/InputProcess_20250921_154743.log +2025-09-21 15:47:43 - InputProcess_logger - INFO - [InputProcess] TTS工作线程已启动 diff --git a/test_first_playback.py b/test_first_playback.py new file mode 100644 index 0000000..69c2333 --- /dev/null +++ b/test_first_playback.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +首次播放逻辑专项测试 +验证第一句TTS触发机制的优化效果 +""" + +import sys + +def test_first_playback_logic(): + """测试首次播放逻辑""" + print("🎵 首次播放逻辑专项测试") + print("=" * 50) + + # 测试场景1: 短句子积累 + print("📝 测试场景1: 短句子积累") + print(" 模拟LLM生成的短句子流:") + + short_sentences = [ + "你好", + "嗯", + "这个", + "问题", + "确实", + "需要", + "仔细", + "思考", + ] + + buffer = [] + total_length = 0 + first_trigger = None + + for i, sentence in enumerate(short_sentences): + buffer.append(sentence) + total_length = sum(len(s) for s in buffer) + + # 模拟首次播放逻辑 + trigger_reason = None + if total_length >= 40 and len(buffer) >= 2: + trigger_reason = f"总长度{total_length}字符,{len(buffer)}个句子" + elif len(buffer) >= 5: + trigger_reason = f"缓冲区达到最大值{len(buffer)}" + + if trigger_reason and first_trigger is None: + first_trigger = i + 1 + print(f" 🎵 第{first_trigger}句触发TTS: {trigger_reason}") + print(f" 📝 发送内容: '{''.join(buffer)}'") + break + else: + print(f" ⏳ 第{i+1}句: '{sentence}' (累计: {total_length}字符, {len(buffer)}个句子)") + + if first_trigger is None: + print(" ⚠️ 未触发TTS(需要超时机制)") + print() + + # 测试场景2: 中等长度句子 + print("📝 测试场景2: 中等长度句子") + medium_sentences = [ + "你好,很高兴见到你。", + "今天天气真不错呢。", + "我们可以一起去公园玩吗?", + "我想那会是一个很好的主意。", + ] + + buffer = [] + total_length = 0 + first_trigger = None + + for i, sentence in enumerate(medium_sentences): + buffer.append(sentence) + total_length = sum(len(s) for s in buffer) + + # 模拟首次播放逻辑 + trigger_reason = None + if total_length >= 40 and len(buffer) >= 2: + trigger_reason = f"总长度{total_length}字符,{len(buffer)}个句子" + elif len(sentence) >= 25 and sentence.endswith(('。', '!', '?', '.', '!', '?')) and len(buffer) >= 2: + trigger_reason = f"长句子{len(sentence)}字符+缓冲内容" + + if trigger_reason and first_trigger is None: + first_trigger = i + 1 + print(f" 🎵 第{first_trigger}句触发TTS: {trigger_reason}") + print(f" 📝 发送内容: '{''.join(buffer)}'") + break + else: + print(f" ⏳ 第{i+1}句: '{sentence}' (累计: {total_length}字符, {len(buffer)}个句子)") + + if first_trigger is None: + print(" ⚠️ 未触发TTS(需要超时机制)") + print() + + # 测试场景3: 长句子 + print("📝 测试场景3: 长句子") + long_sentences = [ + "你好,", + "我认为这个问题需要我们从多个角度来分析。", + "首先,让我们仔细了解一下具体情况。", + ] + + buffer = [] + total_length = 0 + first_trigger = None + + for i, sentence in enumerate(long_sentences): + buffer.append(sentence) + total_length = sum(len(s) for s in buffer) + + # 模拟首次播放逻辑 + trigger_reason = None + if total_length >= 40 and len(buffer) >= 2: + trigger_reason = f"总长度{total_length}字符,{len(buffer)}个句子" + elif len(sentence) >= 25 and sentence.endswith(('。', '!', '?', '.', '!', '?')) and len(buffer) >= 2: + trigger_reason = f"长句子{len(sentence)}字符+缓冲内容" + + if trigger_reason and first_trigger is None: + first_trigger = i + 1 + print(f" 🎵 第{first_trigger}句触发TTS: {trigger_reason}") + print(f" 📝 发送内容: '{''.join(buffer)}'") + break + else: + print(f" ⏳ 第{i+1}句: '{sentence}' (累计: {total_length}字符, {len(buffer)}个句子)") + + if first_trigger is None: + print(" ⚠️ 未触发TTS(需要超时机制)") + print() + + # 测试场景4: 超长单句 + print("📝 测试场景4: 超长单句") + ultra_long_sentence = "根据我的分析,这个问题的解决方案需要综合考虑多个因素,包括时间成本、资源投入以及最终的实施效果。" + + buffer = ["你好"] + buffer.append(ultra_long_sentence) + total_length = sum(len(s) for s in buffer) + + if total_length >= 40 and len(buffer) >= 2: + print(f" 🎵 第2句触发TTS: 总长度{total_length}字符,{len(buffer)}个句子") + print(f" 📝 发送内容: '{''.join(buffer)[:50]}...'") + else: + print(" ⚠️ 未触发TTS") + print() + +def show_optimization_comparison(): + """显示优化对比""" + print("📈 首次播放逻辑优化对比") + print("=" * 50) + + comparison = { + "优化前": { + "触发条件": "任何完整句子或长句子", + "最小长度": "无明确要求", + "积攒机制": "基本没有", + "可能导致": "播放卡顿,等待数据", + }, + "优化后": { + "触发条件": "40+字符且2+句子 或 25+字符完整句+缓冲", + "最小长度": "总长度40字符或单句25字符", + "积攒机制": "智能积累多个句子", + "超时保护": "5秒超时机制", + "效果": "确保有足够数据才开始播放" + } + } + + for aspect, details in comparison.items(): + print(f"\n🔧 {aspect}:") + for key, value in details.items(): + print(f" • {key}: {value}") + + print(f"\n🎯 核心改进: 确保首次播放有足够的内容,避免因为数据不足导致的播放卡顿") + +if __name__ == "__main__": + if len(sys.argv) > 1 and sys.argv[1] == "--comparison": + show_optimization_comparison() + else: + test_first_playback_logic() + show_optimization_comparison() \ No newline at end of file diff --git a/test_optimization.py b/test_optimization.py new file mode 100644 index 0000000..4ff70a1 --- /dev/null +++ b/test_optimization.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +音频播放优化测试脚本 +用于验证缓冲区优化和播放性能改进 +""" + +import time +import json +import os +import sys + +def test_optimization(): + """测试优化效果""" + print("🧪 音频播放优化测试") + print("=" * 50) + + # 显示优化后的配置参数 + print("📋 优化后的配置参数:") + print(" - 预加载缓冲区: 6个音频块(原:3个)") + print(" - 智能句子缓冲: 最多5个句子(原:3个)") + print(" - 最小触发句子: 2个句子(原:1个)") + print(" - 积累时间窗口: 150ms(原:200ms)") + print(" - TTS任务队列: 20个任务(原:10个)") + print(" - 音频块大小: 1024字节(原:2048字节)") + print(" - 播放冷却期: 0.05秒(原:0.1秒)") + print(" - 长句子触发阈值: 30字符(原:50字符)") + print(" - 播放缓冲区维护: 4个块(原:3个)") + print() + + # 测试智能句子缓冲逻辑 + print("🧠 测试智能句子缓冲逻辑:") + print(" 🔄 首次播放逻辑测试:") + + test_sentences = [ + "你好", # 短句子 + "今天天气怎么样?", # 中等长度 + "我觉得这个方案很不错,我们可以试试看。", # 长句子 + "这是一个超过三十个字符的句子,应该会立即触发TTS生成。", # 超过30字符 + "短句。", # 带标点的短句 + ] + + # 模拟首次播放的缓冲区状态 + tts_buffer = [] + first_playback_started = False + total_buffered_text = "" + trigger_count = 0 + + for i, sentence in enumerate(test_sentences): + tts_buffer.append(sentence) + total_buffered_text = ''.join(tts_buffer) + + # 首次播放逻辑 + if not first_playback_started: + should_trigger = False + trigger_reason = "" + + # 条件1: 总文本长度超过40字符且至少有2个句子 + if len(total_buffered_text) >= 40 and len(tts_buffer) >= 2: + should_trigger = True + trigger_reason = f"总长度{len(total_buffered_text)}字符,{len(tts_buffer)}个句子" + # 条件2: 有1个完整长句子(超过25字符) + elif len(sentence) >= 25 and sentence.endswith(('。', '!', '?', '.', '!', '?')) and len(tts_buffer) >= 2: + should_trigger = True + trigger_reason = f"长句子{len(sentence)}字符+缓冲内容" + # 条件3: 缓冲区达到最大值(5个) + elif len(tts_buffer) >= 5: + should_trigger = True + trigger_reason = f"缓冲区达到最大值{len(tts_buffer)}" + # 条件4: 超过500ms(模拟) + + if should_trigger: + trigger_count += 1 + first_playback_started = True + print(f" 🎵 首次触发TTS: {trigger_reason}") + print(f" 📝 发送内容: '{total_buffered_text[:50]}...'") + tts_buffer = [] + else: + print(f" ⏳ 首次缓冲: '{sentence}' (累计: {len(total_buffered_text)}字符, {len(tts_buffer)}个句子)") + else: + # 正常播放逻辑 + if len(sentence) > 30 or len(tts_buffer) >= 3: + should_trigger = True + trigger_reason = "长句子" if len(sentence) > 30 else "缓冲区满" + + if should_trigger: + trigger_count += 1 + print(f" ✅ 正常触发TTS: {trigger_reason}") + print(f" 📝 发送内容: '{''.join(tts_buffer)[:30]}...'") + tts_buffer = [] + else: + print(f" ⏳ 正常缓冲: '{sentence}'") + + print(f" 📊 总触发次数: {trigger_count}") + print() + + print(" 📋 首次播放优化效果:") + print(" • 确保首句有足够长度(40+字符或25+字符完整句)") + print(" • 积累多个句子避免播放卡顿") + print(" • 5秒超时机制防止无限等待") + print(" • 后续句子正常流式处理") + print() + + # 显示性能监控信息 + print("📊 性能监控功能:") + print(" - 实时缓冲区大小统计") + print(" - 平均和最大缓冲区大小") + print(" - 播放块数和音频大小统计") + print(" - 每5秒自动输出性能报告") + print() + + print("🎯 预期改进效果:") + print(" 1. ✅ 减少音频播放卡顿(更大的缓冲区)") + print(" 2. ✅ 更快的TTS响应(优化的触发条件)") + print(" 3. ✅ 更流畅的播放体验(减少冷却期)") + print(" 4. ✅ 更好的资源利用(更小的音频块)") + print(" 5. ✅ 实时性能监控(调试和优化)") + print() + + print("📝 测试建议:") + print(" 1. 运行主程序观察播放流畅度") + print(" 2. 查看性能统计输出") + print(" 3. 监控缓冲区大小变化") + print(" 4. 测试不同长度的语音响应") + print() + + print("🚀 测试完成!可以运行主程序验证优化效果。") + +def show_optimization_summary(): + """显示优化总结""" + print("📈 音频播放优化总结") + print("=" * 50) + + summary = { + "缓冲区优化": [ + "预加载缓冲区: 3→6个块", + "智能句子缓冲: 3→5个句子", + "最小触发缓冲: 1→2个句子", + "TTS任务队列: 10→20个任务" + ], + "响应性优化": [ + "积累时间窗口: 200ms→150ms", + "长句子触发: 50→30字符", + "中等长度触发: 30→20字符", + "播放冷却期: 0.1s→0.05s" + ], + "播放优化": [ + "音频块大小: 2048→1024字节", + "播放缓冲维护: 3→4个块", + "数据转移: 2→3个块/次" + ], + "监控功能": [ + "实时性能统计", + "缓冲区大小监控", + "自动性能报告", + "播放进度追踪" + ] + } + + for category, improvements in summary.items(): + print(f"\n🔧 {category}:") + for improvement in improvements: + print(f" • {improvement}") + + print(f"\n🎯 总体目标: 减少音频播放卡顿,提升用户体验") + print(f"📊 预期效果: 更流畅的实时语音交互") + +if __name__ == "__main__": + if len(sys.argv) > 1 and sys.argv[1] == "--summary": + show_optimization_summary() + else: + test_optimization() \ No newline at end of file diff --git a/tts_test.mp3 b/tts_test.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..3c72aec660541d26ecfe819714afc5a77b24c55b GIT binary patch literal 149274 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≫l!z1pQ(Ql=bvXka6Tg2C6xpdIj;HfKGf+W5>f z;Z90>i;T4dcCn2Pov9vmJk|H?Xx60=fW1K?ui+9#5Nh-p-!z$8+W{;TU4B#;y)P{b zBed?64~c-SaYJNezoOtf{~+~wdnC≠c&lHK*}Nz9+Mx&1i|hW<4gl+^})F+61g3 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

QA&1| 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

-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 z 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 literal 0 HcmV?d00001 diff --git a/verify_timeout.py b/verify_timeout.py new file mode 100644 index 0000000..425a3f6 --- /dev/null +++ b/verify_timeout.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +验证5秒超时机制 +""" + +def test_timeout_mechanism(): + """测试超时机制""" + print("⏱️ 首次播放超时机制验证") + print("=" * 40) + + print("📋 超时设置更新:") + print(" 原: 500ms 超时") + print(" 现: 5秒 超时") + print() + + print("🎯 超时机制作用:") + print(" • 防止无限等待首次播放") + print(" • 给LLM充分时间生成内容") + print(" • 适应网络较慢的情况") + print(" • 确保用户体验不会过度等待") + print() + + print("📊 超时时间对比:") + scenarios = [ + ("快速响应", "1-2秒", "正常触发积累条件"), + ("中等响应", "2-5秒", "正常触发积累条件"), + ("慢速响应", "5秒+", "超时机制触发"), + ("极慢响应", "10秒+", "已通过超时机制处理"), + ] + + for scenario, time_range, result in scenarios: + print(f" • {scenario:10} ({time_range}): {result}") + + print() + print("✅ 优化完成: 超时时间从500ms增加到5秒") + +if __name__ == "__main__": + test_timeout_mechanism() \ No newline at end of file