[Audio processing] 数据集生成 & 性别年龄分类训练 Python
1、重命名,Python中文路径各种错误,所以需要先将所有文件的路径名全都改成中文。用的是MAC系统,所以WIN下的命令行批处理没法解决,所以用C来完成
// Created by Carl on 16.
// Copyright (c) 2016年 Carl. All rights reserved.
// #include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <unistd.h>
using namespace std; void getFileList()
{
string sourceDir = "/Users/karl/Work/database/rawdata/children_CN/";
string targetDir = "/Users/karl/Work/database/rawdata/children/";
DIR *dir;
struct dirent *ptr;
int i = ;
if ((dir=opendir(sourceDir.c_str())) == NULL)
{
perror("Open dir error...");
exit();
}
while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")== || strcmp(ptr->d_name,"..")==) ///current dir OR parrent
continue;
else if(ptr->d_type == )
{
printf("%s %s\n",(sourceDir + ptr->d_name).c_str(),(targetDir + to_string(i) + ".wav").c_str());
if(rename((sourceDir + ptr->d_name).c_str(), (targetDir + to_string(i++) + ".wav").c_str())<)
cout<<"error"<<endl;
else
cout<<"ok"<<endl;
} }
return;
} int main() {
getFileList();
return ;
}
2、然后再使用FFMPEG那篇文章写的Python代码,将所有音频文件转成统一格式
#coding=utf-8
#!/usr/bin/env python
'''CREATED:2016-03-08
Use example of ffmpeg
'''
import argparse
import sys
import os
import string
import subprocess as sp #Full path of ffmpeg
FFMPEG_BIN = "/Users/karl/Documents/python/audio/tool/ffmpeg"
#Full path of sourceDir
sourceDir = "/Users/karl/Work/database/rawdata/male/"
#Full path of targetDir
targetDir = "/Users/karl/Work/database/age/male/"
#Channel setting 1 for mono
ac = 1
#Sample frequency
sf = 16000
#Extension setting
ext = 'wav' def convert(sourceDir, targetDir, ac, sf, ext):
i = 0
if not os.path.exists(targetDir):
os.mkdir(targetDir)
files = os.listdir(sourceDir)
for f in files:
if f.endswith('.wav'):
command = [ FFMPEG_BIN,
'-i', os.path.join(sourceDir, f),
'-ac', str(ac),
'-ar', str(sf), os.path.join(targetDir, str(i) + "." + ext)]
i += 1
print command
pipe = sp.Popen(command, stdout = sp.PIPE, bufsize = 10**8) if __name__ == '__main__':
convert(sourceDir, targetDir, ac, sf, ext)
3、用时域上RMS去除静音帧(Optional)
#---Cut the silent head and tail of audio
def rmsdemo(y):
return np.sqrt((y**2).mean()) def cutheadntail(y, winlen, threshold):
totallen = y.shape[0]
num = totallen / winlen
i = 1
j = num
for i in range(num):
if rmsdemo(y[i * winlen : (i + 1) * winlen - 1]) > threshold:
break
for j in range(-1,0,-1):
if rmsdemo(y[i * winlen : (i + 1) * winlen - 1]) > threshold or j == i:
break
#percentage = (j - i + 1) * 1.0 / num;
#print(i, j, percentage)
yy = y[i * winlen : (j + 1) * winlen - 1]
return yy
4、用librosa提取特征,包括MFCC、DMFCC
from __future__ import print_function
import argparse
import sys
import os
import pprint
import sklearn as sl
import numpy as np
import librosa
import librosa.feature.spectral as f
import svmutil #---Feature extraction and store, including MFCC, DMFCC
def mfcclist(data_dir):
m = []
dm = []
for i in range(300):
filepath = os.path.join(data_dir, str(i) + '.wav')
print(filepath)
am, adm = mfccfile(filepath)
m.append(am)
dm.append(adm)
i += 1
np.savetxt("TrainFemaleMFCC",m,fmt='%s',newline='\n')
np.savetxt("TrainFemaleDMFCC",dm,fmt='%s',newline='\n')
#print(m)
#print(dm)
'''
fout = open(output_file,'w')
fout.write(str(am) + '\n')
fout.write(str(adm))
fout.close()
''' def mfccfile(input_file):
print('Loading ', input_file)
y, sr = librosa.load(input_file)
M = f.mfcc(y, sr, None, 13)
DM = M[::,1::] - M[::,0:-1:1]
am = np.mean(M, axis = 1)
adm = np.mean(DM, axis = 1)
return (am, adm) #---Loading stored features file
def loadfeatures(features_file):
fin = open(features_file, 'r')
features = [map(float,ln.strip().split(' '))
for ln in fin.read().splitlines() if ln.strip()]
#pprint.pprint(features)
print(features)
5、用libsvm训练和预测,包括归一化
#---SVM training and predicting process
def svmtraindemo(x, modelname, scalar):
x = scalar.transform(x)
#x = sl.preprocessing.scale(x)
x = x.tolist()
print(x)
y = [1.0] * 300 + [1] * 300 + [-1.0] * 600
model = svm_train(y, x, '-b 1')
svm_save_model(modelname + str(0), model)
p_label, p_acc, p_val = svm_predict(y[:1200], x[:1200], model, '-b 1') def svmpredictdemo(x, modelname, scalar):
x = scalar.transform(x)
#x = sl.preprocessing.scale(x)
x = x.tolist()
print(len(x))
y = [1.0] * 100 + [1] * 100 + [-1.0] * 200
m = svm_load_model(modelname + str(0))
print(p_label)
p_label, p_acc, p_val = svm_predict(y[:400], x[:400], m, '-b 1')
附:
1、经过试验,发现用无监督的方式,准确来说是基于规则的方式分辨男、女、小孩的声音还是不太靠谱,频域上的分布还是用有监督的方式自己学习应该更可靠。
2、用有噪音的推无噪音的小孩,准确率80%,无噪音推有噪音的,准确率才60+%,所以训练还是最好用噪音环境的数据集吧,之前想的是训练应该用无噪音的样本还是太天真了。其实混合起来效果还不错。
3、男女的准确率也就80%,样本分布还是比较好,而且均有噪音,估计在实际应用中效果也不会比80%差太远。
[Audio processing] 数据集生成 & 性别年龄分类训练 Python的更多相关文章
- keras系列︱图像多分类训练与利用bottleneck features进行微调(三)
引自:http://blog.csdn.net/sinat_26917383/article/details/72861152 中文文档:http://keras-cn.readthedocs.io/ ...
- 使用Python基于TensorFlow的CIFAR-10分类训练
TensorFlow Models GitHub:https://github.com/tensorflow/models Document:https://github.com/jikexueyua ...
- 编程语言分类及python所属类型
编程语言分类及python所属类型 编程语言主要从以下几个角度为进行分类:编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言. 编译和解释的区别是什么? 编译器是把源程序的每一条语句都 ...
- day02-操作系统、编程语言分类及python安装
目录 操作系统 编程语言分类 安装python解释器 操作系统 操作系统有什么用 操作系统能接受外部指令转化成0和1,并把一些对硬件的复杂操作简化成一个个简单的接口,作为中间人连接硬件和软件 计算机三 ...
- Python生成文本格式的excel\xlwt生成文本格式的excel\Python设置excel单元格格式为文本\Python excel xlwt 文本格式
Python生成文本格式的excel\xlwt生成文本格式的excel\Python设置excel单元格格式为文本\Python excel xlwt 文本格式 解决: xlwt 中设置单元格样式主要 ...
- ctpn+crnn 训练数据集生成
1. https://github.com/Belval/TextRecognitionDataGenerator 2. https://textrecognitiondatagenerator.re ...
- 利用keras自带路透社数据集进行多分类训练
import numpy as np from keras.datasets import reuters from keras import layers from keras import mod ...
- 利用keras自带影评数据集进行评价正面与否的二分类训练
from keras.datasets import imdb from keras import layers from keras import models from keras import ...
- Tensorflow2 自定义数据集图片完成图片分类任务
对于自定义数据集的图片任务,通用流程一般分为以下几个步骤: Load data Train-Val-Test Build model Transfer Learning 其中大部分精力会花在数据的准备 ...
随机推荐
- jquery实现很简单的DIV拖动
今天用jquery实现了一个很简单的拖动...实现思路很简单 如下: 在thickbox 弹出层内实现拖拽DIV,那么得进行一下相对宽高的运算:必须加上相对于可见窗口宽高和弹出层宽高之间的差: ...
- webViewDidFinishLoad 执行多次的问题
在做网页加载进度条的时候,发现UIWebViewDelegate中webViewDidFinishLoad方法会执行多次: - (void)webViewDidStartLoad:(UIWebView ...
- 在Mac OS上搭建本地服务器
我们在做网络编程的时候一般是需要有网络环境的,这样可以边写边测试达到很高的效率.但有些时候我们由于很多原因我们的电脑无法连接到网络,这时就会感觉很不自在,所以今天在这里教大家怎么用自己电脑作服务器. ...
- php利用smtp类轻松的发送电子邮件
当你还在纠结php内置的mail()函数不能发送邮件时,那么你现在很幸运,此时的这篇文章可以帮助到你! php利用smtp类来发邮件真是屡试不爽,我用过很久了,基本上没出过问题.本博客后台,当博主回复 ...
- (JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectOutputStream(对象序列化与反序列化)
对象的输入输出流 : 主要的作用是用于写入对象信息与读取对象信息. 对象信息一旦写到文件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输入流: Ob ...
- 判断奇数,java陷阱
/** 判断是否为奇数 @author husky / public class IsOdd { public static void main(String[] args) { int demo1 ...
- 异常练习一 throw
package 异常练习;class OutageroudleException extends RuntimeException{ OutageroudleException(){ } Outage ...
- 初试ubuntu14.4问题集锦
接触Linux系统也好长时间了,但每次都是浅尝则止.前几天突发兴趣,想认真地学习一下这个名扬天下的稳定的操作系统.于是试着装了一下炒作的最凶的Ubuntu. 安装的Ubuntu系统版本为14.04. ...
- javascript--烟火效果
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <meta nam ...
- Perl中级第四章课后习题
1.下列表达式各表示什么不同的含义: $ginger->[2][1] ${$ginger[2]}[1] $ginger->[2]->[1] ${$ginger->[2]}[1] ...