使用 MATLAB 深度学习实现语音情绪识别

在智能语音系统和情感计算领域,语音情绪识别逐渐成为一个关键技术。语音情绪识别能够通过分析音频信号中的语音特征,准确地识别说话者的情绪状态,例如愤怒、快乐、悲伤等。这一技术应用广泛,可以用于智能客服、医疗情绪分析以及语音助手的情感交互。


前言

     本项目实现了从音频数据的加载、预处理、特征提取到情绪分类的全过程,最终输出情绪识别的准确率。我们应用了音频数据增强技术(如音高移位、时间偏移等)来扩大训练数据集,并使用了梅尔频率谱图进行特征提取,以获得高质量的语音特征。随后,构建了一个卷积神经网络(CNN),用于对不同的情绪进行分类,最终实现高效的语音情绪识别。


一、导入数据集

1.1导入音频数据和标签

      我们首先从本地的音频数据集中导入所有语音文件,并根据其所在的文件夹名提取情感标签。使用 MATLAB 中的 audioDatastore 函数来读取音频文件, categorical 函数将情感标签转化为 MATLAB 支持的分类数据格式。

代码如下:


dataset = 'C:\Users\ZhuanZ\Desktop\信号处理\53语音识别\数据集';%数据集路径改成您自己的。

% 创建一个音频数据存储对象 ads,指向 dataset 文件夹中的音频文件
ads = audioDatastore(dataset, 'IncludeSubfolders', true, 'OutputDataType', 'single');

% 提取文件路径中的文件夹名作为标签
labels = cell(size(ads.Files));  % 初始化标签数组

for i = 1:length(ads.Files)
    % 获取文件路径并提取父文件夹名作为情感标签
    filePath = ads.Files{i};
    parentFolder = fileparts(filePath);
    [~, label] = fileparts(parentFolder);
    labels{i} = label;
end

% 将标签转换为分类数据
labels = categorical(labels);

% 显示标签类别的统计信息
summary(labels);

说明:

  • audioDatastore 函数创建了一个音频数据存储对象 ads,该对象能够处理音频文件及其元数据。
  • fileparts 函数用于分解文件路径,并从路径中提取父文件夹名称作为情感标签。
  • categorical 函数将标签转换为分类数据,以便于后续的处理和分析。
  • summary 函数提供了标签类别的统计信息,帮助我们了解数据集的标签分布情况。

    以上代码段实现了音频文件的读取,并提取每个文件的标签。通过这种方式,数据集中每个音频样本都关联了一个情感标签,为后续的训练与测试做好准备。

1.2 划分训练集和测试集

        为了评估模型的性能,我们将数据集按 90%/10% 的比例随机划分为训练集和测试集。通过使用 splitlabels 函数来生成数据集的划分索引,随后我们创建两个数据存储对象,分别用于保存训练数据和测试数据。

代码如下:

% 根据 labels 标签将数据按 90%/10% 的比例随机划分为训练集和测试集
idxs = splitlabels(labels, 0.9, 'randomized');

% 使用训练数据的索引,提取出训练集音频数据
adsTrain = subset(ads, idxs{1});

% 使用测试数据的索引,提取出测试集音频数据
adsTest = subset(ads, idxs{2});

% 提取训练集对应的标签
labelsTrain = labels(idxs{1});

% 提取测试集对应的标签
labelsTest = labels(idxs{2});

% 获取训练集中所有唯一标签类别
classes = unique(labelsTrain);

% 显示所有标签类别
disp('所有标签类别:');
disp(classes);

说明:

  • splitlabels 函数用于将标签数据按比例划分为训练集和测试集。通过指定 randomized 选项,确保划分的随机性。
  • subset 函数提取训练集和测试集中的音频数据。
  • 通过索引获取训练集和测试集的标签,确保数据和标签的一一对应。

二、音频数据增强

2.1 数据增强的必要性

       语音情绪识别任务中,语音情绪识别任务中的数据集通常较小,特别是在实际情绪分类的语音数据中,收集的语料库可能不足,难以覆盖所有情绪类别和复杂的语音变化。在实际的应用场景中,语音数据往往并不如实验环境中那么纯净,可能伴随环境噪声、录音设备问题等。数据增强通过加入噪声或其他变化,使得模型能够更好地应对现实中的干扰因素,提高对嘈杂数据的鲁棒性,进而在真实场景中表现得更好。

