How to Record Audio in Python: Automatically Detect Speech and Silence

WBOY
Release: 2024-08-29 20:30:10
Original
393 people have browsed it

How to Record Audio in Python: Automatically Detect Speech and Silence

Recording audio only when someone is speaking is a powerful feature that can be used in various applications, from voice-activated assistants to saving storage space by eliminating silent periods. In this tutorial, you'll learn how to write Python code that starts recording when it detects speech and stops when silence is detected.

Prerequisites

Before diving in, ensure you have the following:

  • Python 3.x installed on your system.
  • Basic knowledge of Python.
  • Familiarity with Python libraries like pyaudio, numpy, and webrtcvad.

Step 1: Install Required Libraries ?

We’ll be using the following libraries:

  • pyaudio: For capturing audio from your microphone.
  • webrtcvad: For voice activity detection.
  • numpy: For handling audio data.

You can install them using pip:

pip install pyaudio webrtcvad numpy
Copy after login

Step 2: Setting Up Audio Stream ?

First, let’s set up the audio stream to capture audio input from your microphone.

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)
Copy after login

Step 3: Implementing Voice Activity Detection (VAD) ?

We’ll use the webrtcvad library to detect when someone is speaking. The library can classify audio frames as speech or non-speech.

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)
Copy after login

Step 4: Capturing and Processing Audio Frames ?

Now, let's continuously capture audio frames and check if they contain speech.

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
Copy after login

Step 5: Saving the Recorded Audio ?

Finally, let’s save the recorded audio to a .wav file.

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")
Copy after login

Conclusion ?

With just a few lines of code, you’ve implemented a Python program that detects speech and records only the speaking portions, ignoring silence. This technique is especially useful for creating efficient voice-activated systems.

Feel free to experiment with the VAD aggressiveness and audio settings to suit your specific needs. Happy coding! ?‍??‍?


The above is the detailed content of How to Record Audio in Python: Automatically Detect Speech and Silence. For more information, please follow other related articles on the PHP Chinese website!

source:dev.to
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template