我慢慢地致力于这哪里会是非常有用的,如果该计算机可以找到一个项目,其中在发生某种样本的MP3文件。我将这个问题限制为一个相当准确的音频片段,而不仅仅是同一乐队在不同唱片中的歌曲中的合唱,这将成为某种机器学习问题。我正在考虑,如果它没有添加噪音并且来自同一文件,那么应该可以在不进行机器学习的情况下找到发生它的时间,就像grep可以在文本文件中找到出现单词的行一样。
如果您没有mp3播放器,可以解决公共领域的网络上可用音乐的问题,因此没有人抱怨:
curl https://web.archive.org/web/20041019004300/http://www.navyband.navy.mil/anthems/ANTHEMS/United%20Kingdom.mp3 --output godsavethequeen.mp3
一分钟长:
exiftool godsavethequeen.mp3 | grep Duration
Duration : 0:01:03 (approx)
现在切出30到33秒之间的时间(该时间段会拉啦啦啦..):
ffmpeg -ss 30 -to 33 -i godsavethequeen.mp3 gstq_sample.mp3
文件夹中的两个文件:
$ ls -la
-rw-r--r-- 1 cardamom cardamom 48736 Jun 23 00:08 gstq_sample.mp3
-rw-r--r-- 1 cardamom cardamom 1007055 Jun 22 23:57 godsavethequeen.mp3
由于某种原因,exiftool似乎高估了样本的持续时间:
$ exiftool gstq_sample.mp3 | grep Duration
Duration : 6.09 s (approx)
..但我想它只是像它告诉你的那样近似。
这是什么之后:
$ findsoundsample gstq_sample.mp3 godsavethequeen.mp3
start 30 end 33
如果它是bash脚本或python解决方案,即使使用某种python库,也很高兴。有时,如果您使用了错误的工具,则该解决方案可能会起作用,但看上去却很糟糕,因此无论哪种工具都更合适。这是一分钟的mp3,完全没有考虑过性能,而是想要一些可伸缩性,例如在半小时内找到十秒钟。
在尝试自己解决此问题时,一直在寻找以下资源:
https://github.com/craigfrancis/audio-detect
https://madmom.readthedocs.io/en/latest/introduction.html
https://github.com/aubio/aubio
aubionset
是一个很好的候选人
https://willdrevo.com/fingerprinting-and-audio-recognition-with-python/
正如Carson的答案所建议的,一旦将文件转换为.wav格式,音频处理就会变得容易得多。
您可以在阅读python中的mp3时使用Wernight的答案:
ffmpeg -i godsavethequeen.mp3 -vn -acodec pcm_s16le -ac 1 -ar 44100 -f wav godsavethequeen.wav
ffmpeg -i gstq_sample.mp3 -vn -acodec pcm_s16le -ac 1 -ar 44100 -f wav gstq_sample.wav
然后,找到样本的位置主要是获得源(在这种情况下)与样本之间的互相关函数的峰值godsavethequeen.wav
以寻找(gstq_sample.wav
)的问题。从本质上讲,这将找到样本看起来最像源中对应部分的偏移。可以使用python使用来完成scipy.signal.correlate
。
扔一个小的python脚本来做就是这样:
import numpy as np
import sys
from scipy.io import wavfile
from scipy import signal
snippet = sys.argv[1]
source = sys.argv[2]
# read the sample to look for
rate_snippet, snippet = wavfile.read(snippet);
snippet = np.array(snippet, dtype='float')
# read the source
rate, source = wavfile.read(source);
source = np.array(source, dtype='float')
# resample such that both signals are at the same sampling rate (if required)
if rate != rate_snippet:
num = int(np.round(rate*len(snippet)/rate_snippet))
snippet = signal.resample(snippet, num)
# compute the cross-correlation
z = signal.correlate(source, snippet);
peak = np.argmax(np.abs(z))
start = (peak-len(snippet)+1)/rate
end = peak/rate
print("start {} end {}".format(start, end))
请注意,为方便起见,我进行了检查以确保两个.wav文件具有相同的采样率(并根据需要重新采样),但是当您使用.mp3格式将它们转换时,也可以选择确保它们始终相同。对...的-ar 44100
论点ffmpeg
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句