我有一个音频文件 我有一堆[开始,结束]时间戳段。
我想要达到的目的: 说音频是6:00分钟 我的细分是:[[0.0,4.0],[8.0,12.0],[16.0,20.0],[24.0,28.0]]
将这两个传递给sox + python之后,out put应该是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脚本。
PADDING:
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
TRIMMING:
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
使用来自终端的输出来运行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
示例细分[[开始,结束],[,]]:[[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时,除了提供的段中的那些部分之外,音频中的所有内容都应该被静音。
答案 0 :(得分:1)
我可能会使用zsh
脚本和awk
解决此问题。
如果时间是这样的:
<强>位强>
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
像这样计算沉默位:
awk '{ print $1, $2, $1 - p; p = $2 }' bits
输出:
1.6 8.3 1.6
13.2 33.7 4.9
35.0 38.0 1.3
42.0 51.0 4
70.2 73.7 19.2
90.0 99.2 16.3
123.0 131.1 23.8
您现在可以使用以下内容生成所需的命令行:
args="sox "
m=file.mp3
awk '{ print $1, $2, $1 - p; p = $2 }' bits |
while read s e n; do
args+="\"|sox -n -p trim 0 $n\" "
args+="\"|sox $m -p trim $s =$e remix 1\" "
done
args+="out.wav"
echo "$args"
将其导入/bin/sh
以执行:
... | sh
sox
的输出现在应该在 out.wav 中。
答案 1 :(得分:0)
我能够通过解决方法实现。
请参阅:create new list from list of lists in python by grouping
我所做的是创建一个包含段之间区域的新列表,然后将其传递给sox。目前,我传给sox的任何东西都被删除了。所以我计算了要删除的区域,然后将其传递给sox。它运作得很好。
解决方案仍然倒置,但我不必更改sox中的任何内容。
我不接受我的答案作为答案。希望有人能够提出一个涉及修改sox命令的解决方案,而不必像我那样重新计算分段。