There are a few packages you may want to look into for handling audio: commonly soundfile
is used for I/O, as is librosa
. The 'sampling rate' AKA 'frame rate' is the number of audio samples per second, commonly written in kHz, but in software just given in Hz.
There's also a dedicated Sound Design StackExchange which you may find more fruitful to search.
Taking a section of a file is known as 'seeking', and the soundfile.SoundFile
class supports it.
The idea is you move the position of the 'cursor' to a particular frame, SoundFile.seek(pos)
, then read in some frames, SoundFile.read(n_frames)
, after which the position of the cursor will be moved along by that many frames, which you can obtain with SoundFile.tell()
.
Here's an example of accessing a part of a wav file:
import soundfile as sf
def read_audio_section(filename, start_time, stop_time):
track = sf.SoundFile(filename)
can_seek = track.seekable() # True
if not can_seek:
raise ValueError("Not compatible with seeking")
sr = track.samplerate
start_frame = sr * start_time
frames_to_read = sr * (stop_time - start_time)
track.seek(start_frame)
audio_section = track.read(frames_to_read)
return audio_section, sr
...and to write that to file you just use soundfile.write
(note: a function in the package, not a method of the soundfile.SoundFile
class)
def extract_as_clip(input_filename, output_filename, start_time, stop_time):
audio_extract, sr = read_audio_section(input_filename, start_time, stop_time)
sf.write(output_filename, audio_extract, sr)
return