2.2 使用 audioDataAugmenter 实现数据增强

代码如下:

% 创建一个 audioDataAugmenter 对象,用于对音频数据进行数据增强
augmenter = audioDataAugmenter( ...
    PitchShiftProbability=0.5, ...           % 50% 的概率对音频进行音高调整
    SemitoneShiftRange=[-12 12], ...         % 音高调整的范围在 -12 到 +12 个半音之间
    TimeShiftProbability=0.5, ...            % 50% 的概率对音频进行时间偏移
    VolumeControlProbability=0.5, ...        % 50% 的概率对音频进行音量控制
    AddNoiseProbability=0.5);                % 50% 的概率添加噪声

% 设置音频增强器的音高调整参数
setAugmenterParams(augmenter, "shiftPitch", ...
    LockPhase=true, ...            % 锁定音频信号的相位,防止音高调整时出现相位失真
    PreserveFormants=true, ...     % 在音高调整时保留共鸣峰,确保语音特征不被破坏
    CepstralOrder=30);             % 使用 30 阶倒谱分析来增强音频特征保留的精度

说明:

  • audioDataAugmenter 函数创建一个数据增强器对象,配置了多种音频变换技术。

三、梅尔频率谱图特征提取

3.1 梅尔频率谱图的概念

       梅尔频率谱图(Mel-Spectrogram)在语音处理中通过将音频信号转换为二维频谱图,提供了信号在时间和频率上的详细特征。这种表示方式符合人耳的听觉感知特性,因为梅尔尺度模仿了人耳对频率的感知,能够有效捕捉语音信号中的重要频率信息。同时,梅尔频率谱图对噪声有一定的鲁棒性,有助于减少噪声对识别结果的影响。此外,由于其二维特征图适合用于卷积神经网络(CNN)等深度学习模型,因此能够提高语音识别和处理任务的性能。

3.2使用 audioFeatureExtractor 提取梅尔频率谱图

      为了让卷积神经网络能够处理音频数据,我们使用了梅尔频率谱图特征提取方法。梅尔频率谱图是一种常用于语音处理的特征,它能够有效捕捉语音中的频率变化,并将音频数据转换为适合 CNN 处理的二维数据。

代码如下:

% 设置音频采样率
fs = 8000;

% 使用 transform 函数对训练数据进行增强
adsAugTrain = transform(adsTrain, @(y)deal(augment(augmenter, y, fs).Audio{1}));

% 设置帧持续时间和帧长度
frameDuration = 0.22;  % 帧的持续时间为 0.22 秒
frameLength = round(frameDuration * fs);  % 将帧持续时间转换为帧长度,单位是样本数

% 设置跳跃时间和跳跃长度
hopDuration = 0.01;  % 帧之间的跳跃时间为 0.01 秒
hopLength = round(hopDuration * fs);  % 将跳跃时间转换为跳跃长度,单位是样本数

% 设置音频段长度
segmentLength = 8192;  % 每个音频段的长度为 8192 个样本

% 设置梅尔频率谱图的参数
numBands = 40;  % 梅尔频率谱图中的频带数量为 40
fftLength = 2048;  % 快速傅里叶变换(FFT)的长度为 2048 点

% 创建一个音频特征提取器对象
afe = audioFeatureExtractor( ...
    melSpectrum=true, ...                  % 启用梅尔频率谱图特征提取
    SampleRate=fs, ...                     % 设置音频采样率为 fs (8000 Hz)
    Window=hamming(frameLength, "periodic"), ...  % 使用周期性的汉明窗函数,窗长度为 frameLength
    OverlapLength=(frameLength - hopLength), ... % 设置窗函数的重叠长度
    FFTLength=fftLength);                 % 设置 FFT 的长度为 fftLength (2048)

% 配置音频特征提取器的梅尔频率谱图参数
setExtractorParameters(afe, "melSpectrum", ...
    NumBands=numBands, ...              % 设置梅尔频率谱图中的频带数量
    FrequencyRange=[50 fs/2], ...       % 设置梅尔频率谱图的频率范围,从 50 Hz 到 fs/2 Hz
    WindowNormalization=true, ...       % 启用窗函数归一化
    ApplyLog=true);                     % 对梅尔频率谱图应用对数变换

