scipy 如何根据列表中的时间戳裁剪音频文件

sz81bmfz  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(132)

所以,我有一个音频文件,这是非常长的持续时间。我有手动注解(开始和结束持续时间秒)的重要部分,我需要从整个音频在一个文本文件。我已经转换成一个嵌套的列表,在每个列表中有[开始,结束]
整个列表看起来像[[* 开始1 结束1 *],[* 开始2 结束2 *]......]
我需要做的是浏览上面所示的注解列表,获得一个时间戳(开始和结束时间子列表),然后从整个原始音频中裁剪这一部分,然后是下一个时间戳,并从整个音频中裁剪出该部分,等等。我理解我需要确保定时的参考必须与第一个未编辑的原始音频一致。
注意,时间戳是浮点值,保持它们不变是非常重要的。2下一步是从裁剪的音频文件中提取音频特征,如mfcc。

fs1, y1 = scipy.io.wavfile.read(file_path)
l1 = numpy.array(annotation_list)   
newWavFileAsList = []
for elem in l1:
    startRead = elem[0]
    endRead = elem[1]
    newWavFileAsList.extend(y1[startRead:endRead])
newWavFile = numpy.array(newWavFileAsList)

scipy.io.wavfile.write(sample, fs1, newWavFile)

我已经尝试了上面的方法,但是它显示了一个错误,索引startRead和endRead必须是整数。我知道使用这些索引引用y1是完全愚蠢的,但是我如何将以秒为单位的持续时间与读取的音频文件的索引联系起来呢?你建议我如何处理这个问题?

oknrviil

oknrviil1#

试试Pydub!:)

from pydub import AudioSegment

def trim_audio(intervals, input_file_path, output_file_path):
    # load the audio file
    audio = AudioSegment.from_file(input_file_path)

    # iterate over the list of time intervals
    for i, (start_time, end_time) in enumerate(intervals):
        # extract the segment of the audio
        segment = audio[start_time*1000:end_time*1000]

        # construct the output file path
        output_file_path_i = f"{output_file_path}_{i}.wav"

        # export the segment to a file
        segment.export(output_file_path_i, format='wav')

# test it out
print("Trimming audio...")
trim_audio([[0, 1], [1, 2]], "test_input.wav", "test_output")
print("...done! <3")

这段代码对我很有效。如果你遇到任何问题,请给我Lmk。
编辑:只是想让你知道,我尝试了这个浮动,它的工作很好。我看了一下,它似乎应该表现奇怪的浮动,但它显然工作得很好。我尝试了长的奇怪的像2.2352344,似乎还可以。
另一个编辑:我刚想起来你可能需要ffmpeg才能使用Pydub。要安装ffmpeg,去下载它,解压缩它,然后把它的路径添加到你的Windows路径变量中。

相关问题