【机器学习实战入门】使用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 项目的步骤
-
导入必要的库:
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
-
定义一个函数 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
-
定义一个字典来存储 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']
-
加载数据并提取每个声音文件的特征。
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)
-
将数据集分成训练集和测试集。
x_train, x_test, y_train, y_test = load_data(test_size=0.25)
-
观察训练集和测试集的形状。
print((x_train.shape[0], x_test.shape[0]))
-
获取提取的特征数量。
print(f'Features extracted: {x_train.shape[1]}')
-
初始化 MLPClassifier。
model = MLPClassifier(alpha=0.01, batch_size=256, epsilon=1e-08, hidden_layer_sizes=(300,), learning_rate='adaptive', max_iter=500)
-
训练模型。
model.fit(x_train, y_train)
-
预测测试集的情感。
y_pred = model.predict(x_test)
-
计算模型的准确性。
accuracy = accuracy_score(y_true=y_test, y_pred=y_pred) print("Accuracy: {:.2f}%".format(accuracy * 100))
总结
在这个 Python 小项目中,我们学习了如何从语音中识别情感。我们使用 MLPClassifier 来实现这一点,并使用 soundfile 库读取声音文件,使用 librosa 库提取特征。正如你所看到的,模型的准确率为 72.4%,这已经足够好了。
希望你喜欢这个小项目。
参考资料
这些参考资料涵盖了项目中使用的技术、数据集以及相关的研究论文,帮助你更深入地理解语音情感识别的原理和应用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)