% 对增强后的音频数据进行变换,将其转换为梅尔频率谱图
adsSpecTrain = transform(adsAugTrain, @(x)getSpeechSpectrogram(x, afe, segmentLength));

% 创建一个数据存储对象来保存训练标签
labelsTrain = arrayDatastore(labelsTrain);

% 将特征数据和标签数据结合成一个联合数据存储
tdsTrain = combine(adsSpecTrain, labelsTrain);

% 对测试数据进行转换,将音频信号转换为梅尔频率谱图
adsTestT = transform(adsTest, @(x){getSpeechSpectrogram(x, afe, segmentLength)});

        这里用到getSpeechSpectrogram函数,getSpeechSpectrogram 函数用于从音频信号中提取梅尔频率谱图

function X = getSpeechSpectrogram(x, afe, segmentLength)
    % getSpeechSpectrogram 函数用于计算音频信号的梅尔频谱图
    % x 是输入的音频数据,afe 是音频特征提取器,segmentLength 是标准化的长度
    x = resize(x, segmentLength, 'both');  % 调整音频长度
    x = x ./ max(abs(x));  % 归一化音频数据
    X = extract(afe, x).';  % 提取梅尔频谱特征
end

      还有一个是resize 函数用于调整音频信号的长度,使其符合指定的 targetLength。该函数根据音频信号的当前长度,决定是裁剪还是填充音频信号,以达到目标长度。

function y = resize(x, targetLength, padDirection)
    % resize 函数用于调整音频长度到 targetLength
    currentLength = length(x);
    if currentLength > targetLength
        startIdx = floor((currentLength - targetLength) / 2) + 1;
        y = x(startIdx:startIdx + targetLength - 1);
    else
        padSize = targetLength - currentLength;
        if strcmp(padDirection, 'both')
            padLeft = floor(padSize / 2);
            padRight = padSize - padLeft;
            y = [zeros(padLeft, 1); x; zeros(padRight, 1)];
        else
            y = [x; zeros(padSize, 1)];
        end
    end
end

说明:

  • audioFeatureExtractor 创建一个特征提取器对象,用于提取梅尔频率谱图。
  • 梅尔频率谱图通过 hamming 窗函数和 FFT 变换来计算,以获取音频信号的频谱特征。
  • transform 函数将特征提取操作应用到增强后的训练数据上。

四、卷积神经网络模型的构建

4.1 卷积神经网络的设计原理

       卷积神经网络(CNN)非常适合处理梅尔频率谱图,因为它能够有效地从二维特征图中提取局部特征,并自动学习到复杂的频谱模式。在语音情绪识别中,CNN 利用其对局部特征的敏感性和空间层次结构的能力,能够识别情绪相关的细微变化,如语调和语速的变化,从而提高分类准确性,并且对不同说话者和录音环境具有较好的鲁棒性。

4.2 定义卷积神经网络的层次结构

       卷积神经网络(CNN)擅长处理二维图像数据,而梅尔频率谱图可以视作一种二维图像。这使得 CNN 非常适合用于语音情绪识别任务。以下是构建的 CNN 模型层次结构:

% 从转换后的数据存储中读取所有数据
XTest = readall(adsTestT);

% 将读取的数据合并为一个四维数组
XTest = cat(4, XTest{:});

% 获取测试数据的大小
sz = size(XTest);

% 提取梅尔频率谱图的空间尺寸(高度和宽度)
specSize = sz(1:2);

% 定义输入图像的大小,添加一个通道维度
imageSize = [specSize 1];

% 获取分类数量(类别数)
numClasses = numel(classes);

% 定义dropout的概率
dropoutProb = 0.5;

% 定义卷积层的数量
numF = 24;

