如何比较两个或多个音频文件并获取音频不同的时间码?

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

我正在使用Python。我有两个音频文件,其中一个是原始的,一个是编辑过的(一半是原始的,一半是插入的音频)。

我使用过像inaSpeechSegmenter语音识别这样的库。使用这些我能够发现音频在音乐、语音或无音频方面是否有所不同。此外,我还可以使用 inaSpeechSegmenter 找到音频在 first 位置不同的时间。但是,当音频在多个地方不同时,我无法找到时间码。

我也没有找到任何可以帮助我解决问题的API。

我希望得到一些想法和建议,谢谢。

python audio speech-recognition
1个回答
1
投票

我将讨论两个音频文件由逐个样本相同或不同的区域组成的情况(例如插入的音频)。为了识别不匹配区域,您不需要任何高级信号处理。

首先你需要将音频文件加载到Python中。如果您的音频文件是“.wav”文件,您可以使用 python 内置

wave
模块。如果您还需要处理其他类型的音频文件(ogg、flac),一个不错的选择是
soundfile
,您可以通过
pip
安装(请注意,它不支持mp3文件)。

import soundfile
import numpy as np

signal_1, samplerate_1 = soundfile.read("audiofile_1.wav")
signal_2, samplerate_2 = soundfile.read("audiofile_2.wav")

我们假设

samplerate_1 == samplerate_2
len(signal_1) == len(signal_2)
。您可以像这样找到样本差异:

mismatch = (signal_1 != signal_2).astype(np.int)

这是一个与信号大小相同的数组,在信号不同的位置其值为 1,在其他位置为 0。现在,如果您对信号不同的区域感兴趣,您可以使用以下命令找到不匹配从 0 到 1(不匹配区域的开始)以及从 1 回到 0(不匹配区域的结束)的位置

np.diff
np.where
功能:

region_starts = np.where(np.diff(np.r_[0, mismatch, 0]) == 1)[0]
region_ends = np.where(np.diff(np.r_[0, mismatch, 0]) == -1)[0]

为了使开始/结束位置正确,

mismatch
用前导和尾随 0 填充(使用
np.r_[]
)。现在您可以将每个区域的开始/结束时间配对,然后除以采样率以获得以秒为单位的时间戳:

mismatching_regions = np.column_stack((region_starts, region_ends))
mismatching_regions /= samplerate_1
© www.soinside.com 2019 - 2024. All rights reserved.