shazam听歌识曲算法的解析与听歌识曲python实现的分析-1 读取歌曲
###shazam听歌识曲算法的解析与听歌识曲python实现的分析-1 读取歌曲
开新坑,歌曲识别计划。
使用的算法是《An Industrial-Strength Audio Search Algorithm》,其中部分代码借鉴了Github的dejavu项目。
关于读取歌曲,首先需要安装一个python库. pydub。你可以使用pip3 install pydub来安装。
audiofile = AudioSegment.from_file(filepath)
# data = audiofile.get_array_of_samples()
# Stereo audio array is in form of [sample_1_L, sample_1_R, sample_2_L, sample_2_R, …]
data = np.fromstring(audiofile.raw_data, np.int16)
channels = []
# Get data for different channel
for channel in range(audiofile.channels):
channels.append(data[channel::audiofile.channels])
`AudioSegment.from_file(filepath)`可以读取大部分音频,wav除外。在项目中,我们需要直接对音频信息进行操作,我们可以使用raw_data 来获取最原始的数据。另外我们需要知道音频的采样速率,用frame_rate 来获取。
由于现在大部分音频都是立体声的(有多个通道),所以,对于每一个通道我们都需要分开处理。raw_data 返回的格式是这样子的[sample_1_L, sample_1_R, sample_2_L, sample_2_R, …] (在这里有左声道和右声道),分开不同的通道通道可以用切片来做`data[channel::audiofile.channels]`。
这样子,读取音频的工作就完成了。
另外,读取音频的时候可以计算一下文件的sha256值来作为这一首歌的唯一识别码。
def generateFilehash(filepath, blocksize=2 ** 16):
sha = sha256()
with open(filepath, "rb") as f:
while True:
buf = f.read(blocksize)
if not buf:
break
sha.update(buf)
return sha.hexdigest().upper()
其中,sha256可以替换为其他,如md5,sha1,sha128之类的,效果都一样。