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

使用sox和python根据时间戳列表使音频区域静音

管炳
2023-03-14
问题内容

我有一个音频文件。
我有一堆[开始,结束]时间戳片段。

我想实现的目标: 说音频长6:00分钟。
我拥有的细分是:[[0.0,4.0],[8.0,12.0],[16.0,20.0],[24.0,28.0]]

在将这两个参数传递给sox + python之后,输出应该是6分钟长的音频,但仅在分段传递的时间内才具有音频。

即我想将time stamps原始音频传递给SOX + python,以便生成除所有与传递的段相对应的部分之外的所有其他部分均被静音的音频

经过数天的谷歌搜索后,我没有达到上面的目标,但有点相反了:

更新,更简洁的代码+示例:像
sox这样的命令需要填充和修剪

SOX__SILENCE = 'sox "{inputaudio}" -c 1 "{outputaudio}" {padding}{trimming}'

测试的随机细分:

# random segments:
A= [[0.0,16.0]]
b=[[1.0,2.0]]
z= [[1.6, 8.3], [13.2, 33.7], [35.0,38.0], [42.0,51.0], [70.2,73.7], [90.0,99.2], [123.0,131.1]]
q= [[0.0,4.0], [8.0,12.0], [16.0,20.0], [24.0,28.0]]

一个小的python脚本,用于生成填充和修剪。

填充:

def get_pad_pattern_from_timestamps(my_segments):
        padding = 'pad'
        for segment in my_segments:
            duration = str(segment[1] - segment[0])
            padding = padding + ' ' + duration + '@' + str(segment[0])
        return padding
​
print get_pad_pattern_from_timestamps(A)
print get_pad_pattern_from_timestamps(b)
print get_pad_pattern_from_timestamps(z)
print get_pad_pattern_from_timestamps(q)

从^输出:

pad 16.0@0.0
pad 1.0@1.0
pad 6.7@1.6 20.5@13.2 3.0@35.0 9.0@42.0 3.5@70.2 9.2@90.0 8.1@123.0
pad 4.0@0.0 4.0@8.0 4.0@16.0 4.0@24.0 4.0@32.0 4.0@40.0

修剪:

def get_trimm_pattern_from_timestamps(my_segments):
        trimming = ''
        for segment in my_segments:
            duration = str(segment[1] - segment[0])
            trimming = trimming + ' trim 0 ' + str(segment[0]) + ' 0 ' + duration + ' ' + duration
        return trimming

print get_trimm_pattern_from_timestamps(A)
print get_trimm_pattern_from_timestamps(b)
print("\n")
print get_trimm_pattern_from_timestamps(z)
print("\n")
print get_trimm_pattern_from_timestamps(q)
print("\n")

修剪输出:

trim 0 0.0 0 16.0 16.0
 trim 0 1.0 0 1.0 1.0


 trim 0 1.6 0 6.7 6.7 trim 0 13.2 0 20.5 20.5 trim 0 35.0 0 3.0 3.0 trim 0 42.0 0 9.0 9.0 trim 0 70.2 0 3.5 3.5 trim 0 90.0 0 9.2 9.2 trim 0 123.0 0 8.1 8.1


 trim 0 0.0 0 4.0 4.0 trim 0 8.0 0 4.0 4.0 trim 0 16.0 0 4.0 4.0 trim 0 24.0 0 4.0 4.0 trim 0 32.0 0 4.0 4.0 trim 0 40.0 0 4.0 4.0

使用来自终端的about输出来运行SOX:

Padding:

    sox dinners.mp3 -c 1 testlongpad.mp3 pad 4.0@0.0 4.0@8.0 4.0@16.0 4.0@24.0

Trimming:

    sox dinners.mp3 -c 1 testrim.mp3 trim 0 0.0 0 16.0 16.0

Padd and trimm:

    sox dinners.mp3 -c 1 testlongpadtrim.mp3 pad 4.0@0.0 4.0@8.0 4.0@16.0 4.0@24.0 trim 0 0.0 0 4.0 4.0 trim 0 8.0 0 4.0 4.0 trim 0 16.0 0 4.0 4.0 trim 0 24.0 0 4.0 4.0

