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

问题描述 投票:0回答:1

所以,我有一个持续时间很长的音频文件。我有重要部分的手动注释(以秒为单位的开始和结束持续时间),我需要从文本文件中的整个音频中获取这些重要部分。我已将此文本文件转换为嵌套列表,其中每个列表都有 [start , end]

整个列表看起来像 [[start1,end1],[start2,end2]......]

我需要做的是浏览上面显示的注释列表,获取一个时间戳(开始和结束时间子列表),然后从整个原始音频中裁剪这部分,然后是下一个时间戳并从整个音频中裁剪该部分,然后很快。我知道我需要确保时间参考必须与第一个未经编辑的原始音频一致。

请注意,时间戳是浮点值,保持它们原样非常重要。下一步是从裁剪后的音频文件中提取音频特征,例如 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 是完全愚蠢的,但是我如何将以秒为单位的持续时间与读取的音频文件的索引相关联?解决这个问题的最佳方法是什么?

python audio scipy wav audio-processing
1个回答
0
投票

试试 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吧

© www.soinside.com 2019 - 2024. All rights reserved.