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

作者 | 唯心不易@博客园

http://www.cnblogs.com/chuxiuhong/p/6063602.html

听歌识曲,顾名思义,用设备“听”歌曲,然后它要告诉你这是首什么歌。而且十之八九它还得把这首歌给你播放出来。这样的功能在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轴分别是我们的数组下标和数组元素,现在变成了频率(这么说不准确,但在这里这样理解没错)和在这个频率上的分量大小。

上面两幅图来自知乎,非常感谢Heinrich写的文章(http://daily.zhihu.com/story/3935067)

怎么理解频域这个事情呢?对于我们信号处理不是很懂

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值