基于PaddleSpeech的婴儿啼哭识别(上)

简介: 基于PaddleSpeech的婴儿啼哭识别(上)

一、基于PaddleSpeech的婴儿啼哭识别


1.项目背景


对婴儿来说,啼哭声是一种通讯的方式,一个非常有限的,但类似成年人进行交流的方式。它也是一种生物报警器,向外界传达着婴儿生理和心理的需求。基于啼哭声声波携带的信息,婴儿的身体状况才能被确定,疾病才能被检测出来。因此,有效辨识啼哭声,成功地将婴儿啼哭声“翻译”成“成人语言”,让我们能够读懂啼哭声的含义,有重大的实际意义。


2.数据说明:


  • 1.训练数据集包含六类哭声,已人工添加噪声。

A:awake(苏醒)

B:diaper(换尿布)

C:hug(要抱抱)

D:hungry(饥饿)

E:sleepy(困乏)

F:uncomfortable(不舒服)

  • 2.噪声数据来源Noisex-92标准数据库。


二、PaddleSpeech环境准备


# 环境准备:安装paddlespeech和paddleaudio
!python -m pip install -q -U pip --user
!pip install paddlespeech paddleaudio -U -q
!pip list|grep paddle
import warnings
warnings.filterwarnings("ignore")
import IPython
import numpy as np
import matplotlib.pyplot as plt
import paddle
%matplotlib inline


三、数据预处理


1.数据解压缩


# !unzip -qoa data/data41960/dddd.zip


2.查看声音文件


from paddleaudio import load
data, sr = load(file='train/awake/awake_0.wav', mono=True, dtype='float32')  # 单通道,float32音频样本点
print('wav shape: {}'.format(data.shape))
print('sample rate: {}'.format(sr))
# 展示音频波形
plt.figure()
plt.plot(data)
plt.show()
from paddleaudio import load
data, sr = load(file='train/diaper/diaper_0.wav', mono=True, dtype='float32')  # 单通道,float32音频样本点
print('wav shape: {}'.format(data.shape))
print('sample rate: {}'.format(sr))
# 展示音频波形
plt.figure()
plt.plot(data)
plt.show()
!paddlespeech cls --input train/awake/awake_0.wav
!paddlespeech help


3.音频文件长度处理


# 查音频长度
import contextlib
import wave
def get_sound_len(file_path):
    with contextlib.closing(wave.open(file_path, 'r')) as f:
        frames = f.getnframes()
        rate = f.getframerate()
        wav_length = frames / float(rate)
    return wav_length
# 编译wav文件
import glob
sound_files=glob.glob('train/*/*.wav')
print(sound_files[0])
print(len(sound_files))
# 统计最长、最短音频
sounds_len=[]
for sound in sound_files:
    sounds_len.append(get_sound_len(sound))
print("音频最大长度:",max(sounds_len),"秒")
print("音频最小长度:",min(sounds_len),"秒")
!cp train/hungry/hungry_0.wav ~/
!pip install pydub -q
# 音频信息查看
import math
import soundfile as sf
import numpy as np
import librosa
data, 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}")
# 统一到34s
from pydub import AudioSegment
audio = AudioSegment.from_wav('hungry_0.wav')
print(str(audio.duration_seconds))
i = 1
padded = audio
while padded.duration_seconds * 1000 < 34000:
    padded = audio * i
    i = i + 1
padded[0:34000].set_frame_rate(16000).export('padded-file.wav', format='wav')
import math
import soundfile as sf
import numpy as np
import librosa
data, samplerate = sf.read('padded-file.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}")
# 定义函数,如未达到最大长度,则重复填充,最终从超过34s的音频中截取
from pydub import AudioSegment
def convert_sound_len(filename):
    audio = AudioSegment.from_wav(filename)
    i = 1
    padded = audio*i
    while padded.duration_seconds * 1000 < 34000:
        i = i + 1
        padded = audio * i
    padded[0:34000].set_frame_rate(16000).export(filename, format='wav')
# 统一所有音频到定长
for sound in sound_files:
    convert_sound_len(sound)


3.自定义数据集


import os
from paddlespeech.audio.datasets.dataset import AudioClassificationDataset
class CustomDataset(AudioClassificationDataset):
    # List all the class labels
    label_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):
                # print(sound)
                if 'wav' in sound:
                    sound=os.path.join(single_class_path, sound)
                    files.append(sound)
                    labels.append(i)
        return files, labels
# 定义dataloader
import paddle
from paddlespeech.audio.features import LogMelSpectrogram
# Feature config should be align with pretrained model
sample_rate = 16000
feat_conf = {
  'sr': sample_rate,
  'n_fft': 1024,
  'hop_length': 320,
  'window': 'hann',
  'win_length': 1024,
  'f_min': 50.0,
  'f_max': 14000.0,
  'n_mels': 64,
}
train_ds = CustomDataset(sample_rate=sample_rate)
feature_extractor = LogMelSpectrogram(**feat_conf)
train_sampler = paddle.io.DistributedBatchSampler(
    train_ds, batch_size=64, shuffle=True, drop_last=False)
train_loader = paddle.io.DataLoader(
    train_ds,
    batch_sampler=train_sampler,
    return_list=True,
    use_buffer_reader=True)


目录
相关文章
|
1月前
|
机器学习/深度学习 传感器 算法
植保机器人病虫害检测
植保机器人病虫害检测
63 2
|
1月前
|
传感器 机器学习/深度学习 算法
植保机器人作物识别与监测
植保机器人作物识别与监测
54 2
|
11月前
|
机器学习/深度学习 传感器 安全
【红绿灯识别】基于计算机视觉红绿灯识别附Matlab代码
【红绿灯识别】基于计算机视觉红绿灯识别附Matlab代码
|
11月前
|
数据采集 存储 搜索推荐
分析新闻评论数据并进行情绪识别
爬取新闻评论数据并进行情绪识别的目的是为了从网页中抓取用户对新闻事件或话题的评价内容,并从中识别和提取用户的情绪或态度,如积极、消极、中立等。爬取新闻评论数据并进行情绪识别有以下几个优势: 1)可以了解用户对新闻事件或话题的看法和感受,以及影响他们情绪的因素; 2)可以分析用户的情绪变化和趋势,以及与新闻事件或话题的相关性和影响力; 3)可以根据用户的情绪进行个性化的推荐或服务,如提供正能量的内容、提供帮助或建议等;
192 1
|
监控 安全 异构计算
头盔佩戴检测(行人跟踪技术检测)
头盔佩戴检测(行人跟踪技术检测)
260 0
头盔佩戴检测(行人跟踪技术检测)
|
机器学习/深度学习 传感器 算法
【水果质量检测】基于机器视觉实现苹果疾病识别分类附matlab代码
【水果质量检测】基于机器视觉实现苹果疾病识别分类附matlab代码
|
数据可视化 数据挖掘
基于PaddleClas2.3 的鲜花识别
基于PaddleClas2.3 的鲜花识别
178 0
基于PaddleClas2.3 的鲜花识别
|
XML JSON 算法
X光安检图像检测挑战赛3.0(上)
X光安检图像检测挑战赛3.0(上)
297 0
X光安检图像检测挑战赛3.0(上)
X光安检图像检测挑战赛3.0(下)
X光安检图像检测挑战赛3.0(下)
194 0
X光安检图像检测挑战赛3.0(下)
基于PaddleSpeech的婴儿啼哭识别(上)
基于PaddleSpeech的婴儿啼哭识别(上)
122 0