首页 > 编程 > Python > 正文

听歌识曲--用python实现一个音乐检索器的功能

2020-02-23 04:06:53
字体:
来源:转载
供稿:网友

听歌识曲,顾名思义,用设备“听”歌曲,然后它要告诉你这是首什么歌。而且十之八九它还得把这首歌给你播放出来。这样的功能在QQ音乐等应用上早就出现了。我们今天来自己动手做一个自己的听歌识曲

我们设计的总体流程图很简单:

-----
录音部分
-----

我们要想“听”,就必须先有录音的过程。在我们的实验中,我们的曲库也要用我们的录音代码来进行录音,然后提取特征存进数据库。我们用下面这样的思路来录音

# coding=utf8import waveimport pyaudioclass recode(): def recode(self, CHUNK=44100, FORMAT=pyaudio.paInt16, CHANNELS=2, RATE=44100, RECORD_SECONDS=200,    WAVE_OUTPUT_FILENAME="record.wav"):  '''  :param CHUNK: 缓冲区大小  :param FORMAT: 采样大小  :param CHANNELS:通道数  :param RATE:采样率  :param RECORD_SECONDS:录的时间  :param WAVE_OUTPUT_FILENAME:输出文件路径  :return:  '''  p = pyaudio.PyAudio()  stream = p.open(format=FORMAT,      channels=CHANNELS,      rate=RATE,      input=True,      frames_per_buffer=CHUNK)  frames = []  for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):   data = stream.read(CHUNK)   frames.append(data)  stream.stop_stream()  stream.close()  p.terminate()  wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')  wf.setnchannels(CHANNELS)  wf.setsampwidth(p.get_sample_size(FORMAT))  wf.setframerate(RATE)  wf.writeframes(''.join(frames))  wf.close()if __name__ == '__main__': a = recode() a.recode(RECORD_SECONDS=30, WAVE_OUTPUT_FILENAME='record_pianai.wav')

我们录完的歌曲是个什么形式?

如果只看一个声道的话,他是一个一维数组,大概长成这个样子

我们把他按照索引值为横轴画出来,就是我们常常看见的音频的形式。

音频处理部分

我们在这里要写我们的核心代码。关键的“如何识别歌曲”。想想我们人类如何区分歌曲? 是靠想上面那样的一维数组吗?是靠歌曲的响度吗?都不是。

我们是通过耳朵所听到的特有的频率组成的序列来记忆歌曲的,所以我们想要写听歌识曲的话,就得在音频的频率序列上做文章。

复习一下什么是傅里叶变换。博主的《信号与系统》的课上的挺水,不过在课上虽然没有记下来具体的变换形式,但是感性的理解还是有的。

傅里叶变换的实质就是把时域信号变换成了频域信号。也就是原本X,Y轴分别是我们的数组下标和数组元素,现在变成了频率(这么说不准确,但在这里这样理解没错)和在这个频率上的分量大小。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表