精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
在你开始之前
在开始开发语音应用程序之前,您需要考虑几个要点。他们将定义您实现应用程序的方式。
算法
语音技术为您实现应用程序的方式设置了几个重要的限制。例如,如前所述,不可能识别 该语言的任何已知单词。您需要考虑克服这些限制的方法。这种方式对于大多数类型的应用程序是已知的,并将在本教程的后面描述。要关注它们,您有时需要重新考虑应用程序的行为方式以及与用户的交互方式。
虽然我们试图提供重要的例子,但我们显然无法涵盖一切。虽然可以在以后创建它们,但是还没有话语验证或说话者识别示例。大多数算法都被科学文献广泛涵盖,其中一些算法将在本教程后面解释。此外,每年都会提出解决旧问题的新方法。
让我们看一下几个常见应用程序的列表以及如何处理它们:
通用听写从来没有像它的名字那样通用。您需要确定一个域来识别哪些域可以是对话,读数,会议,语音邮件,法律或医疗转录。如果您考虑使用语音邮件,请注意此域中的语言比一般语言更受限制。它实际上是一个非常小的词汇表,具有特殊的术语序列:
会有很多名字,这肯定是一个问题,但你永远不会找到关于量子物理学的语音邮件 - 这是一件非常好的事情。识别器将使用您在语言模型中提供的限制,以提高结果的准确性。
您必须为您的域构建一个语言模型,但这并不像您想象的那么复杂。如果你只用英语覆盖了60k最常用的单词,那没关系; 准确性将与您考虑120k字相同。对于具有丰富形态的其他语言,情况是不同的,但也可以使用基于形态学的子词来解决。此外,您还必须构建后处理系统,适配系统和用户识别系统。
对于嵌入式处理器的识别,有两种方法可以考虑 - 服务器识别和设备识别。前者现在更受欢迎,因为它利用了云计算的强大功能和灵活性。
语言学习需要您构建一个跟踪错误发音的框架。这将包括不正确发音的生成和评分。
对于命令和控制,长时间使用有限状态语法很受欢迎。但是,我们现在不推荐这种方法。最好采用一个带有语义分析框架的中等词汇识别器来改善用户体验,让他们使用或多或少的自然语言。简而言之,不要建立命令和控制,而是建立智能助手。
对于智能助手,您不仅需要识别,还需要有意识的解析和数据库知识。有关如何实现此功能的更多详细信息,您可以查看由OpenEphyra提供支持的 Lucida。对话系统也需要一个用户反馈框架。
语音搜索,语义分析和翻译需要建立在引擎生成的格子之上。您需要使用带有置信度分数的格子并将它们作为翻译引擎提供给上层。
对于名称和地点识别等开放式词汇识别,您需要一个子词语言模型。
文本对齐(如字幕同步)将要求您从参考文本构建专用语言模型以限制搜索。
现有准确度结果
对于上述大多数任务,都有公布的准确性结果 如果您确定任务,则可以查看它们。这些结果在用户准确性方面可能有用,也可能无效。我可能认为你的准确性结果似乎比出版物中的更好。但是,这可能不太可能,并且可能不像最初看起来那么容易实现。
例如,我们考虑一个广播新闻识别系统,其准确度为20-25%。如果这对您的应用程序来说还不够,您可能需要考虑修改应用程序。您可以添加手动校正步骤或初步调整步骤以提高准确性。如果事后准确度不够,那么考虑一下你是否需要语音可能会更好。您可以使用其他更可靠的接口。
例如,尽管基于ASR的IVR系统非常方便,但许多人仍然喜欢与DTMF系统或基于网络的表单进行通信,或者只是通过电子邮件联系公司。请记住,您需要一个有效的界面,而不是一个适度的界面。
资源
您需要考虑的另一个问题是用于培训,测试和优化系统的语音材料的可用性。您需要找出可用的资源。
该测试集为任何语音识别应用程序的一个关键问题。测试集在声学和语言方面应具有足够的代表性。另一方面,测试集不一定需要大,你可以花十分钟创建一个好的。这可能是你自己可以做的几个录音。
对于训练集和模型,您应该检查已存在的资源。对语音技术越来越感兴趣,人们通过为他们的母语创建模型来做出贡献。通常,您必须收集指定语言的音频材料。实际上它并不复杂。有声读物,电影和播客提供了足够的录音,可以轻松地构建一个非常好的声学模型。
要构建一个语音字典,您可以使用现有的TTS合成器之一,它现在涵盖了很多语言。您也可以手动提升字典,然后使用机器学习工具进行扩展。
对于语言模型,您必须为您的域找到大量文本。它可能是教科书,已经转录的录音或其他来源,如在网络上抓取的网站内容。
技术
要考虑的第三件事是您将构建的特定技术集。虽然CMUSphinx试图为开发语音应用程序提供或多或少的完整编程套件,但有时您需要使用其他包/编程语言/工具。如果您需要继续使用Java,C或CMUSphinx支持的任何脚本语言,您需要了解自己。在sphinx4和pocketsphinx之间选择的简单规则如下:
虽然人们经常会问sphinx4或者pocketphinx是否更准确,但你根本不应该为这个问题烦恼。准确性不是这里的论点。sphinx4和pocketsphinx都提供了足够的精度,即便如此,它还取决于很多因素,而不仅仅是发动机。关键是引擎只是系统的一部分,应该包含更多的组件。如果我们谈论的是大型词汇解码器,必须有一个二元化框架,一个适应框架和一个后处理框架。他们都需要以某种方式合作。sphinx4的灵活性允许您快速构建这样的系统。将sphinx4嵌入像red5这样的flash服务器很容易,可以提供基于Web的识别。管理在群集上进行大规模解码的许多sphinx4实例很容易。
另一方面,如果您的系统需要高效且合理准确,如果您在嵌入式设备上运行,或者如果您有兴趣使用具有Erlang等异域语言的识别器,那么pocketphinx就是您的选择。将Java与JVM不支持的其他语言集成起来非常困难 - 在这种情况下,pocketsphinx更好。
最后,您需要选择开发平台。如果你受某个特定的约束,这对你来说是一件容易的事。如果您可以选择,我们强烈建议您使用GNU / Linux作为开发平台。我们可以帮助您解决Windows或Mac问题,但无法保证 - 我们的主要开发平台是Linux。对于许多任务,您需要使用Perl或Python运行复杂的脚本。在Windows上,它可能会有问题。
好吧,让我们开始吧!接下来的部分将描述使用sphinx4或 pocketsphinx创建示例应用程序的过程。选择适合你的那个。