一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
前言
这里介绍一种实际效果不咋地的个语音分类(垃圾分类方向),仅供大家参考使用,若有更好的方案下次定将奉上!
一.投机取巧流程
1.1 提取语音的时域信号
1.2 绘制时域信号图像
1.3 将语音信号转变为图像分类或者是数据分类
二. Voice2Img(数据集的制作)
在这里我们需要对文件夹下同类型的语音进行提取时域信号并绘制图像,具体流程为:
2.1 获取文件夹下所有的.m4a型文件
2.2 获取语音名
2.3 使用audioread读取语音名
2.4 设置采样时间
2.5 创建fig
2.6 提取左声道(或者右声道)
2.7 输入信号的时域信号
2.8 将frame变换成imwrite函数可以识别的格式
2.9 提取语音名的前缀(不包含.m4a)
2.10 存储绘制好的时域图像
参考代码:
clc
clear
close all
%%
file_path = 'D:\垃圾\有害垃圾\';% 需要处理的图像文件夹的路径
m4a_path_list = dir(strcat(file_path,'*.m4a'));%获取该文件夹中所有m4a的语音
m4a_num = length(m4a_path_list);%获取语音总数量
if m4a_num > 0 %有满足条件的语音
for j = 1:m4a_num %逐一读取语音
m4a_name = m4a_path_list(j).name;% 语音名
[y,fs]=audioread(strcat(file_path,m4a_name)); %将声音放于matlab中
T=1/fs; %采样时间
t=(0:length(y)-1)*T;%时间
f=(0:length(y)-1)*fs/length(y);
fig=figure;
yz=y(:,1);%左声道
plot(t,yz);%输入信号时域曲线
frame = getframe(fig); % 获取frame
img = frame2im(frame); % 将frame变换成imwrite函数可以识别的格式
% 取名
cell_str = strsplit(m4a_name,'.');%按照‘.’字符分开
image_name = cell_str{1,1};%去掉字符串后面的m4a
image_name = [image_name ,'.jpg'];
imwrite(img,strcat('D:\垃圾\语音识别\data\有害垃圾\',image_name)); %%保存图片 ,D:\traincar\newzheng\是储存修改图像后的文件夹
end
close all
end
复制代码
二. 经典的图像分类
这里我们采用目录式的数据集构造,使用的网络可以参考我往期的经典网络介绍,这里就不再重复赘述了。 这里着重介绍下在获取语音进行分类时候写到edit上的信息和播放你输入的语音(垃圾的名字)。
load voice.mat net
global img
YPred = classify(net,img);%预测数据
YPred_cellstr=cellstr(YPred);
set(handles.edit1,'string',YPred_cellstr)
t1 = strcmp(YPred_cellstr, '厨余垃圾');
t2 = strcmp(YPred_cellstr, '有害垃圾');
t3 = strcmp(YPred_cellstr, '可回收垃圾');
t4 = strcmp(YPred_cellstr, '其他垃圾');
if t1 == 1
[x,fs] = audioread('./垃圾分类/厨余垃圾.m4a');
sound(x,fs)
elseif t2 == 1
[x,fs] = audioread('./垃圾分类/有害垃圾.m4a');
sound(x,fs)
elseif t3 == 1
[x,fs] = audioread('./垃圾分类/可回收垃圾.m4a');
sound(x,fs)
elseif t4 == 1
[x,fs] = audioread('./垃圾分类/其他垃圾.m4a');
sound(x,fs)
复制代码
拓展
大家可以将图像转变为阿拉伯数据(纯数字模式,然后进行数据分类,例如BP\SVM之类的分类器)