美文网首页
项目(音乐系统分类)

项目(音乐系统分类)

作者: longsan0918 | 来源:发表于2019-02-20 22:24 被阅读4次

1 音乐系统分类概述

很多音乐网站有推荐音乐的功能,一般这种推荐可以使用专门的推荐算法产生,也可使用音乐本身的标签来进行推荐

image.png C6C9F609-E93F-4F04-9E8D-06052A19DF1F.png
音乐标签

主要体现的是音乐的类型,可以根据声音的特性对音乐类型做出判断,从而得到标签值

image.png

MFCC(Mel Frequency Cepstral Coefficents) 梅尔频率倒谱系数

94825CC9-F7C6-4C40-9CCE-3DF03C7FEBB7.png
[MFCC参考资料]https://www.cnblogs.com/BaroC/p/4283380.html
wav格式的音乐文件处理

使用scipy库中方法对wav格式的音乐文件进行读取,然后使用python_speech_features中MFCC相关方法对音频数据进行特征抽取

pip install python_speech_features

FA3977FF-5E54-4788-8828-1D2A72D2A19E.png
.mp3格式的音乐文件处理

.mp3或者非wav格式的文件无法使用scipy库进行读取,需要转格式成.wav格式
转格式操作 : 使用pydub库中的AudioSegment操作(需要ffmpeg/libv服务)

参考资料 pydub github链接
参考资料 pydub官网
参考资料 pydub API

pip install pydub
C2AE0A30-CD6C-4F89-AFF0-18AA32B11F21.png
# -*- coding: utf-8 -*-
# @Time    : 2019/2/18 3:39 PM
# @Author  : scl
# @Email   : 1163820757@qq.com
# @File    : pydub_demo.py
# @Software: PyCharm

'''
声音频率在20HZ~20kHz之间的声波,称为音频
音频的采样频率
22050 常用的的采样频率
44100 cd音质
超过48000/960000的采样对人耳没有多大意义
'''

from  pydub import AudioSegment
import numpy as np
import array

# 1 读取数据
path = './data/20Hz-stero.wav'

song = AudioSegment.from_file(file=path)

print(song)

# 2 音频文件相关属性
size = len(song)
print("音频文件的长度信息(ms):{}".format(size))

channel = song.channels
print('音频通道数目:{}'.format(channel))

frame_rate = song.frame_rate
print('音频的抽样频率:{}'.format(frame_rate))

sample_width = song.sample_width
print('音频的样本宽度:{}'.format(sample_width))

# <pydub.audio_segment.AudioSegment object at 0x108d0f198>
# 音频文件的长度信息(ms):300000
# 音频通道数目:2
# 音频的抽样频率:44100
# 音频的样本宽度:2 采样位数 常见1(8bit) 2(16bit cd标准) 4(32bit)

# 3 设置相关特征属性
# 如果降低音乐通道会带来音频的损失 但是增加不会带来损失(频率和样本宽度一样)
song = song.set_channels(channels=1)
song = song.set_frame_rate(frame_rate=22050)
song = song.set_sample_width(sample_width=1)

print('---- 设置后 -----')
print('音频的长度信息.{}'.format(len(song)))
print('音频的通道数目.{}'.format(song.channels))
print('音频的抽样频率.{}'.format(song.frame_rate))
print('音频的样本宽度.{}'.format(song.sample_width))


# 4 音频文件的保存
song.export('./data/out/01.wav',format='wav')


# 5 获取部分数据并保存
# 前10s的数据
song[:10000].export('./data/out/02.wav',format='wav')
# 后10s的数据
song[-10000:].export('./data/out/03.wav',format='wav')

# 中间10s的数据
mid = len(song)//2
song[mid - 5000 : mid + 5000].export('./data/out/04.wav',format='wav')


# 6 填充保存
# a. 将song对象转换成numpy的array对象
samples = np.array(song.get_array_of_samples()).reshape(-1)
print(samples.shape)
print(samples[10:])
print(samples[:10])

# b. 填充操作
append_size = 60 * song.channels * song.frame_rate

'''
pad_width: 给定在什么位置填充 以及填充多少个值  在samples数组前面填充append_size个值 后面添加0个值
mode: 填充方式 constant表示常量填充 常量为constant_values
constant_values: 填充常量
'''
samples = np.pad(samples,pad_width=(append_size,0),mode='constant',constant_values=(0, 0))
print(samples.shape)
print(samples[:10])

# c 将截取的数组转为segment对象
song = song._spawn(array.array(song.array_type, samples))
song.export('./data/out/05.wav',format='wav')


# 对音乐文件进行处理
# 音调 音频增大和减小
(song + 100).export('./data/out/07.wav',format='wav')
(song - 100).export('./data/out/08.wav',format='wav')

samples = np.array(song.get_array_of_samples()).reshape(-1)
samples = (samples * 2).astype(np.int)
song = song._spawn(array.array(song.array_type,samples))
song.export('./data/out/09.wav',format='wav')


# 8 音乐循环 2倍
(song * 2).export('./data/out/10.wav',format = 'wav')

面试题
视频面试.jpg
# -*- coding: utf-8 -*-
# @Time    : 2019/2/20 3:35 PM
# @Author  : scl
# @Email   : 1163820757@qq.com
# @File    : 面试代码.py
# @Software: PyCharm

'''
代码实现:
input 目录下有若干个.wav格式的音频文件 编写一段代码将input下的每个音频文件等分成
长度为2s的音频文件 并存放在output目录下

'''
from pydub import AudioSegment
import os

# glob 是文件操作相关模块
import glob
file_paths = glob.glob('./input/*.wav')

out_file_path = './output'

if not os.path.exists(out_file_path):
    os.makedirs(out_file_path)

index = 1
for file_path in file_paths:
    song = AudioSegment.from_file(file_path)
    song_length = len(song)
    start = 0
    count = 1;
    while start < song_length:
        end = int(min(start+2000,song_length))
        song[start:end].export(out_file_path + '/{}_{}.wav'.format(index,count),format='wav')
        start = end
        count += 1
    index += 1

print('音频文件切割完成')

相关文章

网友评论

      本文标题:项目(音乐系统分类)

      本文链接:https://www.haomeiwen.com/subject/tteaeqtx.html