使用Python对音频进行特征提取(二)

在几年前写的使用Python对音频进行特征提取使用的是人为特征的方法进行特征提取的,近些年随着深度学习的普及,这里尝试使用深度学习方法进行特征提取。

数据集测试

之前的数据集找不到了,这个数据其实是kaggle的一个数据:www.kaggle.com/datasets/ca...

也可以在百度云下载链接: pan.baidu.com/s/177E_2VhN... 提取码: c5nh

音频特征提取

相比传统的方法一堆特征筛选,深度学习这里其实就是一个黑盒。

这里使用了一个音频编码器模型:teticio/audio-encoder

This model encodes audio files into vectors of 100 dimensions. It was trained on a million Spotify playlists and tracks. The details can be found here.

也就是输入一个audio文件名,可以转为100维的特征向量。

css 复制代码
from audiodiffusion.audio_encoder import AudioEncoder

audio_encoder = AudioEncoder.from_pretrained("teticio/audio-encoder")
audio_encoder.encode(["./genres/blues/blues.00043.au"]).numpy()[0].tolist()

可以看到这里把音频直接编码特征了。

然后把所有的数据都转成100维,构成数据集。

py 复制代码
import numpy as np
import os

genres = 'blues classical country disco hiphop jazz metal pop reggae rock'.split()

data_set = []
label_set = []

label2id = {genre:i for i,genre in enumerate(genres)}
id2label = {i:genre for i,genre in enumerate(genres)}

print(label2id)

for g in genres:
    print(g)
    for filename in os.listdir(f'./genres/{g}/'):
        songname = f'./genres/{g}/{filename}'
        print(songname)
        data_set.append(audio_encoder.encode([songname]).numpy()[0].tolist())
        label_set.append(label2id[g])

然后简单的标准化一下。

ini 复制代码
from sklearn.preprocessing import StandardScaler
from keras.utils import to_categorical

scaler = StandardScaler()
X = scaler.fit_transform(np.array(data_set, dtype = float))
y = to_categorical(np.array(label_set))

可以看到这里有1000条数据,10个类别。

ini 复制代码
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

模型训练

这里模型训练和之前一样,先构建一个全连接模型。

css 复制代码
from keras import models
from keras.layers import Dense, Dropout

def create_model():
    model = models.Sequential()
    model.add(Dense(256, activation='relu', input_shape=(X_train.shape[1],)))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(64, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(10, activation='softmax'))

    return model

model = create_model()

然后训练。

ini 复制代码
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
ini 复制代码
model.fit(X_train, y_train, epochs=50, batch_size=128)

最后进行测试。

scss 复制代码
test_loss, test_acc = model.evaluate(X_test,y_test)
print('test_acc: ',test_acc)

相比使用人工提取的特征,这次准度比之前的高一些。

相关推荐
地平线开发者42 分钟前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮1 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者2 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考2 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
冬奇Lab2 小时前
OpenClaw 源码精读(2):Channel & Routing——一条消息如何找到它的 Agent?
人工智能·开源·源码阅读
冬奇Lab2 小时前
一天一个开源项目(第38篇):Claude Code Telegram - 用 Telegram 远程用 Claude Code,随时随地聊项目
人工智能·开源·资讯
孟健4 小时前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
格砸4 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
可观测性用观测云4 小时前
可观测性 4.0:教系统如何思考
人工智能
sunny8654 小时前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github