You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 21:57:04