本想在猪八戒里面提交一下的。但是经验不够,提交不了。算了就发在这了。哎我也是借助了ai
import pyaudio
import wave
import numpy as np
import time
# 音频参数设置
CHUNK = 1024 # 每次读取的帧数
FORMAT = pyaudio.paInt16 # 采样格式
CHANNELS = 1 # 单声道
RATE = 16000 # 采样率
THRESHOLD = 500 # 声音阈值,根据实际情况调整
SILENCE_THRESHOLD = 0.8 # 持续静音时间比例
SILENCE_CHUNKS = int(RATE / CHUNK * SILENCE_THRESHOLD) # 连续多少帧无声则认为结束说话
MIN_RECORD_SECONDS = 1 # 最小录音时长(秒)
RECORDING_FILE = "output.wav" # 输出文件名
# 初始化 PyAudio 对象
p = pyaudio.PyAudio()
# 打开数据流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
def is_silent(data):
"""检查是否为静音"""
return np.max(np.frombuffer(data, dtype=np.int16)) < THRESHOLD
def record_audio(stream, filename):
"""录音并保存为 WAV 文件"""
print("开始录音...")
frames = []
silent_count = 0
start_time = time.time()
try:
while True:
data = stream.read(CHUNK)
if is_silent(data):
silent_count += 1
if silent_count > SILENCE_CHUNKS:
break
else:
silent_count = 0
frames.append(data)
except KeyboardInterrupt:
print("录音被中断")
finally:
end_time = time.time()
elapsed_time = end_time - start_time
if elapsed_time >= MIN_RECORD_SECONDS and frames:
# 保存录音文件
with wave.open(filename, 'wb') as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
print(f"录音结束,文件已保存至 {filename}")
else:
print("录音时间过短,未保存文件")
# 主循环
try:
counter = 1
while True:
# 检测到声音时开始录音
while not is_silent(stream.read(CHUNK)):
time.sleep(0.1) # 短暂休眠,避免 CPU 占用过高
# 开始录音
record_audio(stream, f"output_{counter}.wav")
# 增加一些延迟,避免频繁触发录音
time.sleep(2) # 增加一些延迟,避免频繁触发录音
counter += 1
except KeyboardInterrupt:
print("程序被中断")
finally:
stream.stop_stream()
stream.close()
p.terminate()
print("资源已释放")
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。