shazam听歌识曲算法的解析与听歌识曲python实现的分析-1 读取歌曲
Summary: 本blog会分为多个部分,每个部分会记录编写程序之中所需要的知识点。第一部分就是关于读取歌曲的。
 shazam

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

Latest Updated Time:2019-05-20 17:13:27