基于深度学习的婴儿啼哭识别项目详解

基于深度学习的婴儿啼哭识别项目详解

  • 基于深度学习的婴儿啼哭识别项目详解
    • 一、项目背景
      • 1.1 项目背景
      • 1.2 数据说明
    • 二、PaddleSpeech环境准备
    • 三、数据预处理
      • 3.1 数据解压缩
      • 3.2 查看声音文件
      • 3.3 音频文件长度处理
    • 四、自定义数据集与模型训练
      • 4.1 自定义数据集
      • 4.2 模型训练
      • 4.3 模型训练
    • 五、模型测试
    • 六、注意事项

基于深度学习的婴儿啼哭识别项目详解

一、项目背景

婴儿啼哭声是婴儿沟通需求的重要信号,对于父母和护理者而言至关重要。本项目基于PaddleSpeech框架,致力于构建婴儿啼哭识别系统,通过深度学习将啼哭声翻译成成人语言,帮助理解婴儿的需求和状态。
在这里插入图片描述

1.1 项目背景

婴儿啼哭声是一种生物报警器,传递婴儿的生理和心理需求。有效地识别啼哭声有助于提高婴儿护理的效率和质量。

1.2 数据说明

项目使用六类人工添加噪声的哭声作为训练数据集,分别代表不同的婴儿需求,如苏醒、换尿布、要抱抱、饥饿、困乏、不舒服。噪声数据来自Noisex-92标准数据库。

二、PaddleSpeech环境准备

安装PaddleSpeech和PaddleAudio,确保环境准备就绪。

!python -m pip install -q -U pip --user
!pip install paddlespeech paddleaudio -U -q

三、数据预处理

3.1 数据解压缩

解压缩训练数据集,获取音频文件。

!unzip -qoa data/data41960/dddd.zip

3.2 查看声音文件

通过可视化展示音频波形,了解样本数据的特征。

from paddleaudio import load
data, sr = load(file='train/awake/awake_0.wav', mono=True, dtype='float32')  
print('wav shape: {}'.format(data.shape))
print('sample rate: {}'.format(sr))
plt.figure()
plt.plot(data)
plt.show()

3.3 音频文件长度处理

统一音频文件长度,确保训练数据格式一致。

# 音频信息查看
import soundfile as sf
import numpy as np
import librosadata, samplerate = sf.read('hungry_0.wav')
channels = len(data.shape)
length_s = len(data) / float(samplerate)
format_rate = 16000
print(f"channels: {channels}")
print(f"length_s: {length_s}")
print(f"samplerate: {samplerate}")

四、自定义数据集与模型训练

4.1 自定义数据集

创建自定义数据集类,包含六类婴儿需求的音频文件。

class CustomDataset(AudioClassificationDataset):# List all the class labelslabel_list = ['awake','diaper','hug','hungry','sleepy','uncomfortable']train_data_dir = './train/'def __init__(self, **kwargs):files, labels = self._get_data()super(CustomDataset, self).__init__(files=files, labels=labels, feat_type='raw', **kwargs)# 返回音频文件、label值def _get_data(self):'''This method offer information of wave files and labels.'''files = []labels = []for i in range(len(self.label_list)):single_class_path = os.path.join(self.train_data_dir, self.label_list[i])for sound in os.listdir(single_class_path):if 'wav' in sound:sound = os.path.join(single_class_path, sound)files.append(sound)labels.append(i)return files, labels

4.2 模型训练

选取预训练模型作为特征提取器,构建分类模型进行模型训练。

# 选取cnn14作为 backbone,用于提取音频的特征
from paddlespeech.cls.models import cnn14
backbone = cnn14(pretrained=True, extract_embedding=True)# 构建分类模型
class SoundClassifier(nn.Layer):def __init__(self, backbone, num_class, dropout=0.1):super().__init__()self.backbone = backboneself.dropout = nn.Dropout(dropout)self.fc = nn.Linear(self.backbone.emb_size, num_class)def forward(self, x):x = x.unsqueeze(1)x = self.backbone(x)x = self.dropout(x)logits = self.fc(x)return logitsmodel = SoundClassifier(backbone, num_class=len(train_ds.label_list))

4.3 模型训练

定义优化器和损失函数,进行模型训练。

