我在Pocketsphinx中使用jsgf格式语法。我希望能够仅匹配/识别有限数量的可能的输入句子(即命令和控件类型的界面)。
但是,由于这些“有效”句子的性质,具有三个或更多单词的句子片段(子句)也是有效输入。
例如,如果有效句子为:
然后语法应包含:
[很显然,在此示例中,这种语法似乎有些奇怪,但是在我使用的语言/上下文中确实有意义。]
是否可以使用jsgf语法语法或任何pocketsphinx / CMU Sphinx工具自动完成此操作。当然,我可以给定一组有效的完整句子,以编程方式生成一个语法文件,但这似乎有点冗长,并且使语法文件冗长且难以直接编辑(甚至只是确定有效的完整句子是什么)。
仅使用jsgf格式(我知道)的规则,我能想到的最好的方法如下。 (对于上面的示例:)
<a> = this is a;
<valid> = (<a> | is a) valid;
<sentence> = (<valid> | a valid) sentence;
<this> = so is this;
<one> = (<this> | is this) one;
(例如,规则匹配长度为3或更大且以单词“ valid”结尾的任何子句。)
此语法完全包含上面列出的有效字符串。尽管如此,仍然需要从有效的完整句子集中以编程方式生成该语法,因此我也可以明确列出所有子句。但是,这种格式确实使从jsgf文件中直接看到有效的完整句子的位置稍微容易些。
从本质上讲,我的问题是:有没有一种更好的方法可以用Pocketsphinx实现上述语法?
答案 0 :(得分:0)
在公认的语音中施加复杂的约束不是语法的任务。当您限制语法中的内容时,识别会变得缓慢得多,并且容易出错,因为用户没有按照您的设想遵循语法。要构建适当的应用程序,您需要使用自由格式语法,该语法可以正确识别语音并为此构建后处理器。后处理器可以使用正则表达式甚至某些自定义代码来验证所需的需求。
这应该有效:
<sentence> = this | is | a | valid | sentence | one | so;
如果您需要更高级的功能,可以构建一个bigram语言模型,并将其转换为fsg,如图1中的librispeech paper所示。
也在Sourceforge Forum上回答