python - 声音变化时如何分割音频文件?
问题描述
我正在使用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
解决方案
推荐阅读
- python - 在 Django StreamHttpResponse 中实时逐行打印子进程标准输出
- javascript - 如何为来自 api 的 json 数据生成角度的动态表单
- reactjs - React Firebase 问题:保存变量的最有效方法是什么?
- c# - 使用 c# 和 typescript 从客户端下载文件而不将其存储在服务器中
- python - 一个类似于replit中的clear()的python函数
- raspberry-pi - 无法让 ALSA 识别我在 Raspberry Pi 上的 mic softvol 控制
- c# - 如何不时连接到套接字
- connection - 简单的 Salesforce 无法连接
- python-3.x - 我应该如何在 def discord.py 中给出 Int
- entity-framework - 在 Azure 函数中禁用实体框架日志记录