(filename, frame_width=4096, min_region_size=0.5, max_region_size=6)
return regions
Perform voice activity detection on a given audio file.
Perform voice activity detection on a given audio file.
Perform voice activity detection on a given audio file .
def find_speech_regions(filename, frame_width=4096, min_region_size=0.5, max_region_size=6): # pylint: disable=too-many-locals
    """
    Perform voice activity detection on a given audio file.
    """
    reader = wave.open(filename)
    sample_width = reader.getsampwidth()
    rate = reader.getframerate()
    n_channels = reader.getnchannels()
    chunk_duration = float(frame_width) / rate

    n_chunks = int(math.ceil(reader.getnframes()*1.0 / frame_width))
    energies = []

    for _ in range(n_chunks):
        chunk = reader.readframes(frame_width)
        energies.append(audioop.rms(chunk, sample_width * n_channels))

    threshold = percentile(energies, 0.2)

    elapsed_time = 0

    regions = []
    region_start = None

    for energy in energies:
        is_silence = energy <= threshold
        max_exceeded = region_start and elapsed_time - region_start >= max_region_size

        if (max_exceeded or is_silence) and region_start:
            if elapsed_time - region_start >= min_region_size:
                regions.append((region_start, elapsed_time))
                region_start = None

        elif (not region_start) and (not is_silence):
            region_start = elapsed_time
        elapsed_time += chunk_duration
    return regions
def find_speech_regions ( filename , frame_width = 4096 , min_region_size = 0.5 , max_region_size = 6 ) : # pylint: disable=too-many-locals reader = wave . open ( filename ) sample_width = reader . getsampwidth ( ) rate = reader . getframerate ( ) n_channels = reader . getnchannels ( ) chunk_duration = float ( frame_width ) / rate n_chunks = int ( math . ceil ( reader . getnframes ( ) * 1.0 / frame_width ) ) energies = [ ] for _ in range ( n_chunks ) : chunk = reader . readframes ( frame_width ) energies . append ( audioop . rms ( chunk , sample_width * n_channels ) ) threshold = percentile ( energies , 0.2 ) elapsed_time = 0 regions = [ ] region_start = None for energy in energies : is_silence = energy <= threshold max_exceeded = region_start and elapsed_time - region_start >= max_region_size if ( max_exceeded or is_silence ) and region_start : if elapsed_time - region_start >= min_region_size : regions . append ( ( region_start , elapsed_time ) ) region_start = None elif ( not region_start ) and ( not is_silence ) : region_start = elapsed_time elapsed_time += chunk_duration return regions