【机器学习实战入门】使用librosa进行语音情感识别

在这里插入图片描述

语音情感识别 Python 小项目

语音情感识别是 Python 的一个绝佳小项目,其最佳示例可以在呼叫中心看到。如果你注意过,呼叫中心的员工从不以同样的方式讲话,他们与客户交流的方式会根据客户的情感而变化。这种情况在普通人中也会发生,但为什么这对呼叫中心如此重要?答案是,员工通过语音识别客户的情感,从而改进服务并转化更多客户。因此,他们正在使用语音情感识别。让我们详细探讨这个项目。

什么是语音情感识别?

语音情感识别(Speech Emotion Recognition,简称 SER)是试图从语音中识别人类情感和情感状态的行为。这一技术利用了语音通常通过音调和音高反映潜在情感的事实。这也是动物如狗和马能够理解人类情感的现象。

SER 很具挑战性,因为情感是主观的,且标注音频也很困难。

什么是 librosa?

librosa 是一个用于分析音频和音乐的 Python 库。它具有扁平的包布局、标准化的接口和名称、向后兼容性、模块化函数和可读代码。在本项目中,我们将演示如何使用 pip 安装它(以及一些其他包)。

什么是 JupyterLab?

JupyterLab 是一个开源的、基于 Web 的 Project Jupyter 用户界面,它包含了 Jupyter Notebook 的所有基本功能,如笔记本、终端、文本编辑器、文件浏览器、丰富的输出等。此外,它还提供了对第三方扩展的改进支持。

要在 JupyterLab 中运行代码,首先需要通过命令提示符运行:

C:\Users\DataFlair>jupyter lab

这将在浏览器中为你打开一个新的会话。创建一个新的控制台并开始输入代码。JupyterLab 可以一次执行多行代码;按回车不会执行代码,你需要按 Shift+Enter 来执行。

语音情感识别 - 目标

使用 librosa 和 sklearn 库以及 RAVDESS 数据集构建一个模型,以从语音中识别情感。

语音情感识别 - 关于本 Python 小项目

技术在迅速发展!
在 WhatsApp 上与 DataFlair 保持更新!

在这个 Python 小项目中,我们将使用 librosa、soundfile 和 sklearn(以及其他库)来构建一个使用 MLPClassifier 的模型。该模型将能够从声音文件中识别情感。我们将加载数据、提取特征,然后将数据集分成训练集和测试集。接着,我们将初始化一个 MLPClassifier 并训练模型。最后,我们将计算模型的准确性。

数据集

在这个 Python 小项目中,我们将使用 RAVDESS 数据集,即 Ryerson Audio-Visual Database of Emotional Speech and Song 数据集,该数据集可免费下载。该数据集包含 7356 个文件,由 247 个人员进行了 10 次情感有效性、强度和真实性的评分。整个数据集大小为 24.8GB,来自 24 位演员,但我们已经降低了所有文件的采样率,你可以在此处下载。
链接: 使用librosa进行语音情感识别 数据集 speech-emotion-recognition-ravdess-data

预备知识

你需要安装以下库:

pip install librosa soundfile numpy sklearn pyaudio

如果使用 pip 安装 librosa 时遇到问题,可以尝试使用 conda 安装。

语音情感识别 Python 项目的步骤

  1. 导入必要的库:

    import librosa
    import soundfile
    import os, glob, pickle
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.neural_network import MLPClassifier
    from sklearn.metrics import accuracy_score
    

在这里插入图片描述

  1. 定义一个函数 extract_feature 从声音文件中提取 mfcc、chroma 和 mel 特征。 这个函数接受 4 个参数:文件名和三个布尔参数,分别对应这三个特征。

    • mfcc: 梅尔频率倒谱系数,表示声音的短期功率谱。
    • chroma: 与 12 个不同的音高类别相关。
    • mel: 梅尔谱频系数。

    使用 soundfile.SoundFile 打开声音文件,并读取内容和采样率。如果 chroma 为 True,则获取 X 的短时傅里叶变换(STFT)。

    def extract_feature(file_name, mfcc, chroma, mel):
        with soundfile.SoundFile(file_name) as sound_file:
            X = sound_file.read(dtype="float32")
            sample_rate = sound_file.samplerate
            if chroma:
                stft = np.abs(librosa.stft(X))
            result = np.array([])
            if mfcc:
                mfccs = np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40).T, axis=0)
                result = np.hstack((result, mfccs))
            if chroma:
                chroma = np.mean(librosa.feature.chroma_stft(S=stft, sr=sample_rate).T, axis=0)
                result = np.hstack((result, chroma))
            if mel:
                mel = np.mean(librosa.feature.melspectrogram(X, sr=sample_rate).T, axis=0)
                result = np.hstack((result, mel))
            return result
    

在这里插入图片描述

  1. 定义一个字典来存储 RAVDESS 数据集中数字和情感的对应关系,并定义一个列表来存储我们关注的情感( calm, happy, fearful, disgust)。

    emotions = {
        '01': 'neutral',
        '02': 'calm',
        '03': 'happy',
        '04': 'sad',
        '05': 'angry',
        '06': 'fearful',
        '07': 'disgust',
        '08': 'surprised'
    }
    observed_emotions = ['calm', 'happy', 'fearful', 'disgust']
    

在这里插入图片描述

  1. 加载数据并提取每个声音文件的特征。

    def load_data(test_size=0.2):
        x, y = [], []
        for file in glob.glob("D:\\DataFlair\\ravdess data\\Actor_*\\*.wav"):
            file_name = os.path.basename(file)
            emotion = emotions[file_name.split("-")[2]]
            if emotion not in observed_emotions:
                continue
            feature = extract_feature(file, mfcc=True, chroma=True, mel=True)
            x.append(feature)
            y.append(emotion)
        return train_test_split(np.array(x), y, test_size=test_size, random_state=9)
    

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 将数据集分成训练集和测试集。

    x_train, x_test, y_train, y_test = load_data(test_size=0.25)
    

在这里插入图片描述

  1. 观察训练集和测试集的形状。

    print((x_train.shape[0], x_test.shape[0]))
    

在这里插入图片描述

  1. 获取提取的特征数量。

    print(f'Features extracted: {x_train.shape[1]}')
    

在这里插入图片描述

  1. 初始化 MLPClassifier。

    model = MLPClassifier(alpha=0.01, batch_size=256, epsilon=1e-08, hidden_layer_sizes=(300,), learning_rate='adaptive', max_iter=500)
    

在这里插入图片描述

  1. 训练模型。

    model.fit(x_train, y_train)
    

在这里插入图片描述

  1. 预测测试集的情感。

    y_pred = model.predict(x_test)
    

在这里插入图片描述

  1. 计算模型的准确性。

    accuracy = accuracy_score(y_true=y_test, y_pred=y_pred)
    print("Accuracy: {:.2f}%".format(accuracy * 100))
    

在这里插入图片描述

总结

在这个 Python 小项目中,我们学习了如何从语音中识别情感。我们使用 MLPClassifier 来实现这一点,并使用 soundfile 库读取声音文件,使用 librosa 库提取特征。正如你所看到的,模型的准确率为 72.4%,这已经足够好了。

希望你喜欢这个小项目。


参考资料

这些参考资料涵盖了项目中使用的技术、数据集以及相关的研究论文,帮助你更深入地理解语音情感识别的原理和应用。

posted @   爱上编程技术  阅读(21)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示