仅在有人说话时录制音频是一项强大的功能,可用于各种应用程序,从语音激活助手到通过消除静音期来节省存储空间。在本教程中,您将学习如何编写 Python 代码,在检测到语音时开始录音,并在检测到静音时停止录音。
开始之前,请确保您具备以下条件:
我们将使用以下库:
您可以使用 pip 安装它们:
pip install pyaudio webrtcvad numpy
首先,让我们设置音频流以捕获来自麦克风的音频输入。
import pyaudio # Audio configuration FORMAT = pyaudio.paInt16 CHANNELS = 1 RATE = 16000 CHUNK = 1024 # Initialize PyAudio audio = pyaudio.PyAudio() # Open stream stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
我们将使用 webrtcvad 库来检测某人何时说话。该库可以将音频帧分类为语音或非语音。
import webrtcvad # Initialize VAD vad = webrtcvad.Vad() vad.set_mode(1) # 0: Aggressive filtering, 3: Less aggressive def is_speech(frame, sample_rate): return vad.is_speech(frame, sample_rate)
现在,让我们连续捕获音频帧并检查它们是否包含语音。
def record_audio(): frames = [] recording = False print("Listening for speech...") while True: frame = stream.read(CHUNK) if is_speech(frame, RATE): if not recording: print("Recording started.") recording = True frames.append(frame) else: if recording: print("Silence detected, stopping recording.") break # Stop and close the stream stream.stop_stream() stream.close() audio.terminate() return frames
最后,让我们将录制的音频保存到 .wav 文件。
import wave def save_audio(frames, filename="output.wav"): wf = wave.open(filename, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(audio.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close() # Example usage frames = record_audio() save_audio(frames) print("Audio saved as output.wav")
仅用几行代码,您就实现了一个 Python 程序,该程序可以检测语音并仅记录说话部分,忽略静音部分。该技术对于创建高效的语音激活系统特别有用。
请随意尝试 VAD 攻击性和音频设置,以满足您的特定需求。快乐编码! ?????
以上是如何用Python录制音频:自动检测语音和静音的详细内容。更多信息请关注PHP中文网其他相关文章!