Pydub-将split_on_silence与最小长度/文件大小结合在一起

HCLivess

我有两个脚本,其中一个脚本拆分一定长度的音频,另一个脚本在每次无声段落时都拆分音频。仅在经过一定时间后,才可以在静音时分割音频吗?我需要在不少于5分钟的时间内分割成大段的视频。

分割脚本时忽略静音:

from pydub import AudioSegment
#from pydub.utils import mediainfo
from pydub.utils import make_chunks
import math

#lac_audio = AudioSegment.from_file("Kalimba.mp3", "mp3")
#flac_audio.export("audio.mp3", format="mp3")
myaudio = AudioSegment.from_file("Kalimba.mp3" , "mp3")
channel_count = myaudio.channels    #Get channels
sample_width = myaudio.sample_width #Get sample width
duration_in_sec = len(myaudio) / 1000#Length of audio in sec
sample_rate = myaudio.frame_rate

print "sample_width=", sample_width 
print "channel_count=", channel_count
print "duration_in_sec=", duration_in_sec 
print "frame_rate=", sample_rate
bit_rate =16  #assumption , you can extract from mediainfo("test.wav") dynamically


wav_file_size = (sample_rate * bit_rate * channel_count * duration_in_sec) / 8
print "wav_file_size = ",wav_file_size


file_split_size = 10000000  # 10Mb OR 10, 000, 000 bytes
total_chunks =  wav_file_size // file_split_size

#Get chunk size by following method #There are more than one ofcourse
#for  duration_in_sec (X) -->  wav_file_size (Y)
#So   whats duration in sec  (K) --> for file size of 10Mb
#  K = X * 10Mb / Y

chunk_length_in_sec = math.ceil((duration_in_sec * 10000000 ) /wav_file_size)   #in sec
chunk_length_ms = chunk_length_in_sec * 1000
chunks = make_chunks(myaudio, chunk_length_ms)

#Export all of the individual chunks as wav files

for i, chunk in enumerate(chunks):
    chunk_name = "chunk{0}.mp3".format(i)
    print "exporting", chunk_name
    chunk.export(chunk_name, format="mp3")

忽略长度的分割脚本:

from pydub import AudioSegment
from pydub.silence import split_on_silence

sound = AudioSegment.from_mp3("my_file.mp3")
chunks = split_on_silence(sound, 
    # must be silent for at least half a second
    min_silence_len=500,

    # consider it silent if quieter than -16 dBFS
    silence_thresh=-16

 )

for i, chunk in enumerate(chunks):
    chunk.export("/path/to/ouput/dir/chunk{0}.wav".format(i), format="wav")
贾阿罗

我的建议是根据需要使用pydub.silence.split_on_silence()然后重新组合细分,以使您拥有的文件大小大致与目标大小相同。

就像是

from pydub import AudioSegment
from pydub.silence import split_on_silence

sound = AudioSegment.from_file("/path/to/file.mp3", format="mp3")
chunks = split_on_silence(
    sound,

    # split on silences longer than 1000ms (1 sec)
    min_silence_len=1000,

    # anything under -16 dBFS is considered silence
    silence_thresh=-16, 

    # keep 200 ms of leading/trailing silence
    keep_silence=200
)

# now recombine the chunks so that the parts are at least 90 sec long
target_length = 90 * 1000
output_chunks = [chunks[0]]
for chunk in chunks[1:]:
    if len(output_chunks[-1]) < target_length:
        output_chunks[-1] += chunk
    else:
        # if the last output chunk is longer than the target length,
        # we can start a new one
        output_chunks.append(chunk)

# now your have chunks that are bigger than 90 seconds (except, possibly the last one)

或者,您可以使用pydub.silence.detect_nonsilent()查找范围并自行决定在哪里分割原始音频

注意:我也在类似/重复的github问题上发布了此内容

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

python pydub.silence split_on_silence返回0块

将文件从Google Bucket加载到PyDub AudioSegment中

在 Python (pydub) 中创建一个空的 AudioSegment 文件

在PyDub中导出(但不保存到)音频文件?

在Pydub和Librosa之间转换音频文件

使用pyDub剪切长音频文件

如何从pydub AudioSegment创建一个numpy数组?

将吸气剂结合在一起

如何使用python将头文件与数据文件结合在一起?

将复杂的SVG文件与paper.js结合在一起

Flutter:将JSON文件的特定字段结合在一起,成为列表本身

如何使用 librosa.effects.split() 获得与 pydub.silence.detect_nonsilent() 类似的结果?

将目标和jacobian结合在一起以使Python的外观最小化

如何将文本大小调整与页脚中的加粗结合在一起?

将zsh的制表符完成与大小写不敏感结合在一起

如何编写将文件夹路径和文件名结合在一起的函数?

在PostgreSQL中将CTE与IN结合在一起

使用 Pydub 設置相對於另一個音頻文件的 rms

为什么Path.Combine没有将路径和文件结合在一起?

将多行ffmpeg命令结合在一起/用管道/链接在一起

使用 Pydub 在不同的開始時間覆蓋 wav 文件

Pydub from_mp3提供[Errno 2]没有这样的文件或目录

使用PyDub删除wave文件开头和结尾处的静音

Python使用Pydub将mp3转换为wav

MySQL将两个结果结合在一起?

将两个 javascript 事件结合在一起不起作用

如何将typedef的结构与实例创建结合在一起?

将团购与窗口功能结合在一起?

Flutter Android将Alarmmanager与通知结合在一起