回声待处理

This commit is contained in:
朱潮 2025-09-21 11:40:54 +08:00
parent e1d634af1f
commit 3f70062c2b
2 changed files with 48 additions and 0 deletions

View File

@ -171,6 +171,32 @@ class InputProcess:
self.logger.error(f"音频设备初始化失败: {e}") self.logger.error(f"音频设备初始化失败: {e}")
raise raise
def _cleanup_audio_stream(self):
"""清理音频流但不关闭整个PyAudio实例"""
try:
if self.input_stream:
print("🎙️ 输入进程:关闭音频输入流")
self.input_stream.stop_stream()
self.input_stream.close()
self.input_stream = None
except Exception as e:
self.logger.warning(f"关闭音频流时出错: {e}")
def _cleanup(self):
"""清理资源"""
print("🎙️ 输入进程:开始清理资源")
self._cleanup_audio_stream()
if self.audio:
try:
print("🎙️ 输入进程终止PyAudio实例")
self.audio.terminate()
except:
pass
self.audio = None
print("🎙️ 输入进程:资源清理完成")
def _check_commands(self): def _check_commands(self):
"""检查主进程控制命令""" """检查主进程控制命令"""
try: try:
@ -178,6 +204,11 @@ class InputProcess:
command = self.command_queue.get_nowait() command = self.command_queue.get_nowait()
if command.command == 'enable_recording': if command.command == 'enable_recording':
if not self.recording_enabled:
# 从禁用到启用,需要重新初始化音频流
print("🎙️ 输入进程:重新启用录音功能,重新初始化音频流")
self._cleanup_audio_stream()
self._setup_audio()
self.recording_enabled = True self.recording_enabled = True
self.logger.info("录音功能已启用") self.logger.info("录音功能已启用")
@ -186,6 +217,8 @@ class InputProcess:
# 如果正在录音,立即停止并发送数据 # 如果正在录音,立即停止并发送数据
if self.is_recording: if self.is_recording:
self._stop_recording() self._stop_recording()
# 禁用时关闭音频流,避免回声污染
self._cleanup_audio_stream()
self.logger.info("录音功能已禁用") self.logger.info("录音功能已禁用")
elif command.command == 'shutdown': elif command.command == 'shutdown':
@ -199,6 +232,10 @@ class InputProcess:
def _process_audio(self): def _process_audio(self):
"""处理音频数据""" """处理音频数据"""
try: try:
# 检查音频流是否存在
if not self.input_stream:
return
data = self.input_stream.read(self.CHUNK_SIZE, exception_on_overflow=False) data = self.input_stream.read(self.CHUNK_SIZE, exception_on_overflow=False)
if len(data) == 0: if len(data) == 0:
return return
@ -273,6 +310,12 @@ class InputProcess:
except Exception as e: except Exception as e:
print(f"🎙️ 输入进程音频处理错误: {e}") print(f"🎙️ 输入进程音频处理错误: {e}")
# 如果音频流出现问题,尝试重新初始化
if "stream" in str(e).lower() or "audio" in str(e).lower():
print(f"🎙️ 输入进程:音频流异常,尝试重新初始化")
self._cleanup_audio_stream()
if self.recording_enabled:
self._setup_audio()
def _update_pre_record_buffer(self, audio_data: bytes): def _update_pre_record_buffer(self, audio_data: bytes):
"""更新预录音缓冲区""" """更新预录音缓冲区"""

View File

@ -361,6 +361,10 @@ class ControlSystem:
self.stats['total_conversations'] += 1 self.stats['total_conversations'] += 1
print(f"📡 主控制:已更新统计,对话数 = {self.stats['total_conversations']}") print(f"📡 主控制:已更新统计,对话数 = {self.stats['total_conversations']}")
# 等待一段时间确保音频设备完全停止播放
print(f"📡 主控制:等待音频设备完全停止...")
time.sleep(1.0) # 增加1秒等待时间
# 切换到空闲状态 # 切换到空闲状态
old_state = self.state.value old_state = self.state.value
self.state = RecordingState.IDLE self.state = RecordingState.IDLE
@ -370,6 +374,7 @@ class ControlSystem:
try: try:
self.input_command_queue.put(ControlCommand('enable_recording')) self.input_command_queue.put(ControlCommand('enable_recording'))
print(f"📡 主控制:已发送 enable_recording 命令到输入进程") print(f"📡 主控制:已发送 enable_recording 命令到输入进程")
print(f"📡 主控制:输入进程已重新启用,可以开始新的录音")
except Exception as e: except Exception as e:
print(f"❌ 主控制:发送 enable_recording 命令失败: {e}") print(f"❌ 主控制:发送 enable_recording 命令失败: {e}")