C++ 获取C+中捕获的音频信号的振幅(或均方根电压)+;在lib中使用wavin。?

C++ 获取C+中捕获的音频信号的振幅(或均方根电压)+;在lib中使用wavin。?,c++,speech-recognition,audio-processing,C++,Speech Recognition,Audio Processing,我正在从事一个非常基础的机器人项目,并希望在其中实现语音识别。 我知道这是一件复杂的事情,但我只希望用3或4个命令(或单词)来完成 我知道使用wavin我可以录制音频。但我想对音频信号进行实时振幅分析,如何做到这一点,波形将以8位单声道输入 我曾想过将信号划分为一组特定的时间,进一步细分为更小的子集,得到子集上的平均rms值,然后将其相加,然后查看它们与实际存储的信号有多大差异。如果所有(或大部分)集的误差低于可接受值,则打印单词 如何实现这一点? 如果你能给我任何其他的建议,那就太好了 提前谢

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

我知道使用wavin我可以录制音频。但我想对音频信号进行实时振幅分析,如何做到这一点,波形将以8位单声道输入

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

如何实现这一点? 如果你能给我任何其他的建议,那就太好了


提前谢谢。

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

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

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

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

如果你不想“从头开始”构建它,或者没有灵感来源,那么这是一个(古老但免费的)这样一个系统的实现(它使用自己的工具包),并对它的工作原理进行了详细的说明

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

如果您想自己制作一个基本系统,我建议您使用MFCC和DTW:

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

如果您只想识别一些命令,可以使用许多商业和免费产品。见或不见。这些问题的答案链接到许多可用的产品和工具。语音识别和理解一系列命令是一个非常常见的商业问题。您呼叫的许多语音自动电话系统都使用这种技术。开发人员也可以使用相同的技术

通过几个月来对这些问题的观察,我看到大多数开发人员的选择都是这样的:

  • Windows用户-使用.Net或Microsoft.Speech的System.Speech功能并安装Microsoft提供的免费识别器。Windows7包括一个完整的语音引擎。其他的可以免费下载。有一个C++ API来与已知的SAPI引擎相同。见。或

  • Linux用户-Sphinx似乎有很多追随者。看到和

  • 商业产品-Nuance、雄辩、AT&T等

  • 在线服务-Nuance、Yapme等


当然,这也可能有帮助-

想想为什么子集的rms值的比较不起作用,只有一个人来听写,而且声音只有几个词。同一个说话人可以用不同的能量、频率、速度和节奏来发音同一个词。一个词的足迹在于频率的变化,而不是能量的变化。这就是为什么您真的应该使用MFCC而不是rms值。为了应对速度和节奏,DTW是最简单的方法。如果不在单词和参考词之间进行这样的对齐,你就无法识别一个单词。注意使用delta MFCC(MFCC的导数)来获得每个频率的能量变化(我稍微改变了我的答案)。还要注意@米迦勒引用了SPHYNX,它提供了一个C++实现,叫做PokCpHynx(我不知道它),虽然它是LVCSR(基于音素和使用语言模型,你不需要的东西)。谢谢你的澄清,SAPI似乎足够做这项工作,但是我只熟悉Borland C++编译器。如果我需要学习VC++或C语言,如果我需要实现SAPI,那么任何有助于从C++到VC++的资源都是很好的。谢谢。SAPI只是一个标准的COM API,是Windows SDK的一部分。你应该能够用任何C++编译器来编程它。有关一些有用的信息和链接,请参阅。C#和.NET中的System.Speech命名空间无疑使开发支持语音的应用程序变得更容易,但您不必学习新的语言来将语音添加到现有的应用程序中。应该对你也有帮助。