DeEAR多模态扩展教程融合DeEAR声学特征与Whisper文本特征构建联合情感模型1. 引言从语音到文本让情感分析更全面你有没有想过当一个人说话时我们感受到的情绪其实来自两个方面一方面是声音本身——语调是高昂还是低沉语速是急促还是平缓另一方面是说话的内容——用词是积极还是消极句子是感叹还是陈述。传统的语音情感分析往往只关注前者也就是声音的“声学特征”这就像只听一个人说话的腔调却不去理解他具体说了什么难免会错过关键信息。今天我要带你做的就是把这两个维度结合起来。我们将基于一个强大的语音情感识别系统——DeEARDeep Emotional Expressiveness Recognition并引入另一个在语音转文本领域表现出色的模型——Whisper构建一个能同时“听音”又“辨意”的联合情感分析模型。简单来说这个教程会教你快速上手DeEAR用它来提取一段语音在“唤醒度”、“自然度”、“韵律”三个维度的声学情感特征。集成Whisper用它将同一段语音转换成准确的文字并提取文本的语义特征。构建联合模型设计一个简单的网络把声音特征和文字特征融合在一起做出更精准、更全面的情感判断。无论你是想为你的智能客服增加“察言观色”的能力还是想分析用户访谈录音中的深层情绪这个融合方案都能提供一个全新的视角。我们直接从代码和操作开始让你在动手实践中理解多模态情感分析的魅力。2. 环境准备与DeEAR快速启动在开始融合模型之前我们得先把两个“主角”请上场。首先是DeEAR它是一个基于wav2vec2的深度语音情感表达分析系统专门从声音中提取情感特征。2.1 启动DeEAR服务根据你提供的镜像信息启动DeEAR非常简单。如果你在CSDN星图或类似平台使用预置镜像通常环境已经配置好。我们通过SSH连接到容器后用推荐的方式启动# 进入项目目录如果尚未在根目录 cd /root/DeEAR_Base # 使用启动脚本推荐可能包含一些环境检查 ./start.sh # 或者直接运行应用 python app.py服务启动后你会看到类似Running on local URL: http://0.0.0.0:7860的输出。此时DeEAR的Web界面就已经在7860端口运行起来了。2.2 了解DeEAR的核心功能通过浏览器访问http://你的容器IP:7860你会看到一个简洁的Gradio界面。它的核心功能是分析上传的音频文件支持wav, mp3等格式并输出三个维度的情感表达评分唤醒度 (Arousal)衡量声音的激动程度。低唤醒对应平静、沉稳的语调高唤醒对应兴奋、激昂的语调。自然度 (Nature)衡量声音听起来是否自然、舒适。不自然可能意味着紧张、做作自然则代表流畅、真实。韵律 (Prosody)衡量声音的节奏和抑扬顿挫。平淡的韵律听起来单调富有韵律则充满节奏感和变化。DeEAR会为每个维度输出一个介于0到1之间的分数并给出“低/高”、“不自然/自然”、“平淡/富有韵律”的类别判断。这些分数和类别就是我们后续需要的“声学情感特征”。3. 提取声学特征与DeEAR程序化交互为了将DeEAR集成到我们的联合模型中我们不能只依赖Web界面需要通过API的方式调用它以获取结构化的特征数据。3.1 编写DeEAR特征提取函数我们在同一个Python环境中创建一个新的脚本例如joint_emotion.py首先编写与DeEAR交互的部分。由于DeEAR本身是用Gradio启动的我们可以模拟一个本地客户端来调用它。import requests import json import time import numpy as np from typing import Dict, Any def extract_deear_features(audio_file_path: str, server_url: str http://localhost:7860) - Dict[str, Any]: 调用本地运行的DeEAR服务提取音频的声学情感特征。 参数: audio_file_path: 音频文件的路径。 server_url: DeEAR服务的地址默认为本地7860端口。 返回: 包含唤醒度、自然度、韵律分数及类别的字典。 # 准备上传的文件 with open(audio_file_path, rb) as f: files {file: f} # 向DeEAR的预测接口发送请求 # 注意实际端点需要根据DeEAR的app.py确定这里假设为 /predict try: response requests.post(f{server_url}/predict, filesfiles, timeout30) response.raise_for_status() # 检查请求是否成功 result response.json() except requests.exceptions.RequestException as e: print(f请求DeEAR服务失败: {e}) # 返回模拟数据供演示实际使用时请注释掉 return { arousal: {score: 0.75, category: 高唤醒}, nature: {score: 0.82, category: 自然}, prosody: {score: 0.68, category: 富有韵律} } # 解析DeEAR的返回结果 # 这里需要根据DeEAR实际的返回JSON结构进行调整 # 假设返回格式为: {arousal: 0.75, nature: 0.82, prosody: 0.68, ...} features { arousal_score: result.get(arousal, 0.5), nature_score: result.get(nature, 0.5), prosody_score: result.get(prosody, 0.5), # 也可以根据分数阈值自己判断类别或直接使用返回的类别 arousal_category: 高唤醒 if result.get(arousal, 0.5) 0.5 else 低唤醒, nature_category: 自然 if result.get(nature, 0.5) 0.5 else 不自然, prosody_category: 富有韵律 if result.get(prosody, 0.5) 0.5 else 平淡, } return features # 测试函数 if __name__ __main__: # 确保DeEAR服务正在运行并准备一个测试音频 test_audio path/to/your/test_audio.wav # 替换为你的音频文件路径 features extract_deear_features(test_audio) print(DeEAR提取的声学特征) for key, value in features.items(): print(f {key}: {value})这段代码的核心是extract_deear_features函数它通过HTTP POST请求将音频文件发送给DeEAR服务并解析返回的JSON结果得到三个维度的分数。请注意你需要根据DeEAR应用实际定义的API端点可能是/predict,/run,/api等和返回的JSON格式来调整代码中的请求URL和解析逻辑。3.2 准备测试音频你可以录制一段自己说的话或者从网上下载一段带有明显情感的语音例如高兴的、生气的、悲伤的。将其保存为WAV或MP3格式并更新上面测试代码中的文件路径。运行测试如果一切顺利你将得到类似这样的输出DeEAR提取的声学特征 arousal_score: 0.89 nature_score: 0.76 prosody_score: 0.93 arousal_category: 高唤醒 nature_category: 自然 prosody_category: 富有韵律这组数值就是我们从声音中提取到的“情感密码”。4. 集成Whisper提取文本语义特征现在轮到第二位主角——Whisper登场。Whisper是OpenAI开源的语音识别模型不仅能高精度转写文本其编码器输出的特征也蕴含了丰富的语义信息非常适合用来分析文本情感。4.1 安装Whisper并加载模型在同一个Python环境中我们安装Whisper库。pip install openai-whisper然后在joint_emotion.py脚本中继续添加Whisper相关的代码。import whisper import torch def load_whisper_model(model_size: str base): 加载指定大小的Whisper模型。 可选型号: tiny, base, small, medium, large (越大越准越慢)。 对于情感分析base或small通常够用。 print(f正在加载Whisper-{model_size}模型...) model whisper.load_model(model_size) print(模型加载完毕。) return model def extract_whisper_features(model, audio_file_path: str): 使用Whisper处理音频获取转录文本和编码器特征。 参数: model: 已加载的Whisper模型。 audio_file_path: 音频文件路径。 返回: text: 转录的文本。 features: 编码器输出的特征张量通常为 [时间步, 特征维度]。 # 转录音频 result model.transcribe(audio_file_path) transcribed_text result[text] print(f转录文本: {transcribed_text}) # 为了获取编码器特征我们需要深入模型内部 # 加载音频并预处理 audio whisper.load_audio(audio_file_path) audio whisper.pad_or_trim(audio) mel whisper.log_mel_spectrogram(audio).to(model.device) # 获取编码器输出 with torch.no_grad(): # 获取编码器特征 # Whisper模型结构: encoder - decoder # 我们取编码器的最后一层输出 audio_features model.encoder(mel.unsqueeze(0)) # 增加batch维度 # audio_features的形状: [1, 时间步, 特征维度] # 通常我们对时间步取平均得到一个全局的音频特征向量 global_audio_feature audio_features.mean(dim1).squeeze().cpu().numpy() return transcribed_text, global_audio_feature # 测试Whisper功能 if __name__ __main__: # 加载模型首次运行会下载请保持网络通畅 whisper_model load_whisper_model(base) test_audio path/to/your/test_audio.wav # 使用同一个测试音频 text, whisper_features extract_whisper_features(whisper_model, test_audio) print(f\nWhisper提取的文本特征向量维度: {whisper_features.shape}) print(f特征向量前10个值: {whisper_features[:10]})这段代码做了两件事转录文本将音频内容转为文字这是分析语义情感的基础。提取特征获取Whisper编码器输出的特征向量。我们对所有时间步的特征取平均得到一个固定长度的向量这个向量浓缩了这段语音的语义信息。4.2 从文本中提取情感特征仅有文本还不够我们需要从文本中量化情感。这里我们可以用一个简单有效的方法使用预训练的情感分析模型如transformers库中的模型来分析转录文本。from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification import torch.nn.functional as F def load_text_emotion_model(): 加载一个预训练的文本情感分析模型。 # 这里使用一个在英文情感分析上表现不错的模型 # 对于中文可以替换为 bert-base-chinese 等中文模型并寻找对应的情感分析微调版本 model_name distilbert-base-uncased-finetuned-sst-2-english print(f正在加载文本情感模型: {model_name}) tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForSequenceClassification.from_pretrained(model_name) classifier pipeline(sentiment-analysis, modelmodel, tokenizertokenizer) return classifier def extract_text_emotion(classifier, text: str): 分析文本的情感倾向。 参数: classifier: 文本情感分类管道。 text: 待分析的文本。 返回: 情感标签如 POSITIVE/NEGATIVE和置信度分数。 if not text.strip(): # 处理空文本 return {label: NEUTRAL, score: 0.5} result classifier(text)[0] return result # 在测试部分集成 if __name__ __main__: # ... 之前的DeEAR和Whisper代码 ... # 加载文本情感模型 text_classifier load_text_emotion_model() text_emotion extract_text_emotion(text_classifier, text) print(f\n文本情感分析结果: {text_emotion})现在我们拥有了三组特征DeEAR声学特征3个维度的分数唤醒度、自然度、韵律。Whisper语义特征一个高维向量例如base模型是512维代表音频的语义编码。文本情感特征一个标签如积极/消极和置信度分数。5. 构建联合情感模型有了多模态特征下一步就是设计一个模型让它们“合作”起来做出最终的情感判断。我们这里构建一个简单的多层感知机MLP作为示例。5.1 设计模型架构我们的模型需要接受两种不同类型的输入并在早期进行融合。import torch import torch.nn as nn class JointEmotionModel(nn.Module): def __init__(self, deear_feat_dim3, whisper_feat_dim512, text_feat_dim1, hidden_dim128, num_classes4): 联合情感模型。 参数: deear_feat_dim: DeEAR特征维度3个分数。 whisper_feat_dim: Whisper全局特征向量的维度。 text_feat_dim: 文本情感特征维度这里用1个分数也可用标签的one-hot。 hidden_dim: 融合后网络的隐藏层维度。 num_classes: 最终要预测的情感类别数例如高兴、悲伤、愤怒、中性。 super(JointEmotionModel, self).__init__() # 特征融合层将不同维度的特征映射到同一空间并拼接 self.deear_fc nn.Linear(deear_feat_dim, 32) self.whisper_fc nn.Linear(whisper_feat_dim, 64) self.text_fc nn.Linear(text_feat_dim, 16) # 融合后的全连接网络 fused_dim 32 64 16 self.fc1 nn.Linear(fused_dim, hidden_dim) self.relu nn.ReLU() self.dropout nn.Dropout(0.3) self.fc2 nn.Linear(hidden_dim, num_classes) def forward(self, deear_feat, whisper_feat, text_feat): # 分别处理不同特征 deear_out self.deear_fc(deear_feat) whisper_out self.whisper_fc(whisper_feat) text_out self.text_fc(text_feat) # 拼接特征 fused torch.cat([deear_out, whisper_out, text_out], dim1) # 通过分类网络 x self.fc1(fused) x self.relu(x) x self.dropout(x) out self.fc2(x) return out # 实例化模型 model JointEmotionModel() print(model)这个模型的结构很直观三个独立的线性层分别处理DeEAR特征3维、Whisper特征512维和文本情感分数1维将它们映射到更小的维度。将映射后的特征拼接起来。通过一个小的全连接网络含ReLU激活和Dropout防止过拟合进行最终分类。5.2 准备训练数据与训练流程要训练这个模型你需要一个包含音频文件及其对应情感标签的数据集。这里我给出一个训练循环的框架。def prepare_sample(audio_path, label, deear_server_url, whisper_model, text_classifier): 为一个音频样本准备所有特征和标签。 # 1. 提取DeEAR特征 deear_feats_dict extract_deear_features(audio_path, deear_server_url) deear_feat_tensor torch.tensor([ deear_feats_dict[arousal_score], deear_feats_dict[nature_score], deear_feats_dict[prosody_score] ], dtypetorch.float32) # 2. 提取Whisper特征 _, whisper_feat_array extract_whisper_features(whisper_model, audio_path) whisper_feat_tensor torch.tensor(whisper_feat_array, dtypetorch.float32) # 3. 提取文本情感特征这里使用情感分数 transcribed_text, _ extract_whisper_features(whisper_model, audio_path) # 这里再调用一次是为了获取文本实际可优化 text_emotion extract_text_emotion(text_classifier, transcribed_text) # 将情感标签如POSITIVE转换为分数这里简单处理POSITIVE为1.0NEGATIVE为0.0 text_score 1.0 if text_emotion[label] POSITIVE else 0.0 text_feat_tensor torch.tensor([text_score], dtypetorch.float32) # 4. 标签 label_tensor torch.tensor(label, dtypetorch.long) return deear_feat_tensor, whisper_feat_tensor, text_feat_tensor, label_tensor def train_epoch(model, dataloader, optimizer, criterion, device): 一个训练轮次的代码框架。 model.train() total_loss 0 for batch in dataloader: # batch 应包含 deear_feats, whisper_feats, text_feats, labels deear_f, whisper_f, text_f, labels batch deear_f, whisper_f, text_f, labels deear_f.to(device), whisper_f.to(device), text_f.to(device), labels.to(device) optimizer.zero_grad() outputs model(deear_f, whisper_f, text_f) loss criterion(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() return total_loss / len(dataloader) # 注意完整的训练需要你构建DataLoader这里只是一个框架。重要提示实际训练中频繁调用DeEAR服务和Whisper转录会非常慢。最佳实践是预先提取所有音频样本的特征保存为文件如.npy或.pt然后在训练时直接加载这些特征文件这将极大提升训练效率。6. 总结与展望通过这个教程我们完成了一个从想法到实践的多模态情感分析原型。我们让DeEAR负责“听语气”让Whisper负责“辨内容”并将两者的信息融合在一个神经网络中共同做出决策。6.1 本教程核心回顾快速启动与理解DeEAR我们学会了如何启动这个强大的语音情感分析工具并理解了它输出的唤醒度、自然度、韵律三个核心维度。程序化提取声学特征通过编写Python函数与DeEAR的Web服务交互我们能够自动获取音频的情感分数为后续集成铺平道路。集成Whisper获取语义我们利用Whisper不仅得到了准确的转录文本还提取了深层的语义特征向量并辅以文本情感分析为模型提供了内容层面的情感线索。构建联合模型我们设计了一个简单的融合模型架构演示了如何将声学、语义、文本情感三类特征拼接并输入分类网络。6.2 下一步可以做什么这个原型只是一个起点你可以从很多方向让它变得更强大、更实用使用更丰富的数据集寻找或构建包含多模态情感标签如语音文本对应同一情感的数据集进行训练例如CMU-MOSEI。优化特征提取流程将特征提取离线化保存为特征库加速模型迭代。尝试更先进的融合策略除了简单的拼接可以尝试注意力机制让模型自己决定更关注声音还是文字、交叉模态变换器等。增加输出维度不仅预测离散的情感类别高兴、悲伤等还可以预测连续的维度如效价、唤醒度、支配度。部署为实时服务将训练好的模型封装成API可以实时分析麦克风输入或上传的音频文件。情感计算正在走向多模态融合的时代。单独分析声音或文字都像是盲人摸象只有将它们结合起来才能更接近人类理解情感的真实方式。希望这个教程能成为你探索这个有趣领域的一块敲门砖。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
DeEAR多模态扩展教程:融合DeEAR声学特征与Whisper文本特征构建联合情感模型
DeEAR多模态扩展教程融合DeEAR声学特征与Whisper文本特征构建联合情感模型1. 引言从语音到文本让情感分析更全面你有没有想过当一个人说话时我们感受到的情绪其实来自两个方面一方面是声音本身——语调是高昂还是低沉语速是急促还是平缓另一方面是说话的内容——用词是积极还是消极句子是感叹还是陈述。传统的语音情感分析往往只关注前者也就是声音的“声学特征”这就像只听一个人说话的腔调却不去理解他具体说了什么难免会错过关键信息。今天我要带你做的就是把这两个维度结合起来。我们将基于一个强大的语音情感识别系统——DeEARDeep Emotional Expressiveness Recognition并引入另一个在语音转文本领域表现出色的模型——Whisper构建一个能同时“听音”又“辨意”的联合情感分析模型。简单来说这个教程会教你快速上手DeEAR用它来提取一段语音在“唤醒度”、“自然度”、“韵律”三个维度的声学情感特征。集成Whisper用它将同一段语音转换成准确的文字并提取文本的语义特征。构建联合模型设计一个简单的网络把声音特征和文字特征融合在一起做出更精准、更全面的情感判断。无论你是想为你的智能客服增加“察言观色”的能力还是想分析用户访谈录音中的深层情绪这个融合方案都能提供一个全新的视角。我们直接从代码和操作开始让你在动手实践中理解多模态情感分析的魅力。2. 环境准备与DeEAR快速启动在开始融合模型之前我们得先把两个“主角”请上场。首先是DeEAR它是一个基于wav2vec2的深度语音情感表达分析系统专门从声音中提取情感特征。2.1 启动DeEAR服务根据你提供的镜像信息启动DeEAR非常简单。如果你在CSDN星图或类似平台使用预置镜像通常环境已经配置好。我们通过SSH连接到容器后用推荐的方式启动# 进入项目目录如果尚未在根目录 cd /root/DeEAR_Base # 使用启动脚本推荐可能包含一些环境检查 ./start.sh # 或者直接运行应用 python app.py服务启动后你会看到类似Running on local URL: http://0.0.0.0:7860的输出。此时DeEAR的Web界面就已经在7860端口运行起来了。2.2 了解DeEAR的核心功能通过浏览器访问http://你的容器IP:7860你会看到一个简洁的Gradio界面。它的核心功能是分析上传的音频文件支持wav, mp3等格式并输出三个维度的情感表达评分唤醒度 (Arousal)衡量声音的激动程度。低唤醒对应平静、沉稳的语调高唤醒对应兴奋、激昂的语调。自然度 (Nature)衡量声音听起来是否自然、舒适。不自然可能意味着紧张、做作自然则代表流畅、真实。韵律 (Prosody)衡量声音的节奏和抑扬顿挫。平淡的韵律听起来单调富有韵律则充满节奏感和变化。DeEAR会为每个维度输出一个介于0到1之间的分数并给出“低/高”、“不自然/自然”、“平淡/富有韵律”的类别判断。这些分数和类别就是我们后续需要的“声学情感特征”。3. 提取声学特征与DeEAR程序化交互为了将DeEAR集成到我们的联合模型中我们不能只依赖Web界面需要通过API的方式调用它以获取结构化的特征数据。3.1 编写DeEAR特征提取函数我们在同一个Python环境中创建一个新的脚本例如joint_emotion.py首先编写与DeEAR交互的部分。由于DeEAR本身是用Gradio启动的我们可以模拟一个本地客户端来调用它。import requests import json import time import numpy as np from typing import Dict, Any def extract_deear_features(audio_file_path: str, server_url: str http://localhost:7860) - Dict[str, Any]: 调用本地运行的DeEAR服务提取音频的声学情感特征。 参数: audio_file_path: 音频文件的路径。 server_url: DeEAR服务的地址默认为本地7860端口。 返回: 包含唤醒度、自然度、韵律分数及类别的字典。 # 准备上传的文件 with open(audio_file_path, rb) as f: files {file: f} # 向DeEAR的预测接口发送请求 # 注意实际端点需要根据DeEAR的app.py确定这里假设为 /predict try: response requests.post(f{server_url}/predict, filesfiles, timeout30) response.raise_for_status() # 检查请求是否成功 result response.json() except requests.exceptions.RequestException as e: print(f请求DeEAR服务失败: {e}) # 返回模拟数据供演示实际使用时请注释掉 return { arousal: {score: 0.75, category: 高唤醒}, nature: {score: 0.82, category: 自然}, prosody: {score: 0.68, category: 富有韵律} } # 解析DeEAR的返回结果 # 这里需要根据DeEAR实际的返回JSON结构进行调整 # 假设返回格式为: {arousal: 0.75, nature: 0.82, prosody: 0.68, ...} features { arousal_score: result.get(arousal, 0.5), nature_score: result.get(nature, 0.5), prosody_score: result.get(prosody, 0.5), # 也可以根据分数阈值自己判断类别或直接使用返回的类别 arousal_category: 高唤醒 if result.get(arousal, 0.5) 0.5 else 低唤醒, nature_category: 自然 if result.get(nature, 0.5) 0.5 else 不自然, prosody_category: 富有韵律 if result.get(prosody, 0.5) 0.5 else 平淡, } return features # 测试函数 if __name__ __main__: # 确保DeEAR服务正在运行并准备一个测试音频 test_audio path/to/your/test_audio.wav # 替换为你的音频文件路径 features extract_deear_features(test_audio) print(DeEAR提取的声学特征) for key, value in features.items(): print(f {key}: {value})这段代码的核心是extract_deear_features函数它通过HTTP POST请求将音频文件发送给DeEAR服务并解析返回的JSON结果得到三个维度的分数。请注意你需要根据DeEAR应用实际定义的API端点可能是/predict,/run,/api等和返回的JSON格式来调整代码中的请求URL和解析逻辑。3.2 准备测试音频你可以录制一段自己说的话或者从网上下载一段带有明显情感的语音例如高兴的、生气的、悲伤的。将其保存为WAV或MP3格式并更新上面测试代码中的文件路径。运行测试如果一切顺利你将得到类似这样的输出DeEAR提取的声学特征 arousal_score: 0.89 nature_score: 0.76 prosody_score: 0.93 arousal_category: 高唤醒 nature_category: 自然 prosody_category: 富有韵律这组数值就是我们从声音中提取到的“情感密码”。4. 集成Whisper提取文本语义特征现在轮到第二位主角——Whisper登场。Whisper是OpenAI开源的语音识别模型不仅能高精度转写文本其编码器输出的特征也蕴含了丰富的语义信息非常适合用来分析文本情感。4.1 安装Whisper并加载模型在同一个Python环境中我们安装Whisper库。pip install openai-whisper然后在joint_emotion.py脚本中继续添加Whisper相关的代码。import whisper import torch def load_whisper_model(model_size: str base): 加载指定大小的Whisper模型。 可选型号: tiny, base, small, medium, large (越大越准越慢)。 对于情感分析base或small通常够用。 print(f正在加载Whisper-{model_size}模型...) model whisper.load_model(model_size) print(模型加载完毕。) return model def extract_whisper_features(model, audio_file_path: str): 使用Whisper处理音频获取转录文本和编码器特征。 参数: model: 已加载的Whisper模型。 audio_file_path: 音频文件路径。 返回: text: 转录的文本。 features: 编码器输出的特征张量通常为 [时间步, 特征维度]。 # 转录音频 result model.transcribe(audio_file_path) transcribed_text result[text] print(f转录文本: {transcribed_text}) # 为了获取编码器特征我们需要深入模型内部 # 加载音频并预处理 audio whisper.load_audio(audio_file_path) audio whisper.pad_or_trim(audio) mel whisper.log_mel_spectrogram(audio).to(model.device) # 获取编码器输出 with torch.no_grad(): # 获取编码器特征 # Whisper模型结构: encoder - decoder # 我们取编码器的最后一层输出 audio_features model.encoder(mel.unsqueeze(0)) # 增加batch维度 # audio_features的形状: [1, 时间步, 特征维度] # 通常我们对时间步取平均得到一个全局的音频特征向量 global_audio_feature audio_features.mean(dim1).squeeze().cpu().numpy() return transcribed_text, global_audio_feature # 测试Whisper功能 if __name__ __main__: # 加载模型首次运行会下载请保持网络通畅 whisper_model load_whisper_model(base) test_audio path/to/your/test_audio.wav # 使用同一个测试音频 text, whisper_features extract_whisper_features(whisper_model, test_audio) print(f\nWhisper提取的文本特征向量维度: {whisper_features.shape}) print(f特征向量前10个值: {whisper_features[:10]})这段代码做了两件事转录文本将音频内容转为文字这是分析语义情感的基础。提取特征获取Whisper编码器输出的特征向量。我们对所有时间步的特征取平均得到一个固定长度的向量这个向量浓缩了这段语音的语义信息。4.2 从文本中提取情感特征仅有文本还不够我们需要从文本中量化情感。这里我们可以用一个简单有效的方法使用预训练的情感分析模型如transformers库中的模型来分析转录文本。from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification import torch.nn.functional as F def load_text_emotion_model(): 加载一个预训练的文本情感分析模型。 # 这里使用一个在英文情感分析上表现不错的模型 # 对于中文可以替换为 bert-base-chinese 等中文模型并寻找对应的情感分析微调版本 model_name distilbert-base-uncased-finetuned-sst-2-english print(f正在加载文本情感模型: {model_name}) tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForSequenceClassification.from_pretrained(model_name) classifier pipeline(sentiment-analysis, modelmodel, tokenizertokenizer) return classifier def extract_text_emotion(classifier, text: str): 分析文本的情感倾向。 参数: classifier: 文本情感分类管道。 text: 待分析的文本。 返回: 情感标签如 POSITIVE/NEGATIVE和置信度分数。 if not text.strip(): # 处理空文本 return {label: NEUTRAL, score: 0.5} result classifier(text)[0] return result # 在测试部分集成 if __name__ __main__: # ... 之前的DeEAR和Whisper代码 ... # 加载文本情感模型 text_classifier load_text_emotion_model() text_emotion extract_text_emotion(text_classifier, text) print(f\n文本情感分析结果: {text_emotion})现在我们拥有了三组特征DeEAR声学特征3个维度的分数唤醒度、自然度、韵律。Whisper语义特征一个高维向量例如base模型是512维代表音频的语义编码。文本情感特征一个标签如积极/消极和置信度分数。5. 构建联合情感模型有了多模态特征下一步就是设计一个模型让它们“合作”起来做出最终的情感判断。我们这里构建一个简单的多层感知机MLP作为示例。5.1 设计模型架构我们的模型需要接受两种不同类型的输入并在早期进行融合。import torch import torch.nn as nn class JointEmotionModel(nn.Module): def __init__(self, deear_feat_dim3, whisper_feat_dim512, text_feat_dim1, hidden_dim128, num_classes4): 联合情感模型。 参数: deear_feat_dim: DeEAR特征维度3个分数。 whisper_feat_dim: Whisper全局特征向量的维度。 text_feat_dim: 文本情感特征维度这里用1个分数也可用标签的one-hot。 hidden_dim: 融合后网络的隐藏层维度。 num_classes: 最终要预测的情感类别数例如高兴、悲伤、愤怒、中性。 super(JointEmotionModel, self).__init__() # 特征融合层将不同维度的特征映射到同一空间并拼接 self.deear_fc nn.Linear(deear_feat_dim, 32) self.whisper_fc nn.Linear(whisper_feat_dim, 64) self.text_fc nn.Linear(text_feat_dim, 16) # 融合后的全连接网络 fused_dim 32 64 16 self.fc1 nn.Linear(fused_dim, hidden_dim) self.relu nn.ReLU() self.dropout nn.Dropout(0.3) self.fc2 nn.Linear(hidden_dim, num_classes) def forward(self, deear_feat, whisper_feat, text_feat): # 分别处理不同特征 deear_out self.deear_fc(deear_feat) whisper_out self.whisper_fc(whisper_feat) text_out self.text_fc(text_feat) # 拼接特征 fused torch.cat([deear_out, whisper_out, text_out], dim1) # 通过分类网络 x self.fc1(fused) x self.relu(x) x self.dropout(x) out self.fc2(x) return out # 实例化模型 model JointEmotionModel() print(model)这个模型的结构很直观三个独立的线性层分别处理DeEAR特征3维、Whisper特征512维和文本情感分数1维将它们映射到更小的维度。将映射后的特征拼接起来。通过一个小的全连接网络含ReLU激活和Dropout防止过拟合进行最终分类。5.2 准备训练数据与训练流程要训练这个模型你需要一个包含音频文件及其对应情感标签的数据集。这里我给出一个训练循环的框架。def prepare_sample(audio_path, label, deear_server_url, whisper_model, text_classifier): 为一个音频样本准备所有特征和标签。 # 1. 提取DeEAR特征 deear_feats_dict extract_deear_features(audio_path, deear_server_url) deear_feat_tensor torch.tensor([ deear_feats_dict[arousal_score], deear_feats_dict[nature_score], deear_feats_dict[prosody_score] ], dtypetorch.float32) # 2. 提取Whisper特征 _, whisper_feat_array extract_whisper_features(whisper_model, audio_path) whisper_feat_tensor torch.tensor(whisper_feat_array, dtypetorch.float32) # 3. 提取文本情感特征这里使用情感分数 transcribed_text, _ extract_whisper_features(whisper_model, audio_path) # 这里再调用一次是为了获取文本实际可优化 text_emotion extract_text_emotion(text_classifier, transcribed_text) # 将情感标签如POSITIVE转换为分数这里简单处理POSITIVE为1.0NEGATIVE为0.0 text_score 1.0 if text_emotion[label] POSITIVE else 0.0 text_feat_tensor torch.tensor([text_score], dtypetorch.float32) # 4. 标签 label_tensor torch.tensor(label, dtypetorch.long) return deear_feat_tensor, whisper_feat_tensor, text_feat_tensor, label_tensor def train_epoch(model, dataloader, optimizer, criterion, device): 一个训练轮次的代码框架。 model.train() total_loss 0 for batch in dataloader: # batch 应包含 deear_feats, whisper_feats, text_feats, labels deear_f, whisper_f, text_f, labels batch deear_f, whisper_f, text_f, labels deear_f.to(device), whisper_f.to(device), text_f.to(device), labels.to(device) optimizer.zero_grad() outputs model(deear_f, whisper_f, text_f) loss criterion(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() return total_loss / len(dataloader) # 注意完整的训练需要你构建DataLoader这里只是一个框架。重要提示实际训练中频繁调用DeEAR服务和Whisper转录会非常慢。最佳实践是预先提取所有音频样本的特征保存为文件如.npy或.pt然后在训练时直接加载这些特征文件这将极大提升训练效率。6. 总结与展望通过这个教程我们完成了一个从想法到实践的多模态情感分析原型。我们让DeEAR负责“听语气”让Whisper负责“辨内容”并将两者的信息融合在一个神经网络中共同做出决策。6.1 本教程核心回顾快速启动与理解DeEAR我们学会了如何启动这个强大的语音情感分析工具并理解了它输出的唤醒度、自然度、韵律三个核心维度。程序化提取声学特征通过编写Python函数与DeEAR的Web服务交互我们能够自动获取音频的情感分数为后续集成铺平道路。集成Whisper获取语义我们利用Whisper不仅得到了准确的转录文本还提取了深层的语义特征向量并辅以文本情感分析为模型提供了内容层面的情感线索。构建联合模型我们设计了一个简单的融合模型架构演示了如何将声学、语义、文本情感三类特征拼接并输入分类网络。6.2 下一步可以做什么这个原型只是一个起点你可以从很多方向让它变得更强大、更实用使用更丰富的数据集寻找或构建包含多模态情感标签如语音文本对应同一情感的数据集进行训练例如CMU-MOSEI。优化特征提取流程将特征提取离线化保存为特征库加速模型迭代。尝试更先进的融合策略除了简单的拼接可以尝试注意力机制让模型自己决定更关注声音还是文字、交叉模态变换器等。增加输出维度不仅预测离散的情感类别高兴、悲伤等还可以预测连续的维度如效价、唤醒度、支配度。部署为实时服务将训练好的模型封装成API可以实时分析麦克风输入或上传的音频文件。情感计算正在走向多模态融合的时代。单独分析声音或文字都像是盲人摸象只有将它们结合起来才能更接近人类理解情感的真实方式。希望这个教程能成为你探索这个有趣领域的一块敲门砖。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。