Сделать куски в аудио-файлах с перекрытием в Python - PullRequest
0 голосов
/ 24 января 2019

Я хочу сделать фрагменты из моих аудиофайлов, чтобы они перекрывались между собой.Например, если длина каждого чанка составляет 4 секунды, а первый чанк начинается с 0 до 4, а шаг наложения составляет 1 секунду, второй чанк должен начинаться с 3 до 7. Согласно этому Как объединить аудиофайл (формат wav)) в 1 сек соединения в питоне?, я использовал модуль pydub для этого и метод make_chunks(your_audio_file_object, chunk_length_ms), но он не имеет перекрытия между фрагментами и просто нарезает аудиофайл на фрагменты фиксированной длины.У кого-нибудь есть идея для этого?Спасибо

1 Ответ

0 голосов
/ 27 января 2019

Вот один из способов:

import numpy as np
from scipy.io import wavfile

frequency, signal = wavfile.read(path)

slice_length = 4 # in seconds
overlap = 1 # in seconds
slices = np.arange(0, len(signal), slice_length-overlap, dtype=np.int)

for start, end in zip(slices[:-1], slices[1:]):
    start_audio = start * frequency
    end_audio = end * frequency
    audio_slice = audio[start_audio: end_audio]

По сути, мы делаем следующее:

  1. Загрузите файл и его соответствующую частоту. В качестве примера я предполагаю, что его одноканальный, с многоканальным, он будет работать одинаково, просто больше кода.
  2. Определите желаемую длину среза и перекрытие. Массив даст нам начало каждой аудио части. Заставив его на шаг вперед и добавив перекрытие, мы получим нужные куски.

Чтобы убедиться, что нарезка работает, проверьте этот фрагмент:

slice_length = 4 # in seconds
overlap = 1 # in seconds
slices = np.arange(0, 26, slice_length-overlap, dtype=np.int) # 26 is arbitrary

frequency = 1
for start, end in zip(slices[:-1], slices[1:]):
    start_audio = start * frequency
    end_audio = end * frequency + overlap
    print(start_audio, end_audio)

Выход:

0 4
3 7
6 10
9 13
12 16
15 19
18 22
21 25
...