当前位置: 首页 > 面试题库 >

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

印季
2023-03-14
问题内容

我有两个脚本,其中一个脚本拆分一定长度的音频,另一个脚本在每次无声段落时都拆分音频。仅在经过一定时间后,才可以在静音时分割音频吗?我需要在不少于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问题上发布了此内容



 类似资料:
  • 有时候希望指定两个节点之间的最小长度,可以使用minlen这个属性实现,如果必要的话,还可以使用invisible属性让这个节点隐藏。 [ Aachen ] --> [ Bonn ] --> [ Coburg ] [ Aue ] --> { minlen: 3; } [ Cuxhaven ] +--------+ +------+ +----------+ | Aachen |

  • 我有一个Api,它要求我在发送实际文件之前发送文件的字节大小。当我在第一个Api调用中对要发送的文件调用时,它将返回。 null 结果证明的是正确的。因此,在调用时,必须修改或增加。

  • 我正在使用PyCharm社区版2016,我注意到我无法打开大型数据输入文件或日志(20MB)。编辑简单地说“文件XXX太大(大小)”。 不仅如此,似乎没有办法改变限制。官方文档提到了一种增加使用intellisense的最大大小的方法,但根本没有增加可以打开的文件的最大大小。这是真的吗?这真的是一个完全无法打开大型日志的IDE吗?

  • 控制器文件只是调用服务方法。 服务类别: 我想密码是在行中散列后验证的: 如何在散列和保存之前验证此密码? 如有任何帮助,不胜感激。提前谢了。

  • 我不确定这是否可以使用正则表达式。我会尝试使用正则表达式,但如果不可能,我会切换到双重验证。 我的数据库(postgresql)接受为15,6(最多15位,最多6位小数),因此如果我有10位整数,我可以有5位小数。小数分隔符被忽略。 我目前有一个正则表达式(逗号是小数分隔符): 它不验证总长度,只验证左侧的数字。但由于用户也可以键入点(千位分隔符),我有一个怪物:

  • 问题内容: 我有这个设置: HTML : CSS : 通过此设置,它可以在iPhone上运行,但不能在浏览器中运行。 是因为我已经在meta中,也许已经在? 问题答案: 我发现最好的方法是为较旧的浏览器编写默认CSS,因为较旧的浏览器包括5.5、6、7和8。无法读取@media。当我使用@media时,我会这样使用: 但是,您可以使用@media进行任何操作,这只是为所有浏览器构建样式时最适合我的

  • 我在Windows 10,我有anaconda安装,但我想创建一个独立的可执行文件在一个新的,干净的最小环境使用python 3.5.所以我做了一些测试: 我创建了一个python脚本test1.py在文件夹testenv只有: 然后我创建了环境,安装了pyinstaller并创建了可执行文件 它创造了我大约6Mb的test1.exe 测试2:我修改了测试1。具体如下: 我在环境中安装了panda

  • 使用resteasy处理多部分/表单数据请求时,如何控制最大文件大小和/或最大请求大小? 我的代码如下所示: 通过Servlet,我可以使用MultipartConfig注释控制内容。 所以我在考虑绕过resteish并使用注入并在web.xml中配置我的servlet,但我不确定副作用。