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之类的,效果都一样。