From c01e6ad1f671ef3dc54ea60581698a1ff96c1a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Sat, 20 Sep 2025 12:00:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=92=AD=E6=94=BE=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=A3=80=E6=B5=8B=E9=81=BF=E5=85=8D=E5=9B=9E=E5=A3=B0?= =?UTF-8?q?=E5=BD=95=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 播放时暂停录音处理 - 显示播放状态提示 - 防止播放的音频被重新录制 - 避免产生回声问题 --- energy_based_recorder.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/energy_based_recorder.py b/energy_based_recorder.py index 35d5ad5..46f5eef 100644 --- a/energy_based_recorder.py +++ b/energy_based_recorder.py @@ -46,6 +46,9 @@ class EnergyBasedRecorder: self.pre_record_buffer = [] # 预录音缓冲区 self.pre_record_max_frames = int(self.pre_record_duration * self.RATE / self.CHUNK_SIZE) # 最大预录音帧数 + # 播放状态 + self.is_playing = False # 是否正在播放 + # 性能监控 self.frame_count = 0 self.start_time = time.time() @@ -155,6 +158,9 @@ class EnergyBasedRecorder: def play_audio(self, filename): """播放音频文件""" try: + # 设置播放状态 + self.is_playing = True + with wave.open(filename, 'rb') as wf: channels = wf.getnchannels() width = wf.getsampwidth() @@ -194,6 +200,9 @@ class EnergyBasedRecorder: except Exception as e: print(f"❌ 播放失败: {e}") self.play_with_system_player(filename) + finally: + # 恢复播放状态 + self.is_playing = False def play_with_system_player(self, filename): """使用系统播放器播放音频""" @@ -312,6 +321,14 @@ class EnergyBasedRecorder: if len(data) == 0: continue + # 如果正在播放,跳过音频处理 + if self.is_playing: + # 显示播放状态 + status = "🔊 播放中... 跳过录音处理" + print(f"\r{status}", end='', flush=True) + time.sleep(0.1) # 播放时增加延迟减少CPU使用 + continue + # 计算能量和零交叉率 energy = self.calculate_energy(data) zcr = self.calculate_zero_crossing_rate(data) @@ -343,7 +360,6 @@ class EnergyBasedRecorder: self.stop_recording() # 显示录音状态(包含预录音信息) - pre_duration = len(self.pre_record_buffer) * self.CHUNK_SIZE / self.RATE bg_energy = np.median(self.energy_history[-10:]) if len(self.energy_history) >= 10 else 0 status = f"录音中... {recording_duration:.1f}s | 能量: {energy:.0f} | ZCR: {zcr:.0f} | 背景: {bg_energy:.0f}" print(f"\r{status}", end='', flush=True)