Python实现录音时实时检测静音拆分文件及自动停止录制的方法
实时录音静音拆分+自动停止实现方案
核心逻辑
- 音频采集按100~200ms的小分块流式处理,保证实时性无明显延迟
- 每个分块实时计算音量,判断是否为静音,累计连续静音时长
- 非静音时段的音频持续写入临时缓存,检测到连续静音达到拆分阈值时,将缓存内容保存为独立音频文件,重置缓存
- 连续静音时长累计到3秒时,直接终止录音流程,收尾剩余未保存的音频片段
环境依赖
先安装所需第三方库:
pip install pyaudio pydub numpy
可运行示例代码
import pyaudio from pydub import AudioSegment # 基础参数配置 FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 # 100ms 分块,RATE * 0.1 = 1600 CHUNK = int(RATE * 0.1) # 静音判定阈值,单位dBFS,可根据环境噪音调整 SILENCE_THRESHOLD = -40 # 拆分文件需要的最短连续静音时长,单位秒 SPLIT_SILENCE_DURATION = 0.5 # 终止录音需要的连续静音时长,单位秒 STOP_SILENCE_DURATION = 3 # 初始化录音组件 p = pyaudio.PyAudio() stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK) print("开始录音...") current_segment = AudioSegment.empty() consecutive_silence = 0 segment_index = 1 try: while True: # 读取一个分块的音频数据 data = stream.read(CHUNK) # 转成pydub的AudioSegment格式处理 chunk = AudioSegment( data, sample_width=p.get_sample_size(FORMAT), frame_rate=RATE, channels=CHANNELS ) # 判断当前分块是否为静音 if chunk.dBFS < SILENCE_THRESHOLD: consecutive_silence += 0.1 else: consecutive_silence = 0 current_segment += chunk # 触发终止录音逻辑 if consecutive_silence >= STOP_SILENCE_DURATION: print("检测到3秒连续静音,终止录音") break # 触发拆分文件逻辑 if consecutive_silence >= SPLIT_SILENCE_DURATION and len(current_segment) > 0: save_path = f"audio_segment_{segment_index}.wav" current_segment.export(save_path, format="wav") print(f"已保存片段:{save_path}") segment_index += 1 current_segment = AudioSegment.empty() finally: # 收尾保存剩余的音频片段 if len(current_segment) > 0: save_path = f"audio_segment_{segment_index}.wav" current_segment.export(save_path, format="wav") print(f"已保存最后片段:{save_path}") # 释放资源 stream.stop_stream() stream.close() p.terminate()
参数调整说明
- 静音阈值:默认-40dBFS适合低噪音的室内环境,如果录音环境杂音较多,可以适当调低到-45~-50dBFS,如果声音本身偏小,可以调高到-35dBFS
- 分块时长:默认100ms平衡了性能和延迟,对实时性要求更高可以改成50ms,对应CHUNK设为800即可
- 拆分触发静音时长:默认0.5秒,避免说话间隙的短暂停顿被误判为分割点,如果需要拆分的片段间隔更长,可以调高到1~2秒
内容的提问来源于stack exchange,提问作者Sukanya_Sahoo
相关产品推荐
相关产品推荐

