linly / src /Record.py
David Victor
init
bc3753a
raw
history blame
2.08 kB
import pyaudio
import wave
import audioop
class Record:
def __init__(self, output_file, silence_threshold=1000):
self.output_file = output_file
self.silence_threshold = silence_threshold
# 设置录音参数
self.format = pyaudio.paInt16
self.channels = 1
self.sample_rate = 44100
self.chunk = 1024
self.audio = pyaudio.PyAudio()
def start_recording(self):
# 打开音频流
stream = self.audio.open(format=self.format,
channels=self.channels,
rate=self.sample_rate,
input=True,
frames_per_buffer=self.chunk)
print("开始录音...")
frames = []
silence_counter = 0
# 录制音频
while True:
data = stream.read(self.chunk)
frames.append(data)
# 计算音频能量(RMS)
rms = audioop.rms(data, 2) # 2表示样本的宽度为2字节(16位)
if rms < self.silence_threshold:
silence_counter += 1
else:
silence_counter = 0
# 如果连续一段时间都检测到静音,则认为录音结束
if silence_counter >= 100: # 假设每个chunk为10毫秒,连续1秒的静音
break
print("录音结束.")
# 关闭流
stream.stop_stream()
stream.close()
self.audio.terminate()
# 将录制的音频保存到WAV文件
with wave.open(self.output_file, 'wb') as wf:
wf.setnchannels(self.channels)
wf.setsampwidth(self.audio.get_sample_size(self.format))
wf.setframerate(self.sample_rate)
wf.writeframes(b''.join(frames))
def test():
# 创建Record对象并开始录音
output_file = "recording.wav" # 输出文件名
silence_threshold = 500 # 静音阈值
recorder = Record(output_file, silence_threshold)
recorder.start_recording()
# test()