首页 > 编程语言 >超简单的婴儿哭声检测实现方案--python版

超简单的婴儿哭声检测实现方案--python版

时间:2024-10-18 17:02:06浏览次数:1  
标签:python -- test 哭声 file import print path model

超简单的婴儿哭声检测实现方案--python版

1. 构建项目

项目结构

└─audio_data ## 音频文件
├─mp3
├─test
└─wav ## 训练音频源文件 每个目录代表不同的标签,自己定义和随意增加,cry 目录存放的是婴儿的哭声
├─cry
├─non_cry
└─other
└─get-model.py
└─main.py
└─requirements.txt


get-model.py

## get-model.py
import os
import librosa
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report
from joblib import dump, load # 使用 joblib 直接导入 dump 和 load
from packaging import version # 用于版本比较

# 加载音频文件
def load_audio_file(file_path):
signal, sample_rate = librosa.load(file_path, sr=None, mono=True)
return signal, sample_rate

# 提取 MFCC 特征
def extract_features(file_path, sample_rate):
signal, _ = load_audio_file(file_path)
mfccs = librosa.feature.mfcc(y=signal, sr=sample_rate, n_mfcc=13)
mfccs_scaled_features = np.mean(mfccs.T, axis=0)
return mfccs_scaled_features

# 数据目录
data_dir = './audio_data/wav' # 不使用反斜杠
# 假设类别包括 'cry', 'non_cry', 'other' 等
labels = {'cry': 1, 'non_cry': 0, 'other': 2} # 添加其他类别

# 初始化特征和标签列表
X, y = [], []

# 遍历数据目录中的文件
for root, dirs, files in os.walk(data_dir):
print(f"Processing directory: {root}")
for file in files:
print(f"File found: {os.path.join(root, file)}")
if file.endswith('.wav'):
file_label = os.path.basename(root).split('_')[0] # 获取文件夹名称
print(f"File label: {file_label}")
if file_label in labels:
file_path = os.path.join(root, file)
print(f"Processing file: {file_path}")
try:
feature = extract_features(file_path, sample_rate=22050)
X.append(feature)
y.append(labels[file_label])
print(f"Feature extracted successfully.")
print(f"Feature: {feature}")
print(f"Label: {labels[file_label]}")
except Exception as e:
print(f"Error processing file {file_path}: {e}")

# 检查是否有数据
if len(X) == 0 or len(y) == 0:
raise ValueError("No valid data found in the directory.")

# 转换为 NumPy 数组
X = np.array(X)
y = np.array(y)

# 打印数据形状以确认是否正确加载
print(f"Shape of X: {X.shape}")
print(f"Shape of y: {y.shape}")
print(f"X: {X}")
print(f"y: {y}")

# 检查标签分布
unique_labels, counts = np.unique(y, return_counts=True)
print(f"Unique labels: {unique_labels}")
print(f"Counts: {counts}")

# 如果标签数量少于2,则抛出异常
if len(unique_labels) < 2:
raise ValueError("The dataset must contain at least two different labels.")

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# 标准化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 训练模型
# 使用 'ovr'(一对多)或 'ovo'(一对一)策略来支持多类分类
model = SVC(kernel='linear', C=1, decision_function_shape='ovr') # 支持多类分类
model.fit(X_train, y_train)

# 评估模型
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred)

print(f"Accuracy: {accuracy}")
print(report)

# 获取 sklearn 的版本号
from sklearn import __version__ as sklearn_version

# 检查并使用正确的 joblib 方法
if version.parse(sklearn_version) >= version.parse("0.24"):
dump(model, 'model.pkl')
dump(scaler, 'scaler.pkl')
else:
joblib.dump(model, 'model.pkl')
joblib.dump(scaler, 'scaler.pkl')

print("Model and scaler saved.")

main.py

## main.py
import os
import librosa
import numpy as np
from sklearn.preprocessing import StandardScaler
from joblib import load # 使用 joblib 直接导入 load

# 加载音频文件
def load_audio_file(file_path):
signal, sample_rate = librosa.load(file_path, sr=None, mono=True)
return signal, sample_rate

# 提取 MFCC 特征
def extract_features(file_path, sample_rate):
signal, _ = load_audio_file(file_path)
mfccs = librosa.feature.mfcc(y=signal, sr=sample_rate, n_mfcc=13)
mfccs_scaled_features = np.mean(mfccs.T, axis=0)
return mfccs_scaled_features

# 加载模型和标量
# 假设你有一个名为 'model.pkl' 的训练好的模型文件
model = load('model.pkl') # 加载模型
scaler = load('scaler.pkl') # 加载标量

# 指定测试文件目录
test_dir = './audio_data/test'