# 定义优化器和 Loss
optimizer = paddle.optimizer.Adam(learning_rate=1e-4, parameters=model.parameters())
criterion = paddle.nn.loss.CrossEntropyLoss()# 模型训练
epochs = 20
steps_per_epoch = len(train_loader)
log_freq = 10
eval_freq = 10for epoch in range(1, epochs + 1):model.train()avg_loss = 0num_corrects = 0num_samples = 0for batch_idx, batch in enumerate(train_loader):waveforms, labels = batchfeats = feature_extractor(waveforms)feats = paddle.transpose(feats, [0, 2, 1])  logits = model(feats)loss = criterion(logits, labels)loss.backward()optimizer.step()if isinstance(optimizer._learning_rate, paddle.optimizer.lr.LRScheduler):optimizer._learning_rate.step()optimizer.clear_grad()# 计算损失avg_loss += loss.numpy()[0]# 计算指标preds = paddle.argmax(logits, axis=1)num_corrects += (preds == labels).numpy().sum()num_samples += feats.shape[0]if (batch_idx + 1) % log_freq == 0:lr = optimizer.get_lr()avg_loss /= log_freqavg_acc = num_corrects / num_samplesprint_msg = 'Epoch={}/{}, Step={}/{}'.format(epoch, epochs, batch_idx + 1, steps_per_epoch)print_msg += ' loss={:.4f}'.format(avg_loss)print_msg += ' acc={:.4f}'.format(avg_acc)print_msg += ' lr={:.6f}'.format(lr)logger.train(print_msg)avg_loss = 0num_corrects = 0num_samples = 0

五、模型测试

通过模型对测试音频进行推理,输出对应的婴儿需求概率。

# 模型测试
top_k = 3
wav_file = 'test/test_0.wav'
n_fft = 1024
win_length = 1024
hop_length = 320
f_min = 50.0
f_max = 16000.0waveform, sr = load(wav_file, sr=sr)
feature_extractor = LogMelSpectrogram(sr=sr, n_fft=n_fft, hop_length=hop_length, win_length=win_length, window='hann', f_min=f_min, f_max=f_max, n_mels=64)
feats = feature_extractor(paddle.to_tensor(paddle.to_tensor(waveform).unsqueeze(0)))
feats = paddle.transpose(feats, [0, 2, 1])logits = model(feats)
probs = nn.functional.softmax(logits, axis=1).numpy()sorted_indices = probs[0].argsort()msg = f'[{wav_file}]\n'
for idx in sorted_indices[-1:-top_k-1:-1]:msg += f'{train_ds.label_list[idx]}: {probs[0][idx]:.5f}\n'
print(msg)

六、注意事项

  1. 自定义数据集格式参考文档;
  2. 统一音频尺寸,确保音频长度和采样频率一致;
  3. 可学习PaddleSpeech课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux截图方法推荐

因为经常会遇到以图为证的情况,而办公设备基本都是linux,所以汇总一下常见的linux截图方式。 1:在 Linux 中系统集成的截图的默认方式 你想要截取整个屏幕?屏幕中的某个区域?某个特定的窗口? 如果只需要获取一张屏幕…

Servlet-体系结构

一、思考 读者阅读完上一篇关于Servlet基本概念的文章后,我们知道每次实现一个Servlet,都需要覆盖五个接口,我们对除service接口外的其它四个接口,我们通常不会做什么处理。那么,这种实现方式是否有些繁琐呢&#xff…

【Linux实用篇】Linux常用命令(2)

目录 1.3 拷贝移动命令 1.3.1 cp 1.3.2 mv 1.4 打包压缩命令 1.5 文本编辑命令 1.5.1 vi&vim介绍 1.5.2 vim安装 1.5.3 vim使用 1.6 查找命令 1.6.1 find 1.6.2 grep 1.3 拷贝移动命令 1.3.1 cp 作用: 用于复制文件或目录 语法: cp [-r] source dest ​ 说明: …

深入理解@DubboReference与@DubboService【三】

欢迎来到我的博客,代码的世界里,每一行都是一个故事 探索Dubbo的核心:深入理解DubboReference与DubboService【三】 前言DubboService注解基本概念使用示例高级特性 DubboReference注解基本概念使用示例服务调用流程 最佳实践注解的最佳使用方…

什么是云服务器,阿里云优势如何?

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云百科aliyunbai…

Fabric2.2:在有系统通道的情况下搭建应用通道

写在最前 在使用Fabric-SDK-Go1.0.0操作Fabric网络时遇到了bug。Fabric-SDK-GO的当前版本没有办法在没有系统通道的情况下创建应用通道,而Fabric的最新几个版本允许在没有系统通道的情况下搭建应用通道。为了解决这个矛盾并使用Fabric-SDK-GO完成后续的项目开发&…

Web前端 ---- 【Vue3】ref和reactive实现响应式的区别和联系

