【问题标题】:Voice recognition based on signal/spectrum analysis基于信号/频谱分析的语音识别
【发布时间】:2018-06-05 21:59:26
【问题描述】:

我正在研究一种通过比较信号和频谱来识别音频单词的解决方案。
为了解码音频,我使用 libavcodec 和 libavformat,并使用 1 个参考词并与其他词进行比较。
示例:

# Must return true
./vrecog --file_ref chocolat.wav --file_cmp chocolat_2.wav
# Must return false
./vrecog --file_ref chocolat.wav --file_cmp banana.wav

我的步骤:

  1. 我将信号放在 std::vector 中
  2. 我用Fast Fourier Transform将信号转换成频谱
  3. 我计算光谱的 [min, max, average, std_deviation, variance]
  4. 我使用步骤 3 中的值来计算 correlation coefficient

推理是否正确?系数总是接近 1,我不知道我可以用什么来有效地比较数据来表示单词是否相同。

这些是我的情节:
信号(chocolat、chocolat_2 和香蕉):
光谱(巧克力、chocolat_2 和香蕉):

我们可以很容易地看到两个“巧克力”词的信号和频谱似乎很接近,但我无法获得相似度的百分比。

【问题讨论】:

    标签: c++ signal-processing fft voice-recognition libav


    【解决方案1】:

    对于信号,这通常通过与卷积非常相似的互相关函数(两个信号)完成。因此,它可以通过专门设计为高效的 FFT 在数学上完成。使用相关函数后,您可以决定要成为“匹配”的阈值等。有关更多信息,我会在以下位置阅读:@ 987654321@ 因为我们正在谈论的内容非常繁重,并且被教过在我的一门大学课程中度过了几个星期。

    【讨论】:

    • 感谢您的 PDF,我也尝试计算包含 complex 数字的光谱的相关性,但有时结果不在 [-1:1] 中跨度>
    • 我假设您在谈论相关系数,您是否正确地处理虚数(取共轭)?
    • 是的,我说的是相关系数。当我尝试时,我会这样做:corr(a, b) = ifft(fft(a_and_zeros) * conj(fft(b_and_zeros))) 喜欢这个post
    • 好的,那么你说的是互相关方程。要获得 [-1:1] 范围内的数字,您需要除以 norm(a) * norm(b) 在这种情况下为 |a| * |b|。
    • ifft(std::valarray<std::complex<double> >) 给我回复std::valarray。我不明白要划分什么以及如何在范围之间获得一个值。我必须将返回数组中的复数总和除以总和的实部和虚部的乘积?
    猜你喜欢
    • 2016-08-07
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多