% 定义卷积神经网络的层次结构
% 修改卷积神经网络结构
layers = [
    imageInputLayer(imageSize, Normalization="none")
    convolution2dLayer(3, numF, Padding="same")
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(2, Stride=2, Padding="same")
    
    convolution2dLayer(3, 2*numF, Padding="same")
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(2, Stride=2, Padding="same")
    
    convolution2dLayer(3, 4*numF, Padding="same")
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(2, Stride=2, Padding="same")
    
    dropoutLayer(dropoutProb)  % 增加 dropout 层
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

     

说明:

  • CNN 模型包括多个卷积层和池化层,用于提取和减少特征维度。

  • dropoutLayer 用于防止模型过拟合,增加网络的泛化能力。
  • fullyConnectedLayersoftmaxLayer 用于将卷积层输出转换为情绪类别预测。

 该网络通过多层卷积和池化操作,从梅尔频率谱图中学习不同的语音模式。最后通过全连接层和 softmax 分类器,输出语音的情感类别。构建了一个三层的 CNN 网络,每层卷积后都跟随一个最大池化层以减少特征维度,最后通过全连接层和 softmax 进行分类。dropout 层被引入以防止过拟合。

五、模型训练与评估

      在完成数据预处理和特征提取后,最后一步是训练卷积神经网络(CNN)并评估其在测试集上的表现。这个过程包括定义训练选项、训练模型、保存模型、进行预测和计算分类准确率。

5.1 设置训练参数

      我们使用 trainNetwork 函数来训练卷积神经网络。首先,我们需要设置训练选项,包括学习率、最大训练轮次、批大小等。

代码如下:

% 设置训练选项
options = trainingOptions('adam', ...  % 使用 Adam 优化器进行训练
    'InitialLearnRate', 1e-4, ...      % 设置初始学习率为 0.0001
    'MaxEpochs', 100, ...              % 最大训练轮次为 100
    'LearnRateSchedule', 'piecewise', ... % 使用分段学习率调度
    'LearnRateDropFactor', 0.5, ...    % 每 30 个 epoch 将学习率降低为当前的一半
    'LearnRateDropPeriod', 30, ...     % 每 30 个 epoch 进行一次学习率调整
    'MiniBatchSize', 128, ...          % 每个小批量的样本数为 128
    'Shuffle', 'every-epoch', ...      % 在每个 epoch 后打乱数据
    'Plots', 'training-progress', ...  % 显示训练进度图
    'ValidationData', {XTest, labelsTest}, ... % 在每个 epoch 后使用验证数据进行评估
    'ValidationFrequency', 30, ...     % 每 30 个 epoch 进行一次验证
    'Verbose', false);                 % 训练过程中不显示详细信息

说明:

  • trainingOptions 函数用于配置训练过程的各种参数。'adam' 是一种自适应学习率优化算法,通常表现良好。
  • InitialLearnRate 设置初始学习率,控制模型权重更新的步长。
  • MaxEpochs 定义了训练的最大轮次,决定了训练的周期长度。
  • LearnRateSchedule 和相关参数控制学习率的变化,帮助优化训练过程。
  • MiniBatchSize 决定每次更新模型参数时使用的样本数。
  • Shuffle 参数控制数据是否在每个 epoch 结束后被打乱,增加训练的随机性,有助于提高模型的泛化能力。
  • PlotsValidationData 设置了训练进度的可视化和模型的验证。

5.2 训练保存模型

% 训练网络
trainedNet = trainNetwork(tdsTrain, layers, options);
% 保存训练好的神经网络模型到指定的 .mat 文件
save('trainedNetwork.mat', 'trainedNet');

说明:

  • trainNetwork 函数使用前面定义的网络结构 (layers)、训练数据 (tdsTrain) 和训练选项 (options) 来训练卷积神经网络。
  • save 函数将训练好的模型 (trainedNet) 保存到一个 .mat 文件中,以便以后加载和使用。

5.3 模型评估与准确率计算

    在模型训练完成后,评估其性能是至关重要的步骤。这一过程包括使用测试数据对模型进行评估,并计算其分类准确率。准确率是衡量分类模型性能的一个重要指标,它表示模型正确预测的样本数量与总样本数量之比。

% 使用训练好的网络对测试集进行分类
YPred = classify(trainedNet, XTest);
% 计算模型在测试集上的分类准确率
acc = mean(YPred == labelsTest);

% 显示测试集上的分类准确率
disp("分类准确度: " + acc*100 + "%");

说明:

  • classify 函数使用训练好的模型 (trainedNet) 对测试数据 (XTest) 进行分类预测。YPred 将包含每个测试样本的预测类别。
  • mean 函数计算预测类别 (YPred) 与真实标签 (labelsTest) 之间的匹配比例,即准确率。
  • disp 函数显示分类准确率,帮助我们评估模型在测试集上的性能。

完整代码:

% 将数据集路径保存在变量 dataset 中
dataset = 'C:\Users\ZhuanZ(无密码)\Desktop\信号处理\53语音识别\数据集';

% 创建一个音频数据存储对象 ads,指向 dataset 文件夹中的音频文件
ads = audioDatastore(dataset, 'IncludeSubfolders', true, 'OutputDataType', 'single');

% 提取文件路径中的文件夹名作为标签
labels = cell(size(ads.Files));  % 初始化标签数组

for i = 1:length(ads.Files)
    % 使用 fileparts 函数获取文件的完整路径和父文件夹名
    filePath = ads.Files{i};
    parentFolder = fileparts(filePath);  % 获取父文件夹路径
    [~, label] = fileparts(parentFolder);  % 从父文件夹路径中提取文件夹名作为标签
    labels{i} = label;  % 将文件夹名作为标签
end

% 将 labels 转换为分类类型
labels = categorical(labels);

% 显示 labels 的汇总信息,包括每个标签的类别和出现的次数
summary(labels);

% 根据 labels 标签将数据按 90%/10% 的比例随机划分为训练集和测试集
idxs = splitlabels(labels, 0.9, 'randomized');

% 使用训练数据的索引,提取出训练集音频数据
adsTrain = subset(ads, idxs{1});

% 使用测试数据的索引,提取出测试集音频数据
adsTest = subset(ads, idxs{2});

% 提取训练集对应的标签
labelsTrain = labels(idxs{1});

% 提取测试集对应的标签
labelsTest = labels(idxs{2});

% 获取训练集中所有唯一标签类别
classes = unique(labelsTrain);

% 显示所有标签类别
disp('所有标签类别:');
disp(classes);

% 创建一个 audioDataAugmenter 对象,用于对音频数据进行数据增强
augmenter = audioDataAugmenter( ...
    PitchShiftProbability=0.5, ...           % 50% 的概率对音频进行音高调整
    SemitoneShiftRange=[-12 12], ...         % 音高调整的范围在 -12 到 +12 个半音之间
    TimeShiftProbability=0.5, ...            % 50% 的概率对音频进行时间偏移
    VolumeControlProbability=0.5, ...        % 50% 的概率对音频进行音量控制
    AddNoiseProbability=0.5);                % 50% 的概率添加噪声

% 设置音频增强器的音高调整参数
setAugmenterParams(augmenter, "shiftPitch", ...
    LockPhase=true, ...            % 锁定音频信号的相位,防止音高调整时出现相位失真
    PreserveFormants=true, ...     % 在音高调整时保留共鸣峰,确保语音特征不被破坏
    CepstralOrder=30);             % 使用 30 阶倒谱分析来增强音频特征保留的精度

% 设置音频采样率
fs = 8000;

% 使用 transform 函数对训练数据进行增强
adsAugTrain = transform(adsTrain, @(y)deal(augment(augmenter, y, fs).Audio{1}));

% 设置帧持续时间和帧长度
frameDuration = 0.22;  % 帧的持续时间为 0.22 秒
frameLength = round(frameDuration * fs);  % 将帧持续时间转换为帧长度,单位是样本数

% 设置跳跃时间和跳跃长度
hopDuration = 0.01;  % 帧之间的跳跃时间为 0.01 秒
hopLength = round(hopDuration * fs);  % 将跳跃时间转换为跳跃长度,单位是样本数

% 设置音频段长度
segmentLength = 8192;  % 每个音频段的长度为 8192 个样本

% 设置梅尔频率谱图的参数
numBands = 40;  % 梅尔频率谱图中的频带数量为 40
fftLength = 2048;  % 快速傅里叶变换(FFT)的长度为 2048 点

% 创建一个音频特征提取器对象
afe = audioFeatureExtractor( ...
    melSpectrum=true, ...                  % 启用梅尔频率谱图特征提取
    SampleRate=fs, ...                     % 设置音频采样率为 fs (8000 Hz)
    Window=hamming(frameLength, "periodic"), ...  % 使用周期性的汉明窗函数,窗长度为 frameLength
    OverlapLength=(frameLength - hopLength), ... % 设置窗函数的重叠长度
    FFTLength=fftLength);                 % 设置 FFT 的长度为 fftLength (2048)

% 配置音频特征提取器的梅尔频率谱图参数
setExtractorParameters(afe, "melSpectrum", ...
    NumBands=numBands, ...              % 设置梅尔频率谱图中的频带数量
    FrequencyRange=[50 fs/2], ...       % 设置梅尔频率谱图的频率范围,从 50 Hz 到 fs/2 Hz
    WindowNormalization=true, ...       % 启用窗函数归一化
    ApplyLog=true);                     % 对梅尔频率谱图应用对数变换

% 对增强后的音频数据进行变换,将其转换为梅尔频率谱图
adsSpecTrain = transform(adsAugTrain, @(x)getSpeechSpectrogram(x, afe, segmentLength));

% 创建一个数据存储对象来保存训练标签
labelsTrain = arrayDatastore(labelsTrain);
% 将特征数据和标签数据结合成一个联合数据存储
tdsTrain = combine(adsSpecTrain, labelsTrain);

% 对测试数据进行转换,将音频信号转换为梅尔频率谱图
adsTestT = transform(adsTest, @(x){getSpeechSpectrogram(x, afe, segmentLength)});

% 从转换后的数据存储中读取所有数据
XTest = readall(adsTestT);

% 将读取的数据合并为一个四维数组
XTest = cat(4, XTest{:});

% 获取测试数据的大小
sz = size(XTest);

% 提取梅尔频率谱图的空间尺寸(高度和宽度)
specSize = sz(1:2);

% 定义输入图像的大小,添加一个通道维度
imageSize = [specSize 1];

% 获取分类数量(类别数)
numClasses = numel(classes);

% 定义dropout的概率
dropoutProb = 0.5;

% 定义卷积层的数量
numF = 24;

% 定义卷积神经网络的层次结构
% 修改卷积神经网络结构
layers = [
    imageInputLayer(imageSize, Normalization="none")
    convolution2dLayer(3, numF, Padding="same")
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(2, Stride=2, Padding="same")
    
    convolution2dLayer(3, 2*numF, Padding="same")
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(2, Stride=2, Padding="same")
    
    convolution2dLayer(3, 4*numF, Padding="same")
    batchNormalizationLayer
    reluLayer
    maxPooling2dLayer(2, Stride=2, Padding="same")
    
    dropoutLayer(dropoutProb)  % 增加 dropout 层
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

% 增加训练轮次并调整学习率
options = trainingOptions('adam', ...
    'InitialLearnRate', 1e-4, ...  % 重新调整初始学习率
    'MaxEpochs', 100, ...          % 增加训练轮次
    'LearnRateSchedule', 'piecewise', ...
    'LearnRateDropFactor', 0.5, ...
    'LearnRateDropPeriod', 30, ...
    'MiniBatchSize', 128, ...      % 调整批大小
    'Shuffle', 'every-epoch', ...
    'Plots', 'training-progress', ...
    'ValidationData', {XTest, labelsTest}, ...
    'ValidationFrequency', 30, ...
    'Verbose', false);


% 训练网络,使用定义的层次结构、训练数据和训练选项
trainedNet = trainNetwork(tdsTrain,layers,options);

% 保存训练好的神经网络模型到指定的 .mat 文件
save('trainedNetwork.mat', 'trainedNet');

% 使用训练好的网络对测试集进行分类
YPred = classify(trainedNet,XTest);

% 计算模型在测试集上的分类准确率
acc = mean(YPred == labelsTest);

% 显示测试集上的分类准确率
disp("分类准确度: " + acc*100 + "%")

六、总结

       本项目实现了一个语音情绪识别系统。我们首先通过 MATLAB 加载并处理音频数据,确保所有样本的长度一致,以适应后续处理。接着,应用了音频数据增强技术,如音高移位和时间偏移,以扩展训练数据并提升模型的泛化能力。为了提取有效特征,我们使用了梅尔频率谱图,将音频信号转换为高质量的特征表示。在模型构建阶段,我们设计并训练了一个卷积神经网络(CNN),专门用于分类不同的情感。最终,我们对模型进行了评估,计算了在测试集上的分类准确率,验证了模型的性能。这一系统为语音情绪分析提供了可靠的解决方案。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值