【问题标题】:How to see if word exists in Pocketsphinx dictionary?如何查看Pocketsphinx词典中是否存在单词?
【发布时间】:2016-06-14 17:43:24
【问题描述】:

我只是想看看字典文件中是否存在字符串。 (问题底部的字典文件)

我想检查语音识别器是否可以识别单词。例如,识别器将无法识别ahdfojakdlfafiop 的字符串,因为字典中没有定义。那么,我可以检查一个单词是否在 pocktsphinx 的字典中吗?

类似:

    if(myString.existsInDictionary){
startListeningBecauseExists();
    }else(
//Doesn't exist in dictionary!!!
       }

我只是想要一种方法来判断识别器是否可以听我想让它听什么。

这里是字典文件:

https://raw.githubusercontent.com/cmusphinx/pocketsphinx-android-demo/master/app/src/main/assets/sync/cmudict-en-us.dict

谢谢,

鲁基尔

【问题讨论】:

  • 将字典文件中的所有单词读入ArrayList,并始终检查if(list.contains(myString))
  • @BalwinderSingh 我知道如何读取文件,但是如果您查看我的问题中的链接,这并不是那么简单。每行旁边都有一个发音,我不在乎。我只关心每一行的单词。我怎样才能读到这些单词?
  • @ELITE 我知道如何读取文件,但是如果您查看我的问题中的链接,这并不是那么简单。每行旁边都有一个发音,我不在乎。我只关心每一行的单词。我怎样才能读到这些单词?
  • 我刚刚重新发布了我的答案,包括从您的字典文件中读取一个字典文件。您可以在下面查看它,希望对您有所帮助。

标签: java android database voice-recognition cmusphinx


【解决方案1】:

在 C 中有 ps_lookup_word 函数可以让你查找单词:

if (ps_lookup_word(ps, "abc") == NULL) {
    // do something
}

在 Java 包装器中,它是一个方法 Decoder.lookupWord:

if(decoder.lookupWord("abc") == null) {
    // do something
}

在Android中,您可以通过Recognizer访问解码器:

if(recognizer.getDecoder().lookupWord("abc") == null) {
    // do something
}

【讨论】:

  • 你不需要做两个识别器,你需要使用单个识别器并跨活动共享。
  • 您请求识别服务获取一个单词并返回结果,只需添加另一个请求代码。
  • 嘿 Nikolay,我想知道我们是否可以使用 Pocketsphinx 在 IOS 上进行连续语音识别。那可能吗?谢谢!
  • @NikolayShmyrev 你能告诉我我必须把这段代码放在android的什么地方
【解决方案2】:

使用BufferedReader读取文件并将所有单词存储在ArrayList

ArrayList<String> dictionary = new ArrayList<>();
String line;
BufferedReader reader = new BufferedReader(new FileReader(dictionaryFile));
while((line = reader.readLine()) != null) {
    if(line.trim().length() <= 0 ) {
        continue;
    }
    String word = line.split(" ")[0].trim();
    word = word.replaceAll("[^a-zA-Z]", "");
    dictionary.add(word);
}

然后使用检查dictionary 中是否存在单词

dictionary.contains(yourString);

希望对你有所帮助。

【讨论】:

  • 不用再浪费内存再读取文件了,解码器已经解析过了。此外,还可以在文件中的单词旁边将其他单词添加到解码器中。
  • 在初始化系统之前只读取一次文件,而不是每次都检查工作。我同意它会浪费大量内存,因为它包含 ArrayList 中的所有单词...
  • 你的代码在性能方面也非常低效,最好使用HashSet,而不是ArrayList。在十万个条目的列表中搜索元素不是一个好主意。
【解决方案3】:

您可以通过逐行读取字典来将字典加载到数组列表中并仅获取单词 do

arraylist.add(line.split("\\s+")[0]);

然后检查是否存在

if(arraylist.contains(word))

【讨论】:

  • @Ruchir Baronia 哦,抱歉 \s+ 是一个空格,并且在字典中有一个单词(你想要的)然后是一个空格,然后是你不想要的东西,所以如果你拆分它通过空格并获取数组中的第一个字符串,您将只得到单词
  • 所以它会在空格之后分割所有内容?
  • @RuchirBaronia 它会将行拆分为字符串数组中的多个单词,并且您想要的单词是第一个单词,因此您将获得数组中的第一个字符串并将其添加到列表中
  • 不用再浪费内存再读取文件了,解码器已经解析过了。此外,还可以在文件中的单词旁边将其他单词添加到解码器中。
猜你喜欢
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2011-08-20
  • 2013-05-24
  • 2022-01-13
  • 2015-01-04
  • 2017-12-28
相关资源
最近更新 更多