# 遍历指定目录下的所有 .mp3 文件
for root, dirs, files in os.walk(test_dir):
for file in files:
if file.endswith('.mp3') or file.endswith('.wav'):
file_path = os.path.join(root, file)
print(f"Processing file: {file_path}")

try:
# 提取特征
features = extract_features(file_path, sample_rate=22050)

# 标准化特征
features_scaled = scaler.transform([features])

# 进行预测
prediction = model.predict(features_scaled)

# 输出预测结果
print(f"文件名: {file} --- 结果值: {prediction[0]}")
except Exception as e:
print(f"Error processing file {file_path}: {e}")
librosa
numpy
scipy
sklearn
joblib

2. 安装依赖

安装环境

1. cmd或者powershell 直接执行以下命令,Windows10 会自动跳转到应用市场,根据提示安装即可

Python

2. 安装依赖包

pip3 install -r requirements.txt

3.训练模型

python3 get-model.py ## 训练完成会生成两个文件: model.pkl scaler.pkl

4.测试模型

python3 main.py

标签:python,--,test,哭声,file,import,print,path,model
From: https://www.cnblogs.com/Jacky2258/p/18474598

相关文章

  • 阿凉和大长老的故事(二)
    [阿凉和大长老的故事]时间来到4月中旬,我们约定好了一起去汉中玩一下,第二次见,4月的汉中还是有点冷的,他讲:要是冷的话给我温暖的抱抱。嘿嘿~这时候大概心里已经明白,他也有让我们关系更进一步的想法了,内心窃喜。已经很期待这次相见了~ [阿凉和大长老的故事]到了汉中以后先去吃了......
  • Higress 重磅更新:AI 能力全面开源,云原生能力再升级
    作者:澄潭、钰诚新版本简介Higress最新的1.4版本基于为通义千问,以及多家云上AGI厂商客户提供AI网关的积累沉淀,开源了大量AI原生的网关能力。同时也在Ingress、可观测、流控等云原生能力上做了全方位升级:AI能力全面开源:提供包含安全防护、多模型适配、可观测、缓存......
  • 【题解】[Codechef] Beautiful Permutation
    传送门以此纪念我场切的dp。这种计数的类型一看就很dp的样子。考场上一开始设的dp状态是\(dp_{i,j,k_1,k_2,0/1}\)表示将前\(i\)个数分为\(j\)段,放了\(k_1\)个偶数,\(k_2\)个奇数,当前段为偶数段或奇数段的方案数。考虑如何转移,记\(cnt_0\)表示序列中可填入的偶数......
  • 基于分时电价策略的家庭能量系统优化(Matlab代码实现)
     ......
  • 以谁的名义申请专利更有意义
    专利的作用决定了以谁的名义来申请专利,可根据需要选择公司、股东、第三方作为申请人,必要时则设立影子机构作为申请人。——贾振勇专利通常会以公司的名义来申请,但在某些情况下可能限制了专利的作用或者价值,需要根据专利的不同用途来调整,选择合适的对象作为专利申请人。除......
  • 软件设计师:系统开发与运行
    文章目录一、结构化开发(1)模块化(2)耦合(3)内聚(4)设计原则(5)系统文档(6)数据流图(7)数据字典二、UML(1)UML概念(2)UML事物(3)关系(4)关联多重度三、UML图(1)类图(2)对象图(3)用例图(4)交互图(5)状态图(6)部署图(7)UML图总结一、结构化开发(1)模块化(2)耦合(3)内聚(4)设计原则(5)系统文档(6)数据流图......
  • Snowflake算法js(实现)
    Snowflake算法是一种分布式环境下的唯一ID生成算法,最初由Twitter开发并在其内部使用。该算法旨在生成全局唯一、递增的64位整数ID,同时具备高性能的特点。以下是Snowflake算法的一些关键特点及其工作原理:特点全局唯一性:生成的ID在分布式环境中几乎可以保证全局唯一。时间有序:生......
  • java+vue计算机毕设高校图书馆借阅管理系统app【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和移动互联网的普及,高校学生的学习和生活方式正经历着深刻的变革。图书馆作为知识传播和学术研究的重要场所,其管理与服务模式......
  • 安通物流借助CRM重塑企业客户关系管理新格局
    安通控股股份有限公司(以下简称"安通控股")是一家扎根集装箱多式联运物流产业的现代综合物流服务企业,致力于为客户提供绿色、经济、高效、安全的集装箱全程物流解决方案。据Alphaliner排名统计,截至2023年10月,安通控股综合运力全球排名21位,位居国内内贸集装箱物流企业前三甲。......
  • java+vue计算机毕设高校运动会管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高校体育教育的不断发展,运动会作为增强学生体质、培养团队协作精神的重要活动,其组织与管理日益复杂。传统的人工管理方式存在效率低下、信息不透......