首页 > 解决方案 > 声音变化时如何分割音频文件?

问题描述

我正在使用python(pydub)并且我试图在声音发生变化并且声音均匀时拆分音频文件。我真的很讨厌发布整个代码,但我尝试了多种选择但没有任何成功。在这种方法中,它会剪切,但它会生成声音的一部分或避免它,并且声音的长度在同一个声音文件中会有所不同。您可能会在 3 秒内找到第一个声音,然后在 5 秒内找到第二个声音,依此类推。请帮助我。

from pydub import AudioSegment
from pydub.silence import split_on_silence
import threading
import time


r = sr.Recognizer()

def worker(audio, silenceLen, silenceThresh, **kwargs):
    
    chunk = split_on_silence (audio, min_silence_len = silenceLen, silence_thresh = silenceThresh, keep_silence=keepSilence)
    
    if chunk != []:
        chunks.append({'Chunk':chunk,'SilenceThresh': silenceThresh, 'SilenceLen': silenceLen, 'keepSilence': keepSilence})

    threads.pop()
    return



def match_target_amplitude(aChunk, target_dBFS):
    ''' Normalize given audio chunk '''
    change_in_dBFS = target_dBFS - aChunk.dBFS
    return aChunk.apply_gain(change_in_dBFS)

audio = AudioSegment.from_wav("Audio/Sample001/001/001000.wav")


threads = []

chunks = []

# My PC specs
max_num = 20
# EDIT: Forgot to add this 
keepSilence = 100

# Testing for better parameters
for silenceLen in range(1, 1000): # Can be changed
    if len(chunks) >= max_num:
            break
    for silenceThresh in range(-30, 30): # Can be changed
        t = threading.Thread(target=worker, kwargs={'audio': audio, 'silenceThresh': silenceThresh, 'silenceLen': silenceLen, 'keepSilence' : keepSilence})
        threads.append(t)
        t.start()
        while len(threads) == 50:
            print('Waiting')
            time.sleep(3)
        
        if len(chunks) >= max_num:
            break

# Saving the slices            
for data in chunks:
    num = 0
    for i, chunk in enumerate(data['Chunk']):
        silence_chunk = AudioSegment.silent(duration=0)
        audio_chunk = silence_chunk + chunk + silence_chunk
        normalized_chunk = match_target_amplitude(audio_chunk, -10.0)
        normalized_chunk.export(
            "Audio/Sample001/001/chunk/{}.wav".format(str(i + num).zfill(3)),
            bitrate = "192k",
            format = "wav"
        )
    
    num+=1

标签: pythonaudiosplitwavpydub

解决方案


推荐阅读