音频特征提取及恢复消融实验

4 篇文章 0 订阅
2 篇文章 0 订阅

由于好奇音频提取特征再重构音频过程中各部分数据的‘样子’,故而对开源代码提取其对音频的处理过程以及重构过程,经测试发现其仅保留了文本内容的发声特征而遗失了说话者的特征(即能够了解音频的内容而无法分辨说话者)。

通过更换对音频的处理方式以及修改FFT窗口大小等参数进行消融实验发现如下参数及处理过程对音频的提取及还原效果最好。

import numpy,wave
import numpy as np
import torch
import librosa
import librosa.display
import matplotlib.pyplot as plt
import os
import pylab
from scipy import signal
import copy

sr = 22050 # 采样率
n_fft = 2048 # fft窗口大小
hop_length = 256# 帧移长度
win_length = 1024# 窗口长度,默认n_fft
n_mels = 80 # mel滤波器个数
n_iter = 64 # 迭代次数
preemphasis = .97 # 预加重、可为None
#各音量分贝
max_db = 100	
ref_db = 20
top_db = 15

def griffin_lim(spectrogram):
    X_best = copy.deepcopy(spectrogram)
    for i in range(n_iter):
        X_t = invert_spectrogram(X_best)
        est = librosa.stft(X_t, n_fft, hop_length, win_length=win_length)
        phase = est / np.maximum(1e-8, np.abs(est))
        X_best = spectrogram * phase
    X_t = invert_spectrogram(X_best)
    y = np.real(X_t)

    return y

def _mel_to_linear_matrix(sr, n_fft, n_mels):
    m = librosa.filters.mel(sr, n_fft, n_mels)
    m_t = np.transpose(m)
    p = np.matmul(m, m_t)
    d = [1.0 / x if np.abs(x) > 1.0e-8 else x for x in np.sum(p, axis=0)]
    return np.matmul(m_t, np.diag(d))

def invert_spectrogram(spectrogram):
    return librosa.istft(spectrogram, hop_length, win_length=win_length, window="hann")

# 文件路径
testpath="./test.wav"

# 文件提取处理
speech, sr = librosa.core.load(path=testpath, sr=None, mono=True)
speech, _ = librosa.effects.trim(speech, 22)    #除去音频首尾静音,第二个参数为将22分贝以下的视为静音
speech = np.append(speech[0], speech[1:] - 0.97*speech[:-1])

# 短时傅里叶变换
linear=librosa.stft(y=speech, n_fft=1024, hop_length=256)

lin_spec=np.abs(linear)

# 构建mel滤波器组
mel_filterbank = librosa.filters.mel(sr=sr, n_fft=1024, n_mels=80)
mel_spec = np.dot(mel_filterbank, lin_spec)

mel = 20 * np.log10(np.maximum(1e-5, mel_spec))
lin = 20 * np.log10(np.maximum(1e-5, lin_spec))

# 归一化
mel = np.clip((mel - ref_db + max_db) / max_db, 1e-8, 1)
lin = np.clip((lin - ref_db + max_db) / max_db, 1e-8, 1)

# 转置
mel = mel.T.astype(np.float32) 
lin = lin.T.astype(np.float32) 

mel = mel.T

mel = (np.clip(mel, 0, 1) * max_db) - max_db + ref_db

# 转振幅
mel = np.power(10.0, mel * 0.05)
m = _mel_to_linear_matrix(sr, n_fft, n_mels)
mag = np.dot(m, mel)

# 音频重构
wav = griffin_lim(mag)

# 滤波
wav = signal.lfilter([1], [1, -preemphasis], wav)

# 修剪音频
wav, _ = librosa.effects.trim(wav)

# 保存
librosa.output.write_wav("temp.wav", wav.astype(np.float32), sr)

实验内容记录:

在这里插入图片描述

如上所示,表现较好的为5-8,且就griffin_lim迭代次数而言,64次迭代与其他表现效果无异,故而上述代码采取13的参数内容。

如上所述,可以发现griffinlim编码,加窗效果会更佳,这是因为发生了吉布斯现象(Gibbs phenomenon):在不连续点处产生高频分量导致傅里叶变换后的频谱出现局部峰值。此外,由于周期信号在分帧过程中被截断,会导致频谱在整个频带你发生拖尾现象,该现象称为频谱泄漏(spectral leakage)。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KCF (Kernelized Correlation Filter) 是一种改进的相关滤波算法,它通过在CSK(Combined Spatial and Appearance Model,空间与外观模型结合)的基础上加入了核技巧(kernel trick),提高了性能。然而,关于"消融实验"和"消融系数",通常指的是评估算法中某个特定组件对整体性能影响的研究,比如移除或改变某一特征或者优化步骤来分析其对追踪精度和速度的影响。 在KCF的消融实验中,可能会涉及以下几个关键因素的分析: 1. **核函数的选择**:不同的核函数(如高斯核、线性核等)会影响滤波器的表达能力和计算效率。实验可能比较不同核函数对追踪效果的影响[^1]。 2. **尺度不变性**:KCF通过尺度空间金字塔来处理目标的大小变化,但可能调整金字塔的级数或尺度步长以研究其对性能的影响。 3. **模板大小**:模板大小决定了滤波器的局部感受野,改变模板大小可能会影响追踪的稳定性和响应速度。 4. **迭代次数**:滤波器的更新迭代次数对追踪精度有直接关系,增加迭代次数理论上可以提高准确性,但可能导致计算时间变长。 5. **初始化策略**:追踪器的初始位置对后续的追踪至关重要,不同的初始化策略可能会影响最终结果。 要了解具体的消融系数,通常需要查阅KCF相关的原始论文或详细实验报告,其中会提供详细的参数调整和性能分析[^2]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值