Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 附加音频特征提取提示_Python_Machine Learning_Feature Extraction - Fatal编程技术网

Python 附加音频特征提取提示

Python 附加音频特征提取提示,python,machine-learning,feature-extraction,Python,Machine Learning,Feature Extraction,我正在尝试使用Keras创建一个语音情感识别模型,我已经完成了所有的代码并训练了该模型。它大约有50%的有效性,而且过于合适 当我使用model.predict()和看不见的数据时,它似乎很难区分“中立”、“平静”、“快乐”和“惊讶”,但在大多数情况下,它似乎能够正确预测“愤怒”——我认为这是因为音高或其他方面存在明显差异 我想这可能是因为我没有从这些情绪中获得足够的特征,这将有助于模型区分它们 目前我正在使用Librosa并将音频转换到MFCC。有没有其他方法,即使使用Librosa,我也可以

我正在尝试使用Keras创建一个语音情感识别模型,我已经完成了所有的代码并训练了该模型。它大约有50%的有效性,而且过于合适

当我使用model.predict()和看不见的数据时,它似乎很难区分“中立”、“平静”、“快乐”和“惊讶”,但在大多数情况下,它似乎能够正确预测“愤怒”——我认为这是因为音高或其他方面存在明显差异

我想这可能是因为我没有从这些情绪中获得足够的特征,这将有助于模型区分它们

目前我正在使用Librosa并将音频转换到MFCC。有没有其他方法,即使使用Librosa,我也可以提取模型的特征,帮助它更好地区分“中立”、“平静”、“快乐”、“惊讶”等

一些特征提取代码:

wav_clip, sample_rate = librosa.load(file_path, duration=3, mono=True, sr=None)     
mfcc = librosa.feature.mfcc(wav_clip, sample_rate)

此外,这是1400个样本

关于启动器的一些观察结果:

  • 可能您的样本太少,无法有效使用神经网络。为初学者使用一个简单的算法来很好地理解您的模型是如何进行预测的
  • 确保您有足够的(30%或更多)来自不同扬声器的样本用于最终测试。您只能使用此测试集一次,因此请考虑构建一个管道来生成训练集、验证集和测试集。请确保不要将同一个扬声器放入超过1组
  • librosa中的第一个系数提供了一个偏移量。我建议您绘制功能与标签之间的关系以及它们的重叠程度,我想有些功能很容易混淆。查找是否有任何功能可以区分您的类。不要通过运行模型来实现这一点,先进行目视检查
到实际功能!你认为投球应该起到至关重要的作用是正确的。我建议您检查一下——它有Python绑定

还提供了出色的功能选择

您可能很容易就拥有150多个功能。您可能希望降低问题的维度,甚至可能将其压缩为2d,看看是否可以以某种方式将类分开。这是我自己关于Dash的例子

最后,一些从音频中提取频率的基本代码。在这种情况下,我还试图找到三个峰值频率

import numpy as np

def spectral_statistics(y: np.ndarray, fs: int, lowcut: int = 0) -> dict:
    """
    Compute selected statistical properties of spectrum
    :param y: 1-d signsl
    :param fs: sampling frequency [Hz]
    :param lowcut: lowest frequency [Hz]
    :return: spectral features (dict)
    """
    spec = np.abs(np.fft.rfft(y))
    freq = np.fft.rfftfreq(len(y), d=1 / fs)
    idx = int(lowcut / fs * len(freq) * 2)
    spec = np.abs(spec[idx:])
    freq = freq[idx:]

    amp = spec / spec.sum()
    mean = (freq * amp).sum()
    sd = np.sqrt(np.sum(amp * ((freq - mean) ** 2)))
    amp_cumsum = np.cumsum(amp)
    median = freq[len(amp_cumsum[amp_cumsum <= 0.5]) + 1]
    mode = freq[amp.argmax()]
    Q25 = freq[len(amp_cumsum[amp_cumsum <= 0.25]) + 1]
    Q75 = freq[len(amp_cumsum[amp_cumsum <= 0.75]) + 1]
    IQR = Q75 - Q25
    z = amp - amp.mean()
    w = amp.std()
    skew = ((z ** 3).sum() / (len(spec) - 1)) / w ** 3
    kurt = ((z ** 4).sum() / (len(spec) - 1)) / w ** 4

    top_peaks_ordered_by_power = {'stat_freq_peak_by_power_1': 0, 'stat_freq_peak_by_power_2': 0, 'stat_freq_peak_by_power_3': 0}
    top_peaks_ordered_by_order = {'stat_freq_peak_by_order_1': 0, 'stat_freq_peak_by_order_2': 0, 'stat_freq_peak_by_order_3': 0}
    amp_smooth = signal.medfilt(amp, kernel_size=15)
    peaks, height_d = signal.find_peaks(amp_smooth, distance=100, height=0.002)
    if peaks.size != 0:
        peak_f = freq[peaks]
        for peak, peak_name in zip(peak_f, top_peaks_ordered_by_order.keys()):
            top_peaks_ordered_by_order[peak_name] = peak

        idx_three_top_peaks = height_d['peak_heights'].argsort()[-3:][::-1]
        top_3_freq = peak_f[idx_three_top_peaks]
        for peak, peak_name in zip(top_3_freq, top_peaks_ordered_by_power.keys()):
            top_peaks_ordered_by_power[peak_name] = peak

    specprops = {
        'stat_mean': mean,
        'stat_sd': sd,
        'stat_median': median,
        'stat_mode': mode,
        'stat_Q25': Q25,
        'stat_Q75': Q75,
        'stat_IQR': IQR,
        'stat_skew': skew,
        'stat_kurt': kurt
    }
    specprops.update(top_peaks_ordered_by_power)
    specprops.update(top_peaks_ordered_by_order)
    return specprops
将numpy导入为np
定义光谱统计(y:np.ndarray,fs:int,低切:int=0)->dict:
"""
计算光谱的选定统计特性
:参数y:1-d符号SL
:param fs:采样频率[Hz]
:参数低切:最低频率[Hz]
:返回:光谱特征(dict)
"""
规格=np.abs(np.fft.rfft(y))
freq=np.fft.rfftfreq(len(y),d=1/fs)
idx=int(低切/fs*len(频率)*2)
spec=np.abs(spec[idx:])
freq=freq[idx:]
amp=规格/规格总和()
平均值=(频率*amp).sum()
sd=np.sqrt(np.sum(安培*((频率-平均值)**2)))
amp_cumsum=np.cumsum(amp)

中位数=freq[len(amp_cumsum[amp_cumsum]有多个不同的说话人吗?样本有不同的语音内容吗?你的CNN看起来怎么样?