目录 前言 setup ref 基本数据类型 对象形式 reactive ref和reactive的区别与联系 前言 本文介绍函数ref和函数reactive实现响应式 setup 在介绍ref和reactive之前,先介绍setup,vue3新引入的配置项。在该配置项中,在vue2中的data、methods、comput…

xtu oj 1475 冰墩墩和冰壶

题目描述 冰壶是被誉为“冰面上的国际象棋”,其计分规则是各自投壶,最后在大本营内,你有几个壶离圆心比对方所有壶离圆心都近就得到几分。 比如红方有两个壶,分别在坐标(1,1),(−2,1);黄方也有两个壶,分别…

GULP 案例 4:如何计算热力学性质(热容、熵、焓、自由能等)?

---------------------------------------------------------------------- 物体的热力学性质是指物质处于平衡状态下压力 P、体积 V、温度 T、组成以及其他的热力学函数之间的变化规律。一般将材料的压力 P、体积 V、温度 T、内能 U、焓 H、熵 S 等统称为物体热力学性质。 热…

软件测试|Python数据可视化神器——pyecharts教程(九)

使用pyecharts绘制K线图进阶版 简介 K线图(Kandlestick Chart),又称蜡烛图,是一种用于可视化金融市场价格走势和交易数据的图表类型。它是股票、外汇、期货等金融市场中最常用的技术分析工具之一,可以提供关于价格变…

黑马python就业课

文章目录 初级中级高级初级课程分享 初级 中级 高级 初级课程分享 链接:https://pan.baidu.com/s/1aiJHaThezv_mSI1rnV3d7g 提取码:xdpc

软件测试|Selenium StaleElementReferenceException 异常分析与解决

简介 Selenium 是一个流行的自动化测试工具,用于模拟用户与网页交互。然而,当我们在使用 Selenium 时,可能会遇到一个常见的异常,即 StaleElementReferenceException。这个异常通常在我们尝试与网页上的元素交互时抛出&#xff0…

Nacos服务注册或发现、Nacos服务分级模型、Nacos负载均衡策略、加权负载均衡、Nacos环境隔离

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、nacos服务搭建,nacos服务注册或发现二、Nacos服务分级模型三、Nacos负载均衡策略四、Nacos注册中心(nacos控制台配置)-加…

shell中echo和printf在终端输出时更改文本颜色

shell中更改echo或printf的输出颜色可以使用相应的ANSI转义码(ANSI Escape Codes)来实现:各种常用颜色的ANSI如下所示,截图来自于 geeksforgeeks.org 八进制格式应采用以下格式给出:八进制格式必须以名为\033[的参数为前缀,后跟需要指定的颜色…

Postman工具使用一篇快速入门教程

文章目录 下载安装注册登录CollectionFolderRequestGet请求Post请求Header设置Response响应 EnvironmentsGlobal环境变量其他环境变量Collection变量变量使用同名变量的优先级 Postman内置变量Pre-request script和Test script脚本设置、删除和获取变量获取请求参数获取响应数据…

如何使用创建时间给文件重命名,简单的批量操作教程

在处理大量文件时,有时要按照规则对文件重命名,根据文件的创建时间来重命名。那如何批量操作呢?现在一起来看云炫文件管理器如何用文件的创建时间来批量重命名。 按创建时间重命名文件的前后对比图。 用创建时间批量给文件重命名的步骤&…

redis高级篇之单线程和多线程

目录 1、redis的发展史 2、redis为什么选择单线程? 3、主线程和Io线程是怎么协作完成请求处理的? 4、IO多路复用 5、开启redis多线程 1、redis的发展史 Redis4.0之前是用的单线程,4.0以后逐渐支持多线程 Redis4.0之前一直采用单线程的主…

微信小程序开发学习笔记《8》tabBar

微信小程序开发学习笔记《8》tabBar 博主正在学习微信小程序开发,希望记录自己学习过程同时与广大网友共同学习讨论。tabBar官方文档 tabBar这一节还是相当重要的。 一、什么是tabBar tabBar是移动端应用常见的页面效果,用于实现多页面的快速切换。小…

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 文章目录 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II1 Le…

Unity中URP中的光照简介

文章目录 前言URP下的光照在Unity中的设置1、主灯设置2、额外灯设置3、反射光设置 前言 我们在这篇文章开始了解URP下的光照。 URP下的光照在Unity中的设置 1、主灯设置 主灯可以选择 禁用 或 逐像素 光照 当选择逐像素光照的主灯后 Cast Shadows:可以选择开启 或…