如果S是我的细分市场,那么NS就是其他一切。在^方法中,我通过了NS,并且NS从音频中删除了。

我想要达到的目标仍然相同,但是方式不同,即我要通过,S以便仅S 保留与之对应的音频部分。

PS:我的问题非常具体,我是音频处理的新手,不确定如何进行。请不要以太宽泛之类来结束问题。我很乐意提供更多细节以进行澄清。最后,这不是硬件问题。这是一个个人项目。

音频样本: https
//www.dropbox.com/s/1p27nfwney42ka2/LAZY_SALON_-
03
-_Hot_Dinners.mp3?dl =
0
__

样本句段[[start,end],[,]]: [[1.6, 8.3], [13.2, 33.7], [35.0,38.0], [42.0,51.0], [70.2,73.7], [90.0,99.2], [123.0,131.1]]

因此,当这些时间戳与音频一起传递给sox / python时,音频中除提供的段中的那些部分以外的所有内容都应被静音。


问题答案:

我能够采用解决方法来实施。

请参阅:通过分组从python中的列表列表创建新列表

我所做的是创建一个包含段之间区域的新列表,然后将其传递给sox。此刻,我传递给袜子的任何东西都被清除了。因此,我计算了要删除的区域,然后将其传递给sox。效果很好。

解决方案仍然是颠倒的,但我不必更改袜中的任何东西。

我不会接受我的答案作为答案。希望有人能够提出一种解决方案,该方案涉及修改sox命令,而不必像我一样重新计算段。



 类似资料:
  • 我不太理解时间戳的用法, 例如 用户创建文章,他们可以选择,系统也会自动存储。 a.我是否应该使和具有时区并设置UTC的时间戳? b.用户post字符串,然后将其转换为utc时间戳,如下所示使用并存储,当某人选择这一行时,将其显示为用户客户端时间反向使用 c.我使用到,是不是意味着服务器时间?我做得对吗? 我的想法是,我总是在数据库中插入utc时区时间戳,无论用户/客户端读取的地方,都将数据转换为

  • 我正尝试使用以下命令与最新的ffmpeg构建从我的.mp3文件中删除静默: 但是,会产生以下输出: 感谢任何帮助!

  • cadence默认使用的时区是什么? 我们如何根据时区更改cron表达式?例如,如果用户从不同的时区输入cron时间表,而不是卡顿的服务器时区,假设用户在格林尼治标准时间5每天下午1点输入,那么它应该在服务器上午9点运行(假设卡顿的服务器时区仅为格林尼治标准时间)。 我正在使用golang cadence客户端编写工作流。感谢任何帮助。

  • 问题内容: 我有200多个MP3文件,我需要使用静音检测来拆分其中的每个文件。我尝试了Audacity和WavePad,但它们没有批处理过程,将它们一一制作很慢。 场景如下: 分割曲目,而静音2秒或更长时间 然后在这些音轨的开头和结尾添加0.5 s并将其另存为.mp3 BitRate 192立体声 标准化卷以确保所有文件的卷和质量相同 我尝试了FFmpeg,但没有成功。 问题答案: 我发现pydu

  • 问题内容: 我尝试通过使用以下命令使用视频的开始和结束时间剪切视频 通过使用上述命令,我想将视频从剪切为。但是,这并不是在这段时间之间剪切视频,而是在前11秒内剪切视频。谁能帮我解决这个问题? 编辑1: 我试图通过使用mark4o建议的以下命令进行剪切 但是显示以下错误。 编码器“ aac”是实验性的,但未启用实验性编解码器 所以我在命令中添加了 现在工作正常。 问题答案: 您可能在3秒标记处没有

  • 我想用树莓派实时捕捉带有时间戳的视频帧。视频由USB摄像头使用python代码中的ffmpeg()函数制作。如何保存当前由USB摄像头在树莓派中制作的视频帧? 我尝试使用opencv的三个函数。cv2。VideoCapture可检测视频,保存帧。以下是代码,为简洁起见,未提及包含的库。 该代码保存了以前由网络摄像头制作的视频帧。它不保存当前由网络摄像头录制的视频帧。