pocketsphinx android - 为每个不同的口语单词返回相同的单词
pocketsphinx android - returning same word for every different spoken word
我已经从 Github 下载了 pocketsphinx-android-demo 并为我自己的目的做了一些修改。
我为我的应用特定单词创建了一个新的 my-en-us.dict
(字典)文件并添加了以下单词
hey HH EY
smarty S M AA R T IY
login L AA G IH N
然后,我用以下代码创建了一个 login.gram
(语法)文件
#JSGF V1.0;
grammar login;
public <item> = login;
然后,我在 Activity 中像这样初始化识别器
public static final String KWS_SEARCH = "wakeup";
public static final String LOGIN_SEARCH = "login";
/* Keyword we are looking for to activate menu */
public static final String KEYPHRASE = "hey smarty";
private void setupRecognizer(File assetsDir) throws IOException {
recognizer = SpeechRecognizerSetup.defaultSetup()
.setAcousticModel(new File(assetsDir, "en-us-ptm"))
.setDictionary(new File(assetsDir, "my-en-us.dict"))
.getRecognizer();
recognizer.addListener(this);
recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
File loginGrammar = new File(assetsDir, "login.gram");
recognizer.addGrammarSearch(LOGIN_SEARCH, loginGrammar);
}
其余代码与 pocketsphinx-android-demo 相同,用于启动识别器、听单词等
启动 android 应用程序后,我说 "hey smarty" 以激活对 "login" 单词的识别。当我说 "login" 时,它是 returns "login" 但当我说 "hello"、"settings" 等任何其他词时,它只会 returns "login".
我不知道为什么会这样。我是不是哪里做错了,如果是,那么只添加特定单词以进行准确识别的正确方法是什么?
另一个问题是,如何检查 "partial result" 或 "result" 的准确率百分比?
大概您更改了 onPartialResult()
的实现以处理 switchSearch(LOGIN_SEARCH)
。
假设是连续 "login",因为这是您语法中唯一的词。其他词 ("hello"、"settings") 可能被误解为 "login",因为该关键字没有与之关联的 "kws-threshold"。
对于这个用例,您想使用 addKeywordSearch()
而不是语法。它很像 addKeyPhraseSearch()
,但允许您使用多个关键字,每个关键字都有自己的阈值:
File f = new File( context.getCacheDir(), "temp.gram" );
PrintWriter p = new PrintWriter( f );
p.print(
"hello/1e-10/\n" +
"login/1e-10/\n" +
"settings/1e-10/\n"
);
p.close();
recognizer.addKeywordSearch( LOGIN_SEARCH, f );
(我在这里使用了 PrintWriter,因为 addKeywordSearch()
需要一个文件)。
正如我在 this answer 中提到的,每个关键字的阈值都会有所不同,并且通常是通过实验找到的。我提供的值是名义值。
这也应该回答您的第二个问题:您不必检查准确度百分比(我认为 PocketSphinx 甚至没有为关键字提供准确度百分比),因为阈值可以有效地为您做到这一点。
当然,您的所有关键字也必须出现在字典中。
我已经从 Github 下载了 pocketsphinx-android-demo 并为我自己的目的做了一些修改。
我为我的应用特定单词创建了一个新的 my-en-us.dict
(字典)文件并添加了以下单词
hey HH EY
smarty S M AA R T IY
login L AA G IH N
然后,我用以下代码创建了一个 login.gram
(语法)文件
#JSGF V1.0;
grammar login;
public <item> = login;
然后,我在 Activity 中像这样初始化识别器
public static final String KWS_SEARCH = "wakeup";
public static final String LOGIN_SEARCH = "login";
/* Keyword we are looking for to activate menu */
public static final String KEYPHRASE = "hey smarty";
private void setupRecognizer(File assetsDir) throws IOException {
recognizer = SpeechRecognizerSetup.defaultSetup()
.setAcousticModel(new File(assetsDir, "en-us-ptm"))
.setDictionary(new File(assetsDir, "my-en-us.dict"))
.getRecognizer();
recognizer.addListener(this);
recognizer.addKeyphraseSearch(KWS_SEARCH, KEYPHRASE);
File loginGrammar = new File(assetsDir, "login.gram");
recognizer.addGrammarSearch(LOGIN_SEARCH, loginGrammar);
}
其余代码与 pocketsphinx-android-demo 相同,用于启动识别器、听单词等
启动 android 应用程序后,我说 "hey smarty" 以激活对 "login" 单词的识别。当我说 "login" 时,它是 returns "login" 但当我说 "hello"、"settings" 等任何其他词时,它只会 returns "login".
我不知道为什么会这样。我是不是哪里做错了,如果是,那么只添加特定单词以进行准确识别的正确方法是什么?
另一个问题是,如何检查 "partial result" 或 "result" 的准确率百分比?
大概您更改了 onPartialResult()
的实现以处理 switchSearch(LOGIN_SEARCH)
。
假设是连续 "login",因为这是您语法中唯一的词。其他词 ("hello"、"settings") 可能被误解为 "login",因为该关键字没有与之关联的 "kws-threshold"。
对于这个用例,您想使用 addKeywordSearch()
而不是语法。它很像 addKeyPhraseSearch()
,但允许您使用多个关键字,每个关键字都有自己的阈值:
File f = new File( context.getCacheDir(), "temp.gram" );
PrintWriter p = new PrintWriter( f );
p.print(
"hello/1e-10/\n" +
"login/1e-10/\n" +
"settings/1e-10/\n"
);
p.close();
recognizer.addKeywordSearch( LOGIN_SEARCH, f );
(我在这里使用了 PrintWriter,因为 addKeywordSearch()
需要一个文件)。
正如我在 this answer 中提到的,每个关键字的阈值都会有所不同,并且通常是通过实验找到的。我提供的值是名义值。
这也应该回答您的第二个问题:您不必检查准确度百分比(我认为 PocketSphinx 甚至没有为关键字提供准确度百分比),因为阈值可以有效地为您做到这一点。
当然,您的所有关键字也必须出现在字典中。