【问题标题】:Getting the amplitude(or rms voltage) of audio signal captured in C++ by wavin lib.?获取 wavin lib 在 C++ 中捕获的音频信号的幅度(或 rms 电压)。?
【发布时间】:2011-07-28 08:56:22
【问题描述】:

我正在从事一个非常基本的机器人项目,并希望在其中实现语音识别。 我知道这是一件复杂的事情,但我只想为 3 或 4 个命令(或单词)做这件事。

我知道使用 wavin 可以录制音频。但是我想对音频信号做实时幅度分析,怎么做呢,波会以8位单声道输入。

我曾考虑将信号划分为一组特定时间,进一步将其划分为更小的子集,获取子集的平均 rms 值,然后将它们相加,然后查看它们与实际存储的差异有多大信号。如果错误低于所有(或大多数)集合的可接受值,则打印该单词。

如何实现? 如果您也可以提供任何其他建议,那就太好了。

谢谢,提前。

【问题讨论】:

    标签: c++ speech-recognition audio-processing


    【解决方案1】:

    没有简单的方法来识别单词,因为它们基本上是一个音素序列,可以随时间和频率变化。

    经典孤立词识别系统使用信号MFCC(倒谱系数)作为输入数据,并尝试使用 HMM(隐藏马尔可夫模型)或 DTW(动态时间扭曲)算法识别模式。

    如果您不想要录音按钮,您还需要一个静音检测模块。

    例如,Edimburgh University toolkit 提供了其中一些工具(带有良好的文档)。

    如果您不想“从头开始”构建它或有灵感来源,here 是这样一个系统(使用自己的工具包)的(旧但免费)实现,带有 full explanation and practical examples关于它是如何工作的。

    此系统是 LVCSR(大词汇连续语音识别),您只需要它的一个子集。如果有人知道开源精简词汇系统(如简单的 IVR),那将是受欢迎的。

    如果你想自己做一个基本的系统,我建议你使用MFCC和DTW:

    • 对于每个要建模的目标词:
      • 记录单词的一些实例
      • 通过单词计算一些(例如每10ms)delta-MFCC以获得模型
    • 当您想要识别信号时:
      • 计算此信号的一些 delta-MFCC
      • 使用 DTW 将这些 delta-MFCC 与每个模型化单词的 delta-MFCC 进行比较
      • 输出最适合的词(使用阈值丢弃垃圾)

    【讨论】:

    • 任何想法,为什么子集的 rms 值的比较,不会做这项工作,只有一个人会口授的东西,而词汇只有几个词..
    • 同一个说话者可以用不同的能量、频率、速度和节奏来发音同一个词。一个词的足迹在于频率的变化,而不是能量的变化。这就是为什么你真的应该使用 MFCC 而不是 rms 值。为了应对速度和节奏,DTW是最简单的方法。如果没有在单词和参考之间进行这种对齐,您将无法识别单词。
    • 注意使用 delta-MFCC(MFCC 的衍生物)来获得每个频率的能量变化(我稍微改变了我的答案)。另请注意,@Michael 引用了 sphynx,它提供了一个名为 pocketsphynx 的 C++ 实现(我不知道),尽管它是一个 LVCSR(因此基于音素并使用语言模型,你不需要的东西)。
    • 感谢您的澄清
    【解决方案2】:

    如果您只想识别几个命令,您可以使用许多商业和免费产品。请参阅 Need text to speech and speech recognition tools for LinuxWhat is the difference between System.Speech.Recognition and Microsoft.Speech.Recognition?Speech Recognition on iPhone。这些问题的答案链接到许多可用的产品和工具。语音识别和理解命令列表是商业上解决的一个非常常见的问题。您呼叫的许多语音自动电话系统都使用这种技术。开发人员也可以使用相同的技术。

    从几个月来观察这些问题,我发现大多数开发者的选择都是这样分解的:

    当然这也可能有帮助 - http://en.wikipedia.org/wiki/List_of_speech_recognition_software

    【讨论】:

    • Sapi 似乎足以胜任这项工作,但我只熟悉 borland c++ 编译器,如果我需要实现 SAPI,我应该学习 VC++ 还是 C#,以及任何可能有助于从 C++ 过渡的资源到 vc++ 会很棒。谢谢。
    • SAPI 只是一个标准的 COM API,是 Windows SDK 的一部分。您应该能够使用任何 C++ 编译器对其进行编程。有关一些有用的信息和链接,请参阅 en.wikipedia.org/wiki/Microsoft_Speech_API#SAPI_5.3。 C# 和 .NET 中的 System.Speech 命名空间无疑使开发支持语音的应用程序变得更加容易,但您不必学习一门新语言即可将语音添加到现有应用程序中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多