Как разделить аудиофайл на основе тишины и перекрыть последние 2 секунды в python

В настоящее время я использую этот код, чтобы разрезать аудиофайл на небольшие куски:

sound = AudioSegment.from_mp3("1.WAV")
f=open("decoded.txt", "a+")
chunks = split_on_silence(sound,min_silence_len=280,silence_thresh=-33,keep_silence=150)

for i, chunk in enumerate(chunks):
    print(i)
    print("\n")
    chunk.export(folder+"/chunk{0}.wav".format(i), format="wav")
    AUDIO_FILE = path.join(path.dirname(path.realpath(__file__)), folder+"/chunk{0}.wav".format(i))
    r = sr.Recognizer()
    with sr.AudioFile(AUDIO_FILE) as source:
        print("Listening...")
        audio = r.record(source)  # read the entire audio file
        f.write((r.recognize_google(audio) +" "))

f.close();

Это создает куски файлов, разделенные в соответствии с тишиной... Но я хочу, чтобы всякий раз, когда аудио разбивается, следующий фрагмент начинался с 2 секунд назад, так что любое слово, которое может быть вырезано, может появиться. Что-то вроде того, что если тишина во время 10,13,18,22, то мои фрагменты должны быть 0-10,8-13,11-18,16-22. Я использую pydub для разделения по тишине. Могу ли я что-то изменить в pydub или есть какой-то другой пакет, который работает?


person Abhijeet Sridhar    schedule 22.10.2018    source источник


Ответы (1)


Поскольку каждый фрагмент разделен на паузы, в нем не будет данных за предыдущие 2 секунды.
Однако вы можете сделать копию последних 2 секунд предыдущих фрагментов (n-1) и объединить со следующим фрагментом ( nth), пропуская первый фрагмент.

Псевдокод, как показано ниже,

n1 + n2 + n3 + ...n #audio chunks that are split on silence
n1 + (<last 2 seconds of n1> + n2) + (<last 2 seconds of n2> + n3) + ...

Вы также можете поиграть с keep_silence, чтобы узнать, какое значение имеет смысл для ваших требований.

Другая идея — использовать pydub.silence.detect_nonsilent() чтобы найти диапазоны тишины и принять собственное решение о том, где нарезать исходный звук.

Я оставлю это вам как упражнение по программированию.

person Anil_M    schedule 24.10.2018
comment
Я провел свое собственное исследование в течение нескольких дней и пришел к точно такому же выводу, который вы сказали. Я просто взял некоторый интервал в 5 секунд и перед нарезкой звука установил время начала на -2 от того, что есть. Это, казалось, работало как шарм. Рад узнать, что я был на правильном пути :) Большое спасибо - person Abhijeet Sridhar; 26.10.2018