• 倒谱分析的公式中,就是对某一个信号的FFT的log abs (X) 做IDFT,我们在计算fbank的时候,实际上只用了一半的频率,如果做IDFT,需要把另一半也补上,这样这个FBNK特征就是实对称的了,那么不论做DFT还是IDFT,最后不会有符号差异,因为虚部被抵消了。系数的差异会有,但是对于所有信号来说,都是一样的差异,不会影响。

  • 1. 对的;

    2. 倒谱分析的公式中,就是对某一个信号的FFT的log abs (X) 做IDFT,我们在计算fbank的时候,实际上只用了一半的频率,如果做IDFT,需要把另一半也补上,这样这个FBNK特征就是实对称的了,那么不论做DFT还是IDFT,最后不会有符号差异,因为虚部被抵消了。系数的差异会有,但是对于所有信号来说,都是一样的差异,不会影响。

  • 1. librosa的这个方式,就是我们讲的过程,128维的mel谱,就是fbank特征,至于用多少维度,每个工具都有自己默认的一个配置,后面用的时候,只要训练、测试保持一致就好,而且一般就是调用API计算,不需要自己写,需要自己写的时候,一般都是进行移植代码,比如到嵌入式设备,这时候只需要参看原始代码的实现移植过来;

    2. 这个倒是没有特别的要求,没有说什么场景适合什么,一般就是出于自己整体代码架构考虑

  • 感觉你这个下面的3条描述我都看不懂。。。

  • 1. 是的;

    2. 例如一个长N1的时域信号,补零之后,为N2,对两个信号做DFT之后,如果两个信号的m1/N1 = m2/N2,那么就说这两个索引点m1和m2表示的频率相同,很明显,在DFT的公式里,第一个信号的X(m1) = \sum_{n=0}^{N1-1} {x_n e^{-j2pi n *m1/N1}}, 补零后的第m2个点的DFT X(m2)= \sum_{n=0}^{N2-1} {x_n e^{-j2pi n *m2/N2}}, 因为m1/N1 = m2/N2, 两个公式里x_n都一样,只不过第二个信号的x_n里多了尾部一些0,对于此频率点,两者得到的结果一样

    3. 补零肯定都是时域补0了,原来时域有400个点,再在后面补112个0,形成512个点的时域信号,然后做512个点的DFT,然后取512个点的DFT的前257个点

     

  • 这个是说如果某一个时域信号中,包含了某个频率为f,幅度为A的正弦波,如果对这个信号进行N点DFT,那么DFT之后,在频率为f的那个索引m上 (m*fs / N ==f), 对于的DFT的幅值|X(m)| = AN/2

  • 1. 首先,答案是肯定的,会是target中的任意一个。因为我们目前只有11个类别,任何语音,即使和我们的目标语音完全无关,也会根据计算的似然结果,选择最大的这个,如果你想处理这种情况,你可以再加一个模型,表示除了这11个类别外的任何语音,但是这个模型就需要大量其他数据来训练,我们叫他“垃圾”模型。再者来说,咱们作业的这个简单的模型,也不合适连续语音识别,每个GMM(0-9,o)都是用它对应的语音数据训练,测试的时候,也只能整段语音分帧、加窗、提特征,然后在每个GMM上,计算每一帧的似然最后求和得到最终似然。

    2. 如果你说你就有两个GMM模型,一个是唤醒词模型,一个是除了唤醒词之外的其他数据的模型,那么这个可以看成是唤醒任务,但是一般不会这么做的,一般也是和HMM结合来做。

  • @petertsengruihon 如果所说的东西不是这11个target之内,我们在语音识别里叫“拒识“,对于我们这个作业,我想可以用上述垃圾模型,也可以通过阈值,如果任意语音在11个模型上的似然都很低,低于某一阈值,我们就拒绝识别,或者给一个UNK就好。

  • 公式11中,我们看到Q函数,实际上是ln p(X,Z|theta)这个联合分布关于Z的期望,虽然看着很复杂,但是本质上,还是对Z这个变量求期望,里面的X,theta,你都可以看成无关的变量,比如一个公式是f(x,y) = x+ y, 如果你对x求期望,E_x [f(x,y)] = E[x] + y, 因为y和x无关

  • K设置成5,实际上就是一个经验值,一个超参数,这个你自己也可以调整。

    咱们高斯函数的输入,只接收一个列向量,我注释里面写了,

  • 您好,

    1. 其实这个k在这里,是没有太多实际的意义的,后面当你们学习到HMM-GMM时候,HMM的每一状态你可以认为是对应到某一个子音素上,但是GMM咱们这里没有这个对应;

    2. 你说的后面这种情况确实会有影响,这种不匹配程度大的会变差很多,我们这次提供的数据,都是很简单的录音,也很干净,但是实际应用中,您提到的这个问题确实存在;

    3. 当你后面学习的过程,会发现,其实k的值并不是从一开始就固定的,一般对于一个复杂的系统,都是k先设置成1,然后逐渐增加k的值,直到满足某个准则,比如当发现所有模型的总体的高斯数的和已经到了某个阈值,或者再增加k,似然也不上升了。但是这都需要调参数的过程来确定

  • 这个对我们这个小的作业来说,并不重要,一般像HTK,初始话的时候,都是将一个句子平均分以下,每个模型用一部分数据初始化。

  • 一般我们不通过fbank特征再求特征了,可以用原始时域信号的能量作为能量维度,比如kaldi里面,会把13维MFCC特征中的第0维剔除,换成我们时域重新计算的能量

  • @soho968 最后我不需要输出能量,能量的计算每个人可能都不一样,所以我们最后只要求输出一个12维的特征就行,delta也不许需要。

  • 后面我们会给证明,这里先简单说一下。时域上的采样,相当于时域的连续信号一个冲击序列做乘积,那么变换到频域上,就是时域信号的傅里叶变换(FT)和冲击序列的傅里叶变换卷积。而时域的冲击序列,在频域上也是一个序列,这个离散的序列,如果把这个序列和原始信号的FT卷积,就会导致一个原始信号的FT的周期的重复。

    当时域信号是周期的时候,那么不论周期多大,不论用什么采样率,一个周期内,采样到的样本数N总是有限的吧?回忆一下DFT的两个点相差的频率值,是不是fs/N,当时域信号为为周期的时候,就相当于周期是无穷的,那么N也趋于无穷,那么fs/N -> 0, 此时频域就是连续的,但是当时域是周期的,N有限,fs/N就不会趋于0,频域就是离散的

  • bin,就是一个频率范围,每个bin表示从某个频率到某个频率的一个频率范围

  • 这个公式这么理解:首先看hz_points,你算出来的hz_points是不是应该是频率呢?比如sample_rate是16000,那么你的hz_pioint是不是大概像这样子:0,20,60, 160, 。。。7685 (数是我自己编的,举例子),那么hz_point / sample_rate 的目的,就是把这些hz转化为0-0.5之间的比例,然后再乘上一个NFFT+1,不就把hz_point转换成了DFT的点数的索引,也就是我们的ppt里面的m,因为我们DFT之后也是用m=0,1,2,。。。,NFFT/2+1来代表的频率轴的,所有这样最方便

     

  • @ai_persuit 这个公式这么理解:首先看hz_points,你算出来的hz_points是不是应该是频率呢?比如sample_rate是16000,那么你的hz_pioint是不是大概像这样子:0,20,60, 160, 。。。7685 (数是我自己编的,举例子),那么hz_point / sample_rate 的目的,就是把这些hz转化为0-0.5之间的比例,然后再乘上一个NFFT+1,不就把hz_point转换成了DFT的点数的索引,也就是我们的ppt里面的m,因为我们DFT之后也是用m=0,1,2,。。。,NFFT/2+1来代表的频率轴的,所有这样最方便

  • 这个你可以读一下librosa.filters.mel的代码,我看了一下,Slaney style的,只不过是对每个bin做了一个归一化,使每个filter bank的能量和大致相等。我也没有用过这种,一般我们讲的就是htk格式的,没有做过这种归一化。

  • 这里的e,可以用时域上的点\sum_n {x[n]^2}来计算,也可用频域上的的能量来计算\sum_m{|X[m]|^2}, 两者之间差一个scale,这个就是Parseval定理https://zh.wikipedia.org/wiki/%E5%B8%95%E5%A1%9E%E7%93%A6%E5%B0%94%E5%AE%9A%E7%90%86