Импорт правил грамматики из грамматики на основе строк
Я использую Pocketsphinx в Android. И я смог импортировать правила в одном .gram
файл другому .gram
файл, и я смог использовать правила, указав String
, но, кажется, не может быть в состоянии объединить два. То есть я не могу импортировать файловую грамматику из строковой грамматики; Я продолжаю получать Failed to find grammar
ошибки.
При указании грамматики в виде строки с:
private SpeechRecognizer mPsRecognizer;
//...
final StringGrammar sg = settings.getStringGrammar();
mPsRecognizer.getDecoder().setJsgfString(sg.getName(), sg.getString());
Где строка что-то вроде:
name: "initial_grammar",
string: "#JSGF V1.0;\n"
+ "\n"
+ "grammar initial_grammar;\n"
+ "\n"
+ "import <digits.digits>;\n"
+ "import <actions.r_actions>;\n"
+ "import <help.r_help>;\n"
+ "\n"
+ "public <initial_grammar>\n"
+ " = <r_actions>\n"
+ " | <r_help>\n"
+ " ;");
я получил
com.sample.vr.commands E/cmusphinx: ERROR: "jsgf.c", line 775: Failed to find grammar digits.gram
com.sample.vr.commands E/cmusphinx: ERROR: "jsgf.c", line 775: Failed to find grammar actions.gram
com.sample.vr.commands E/cmusphinx: ERROR: "jsgf.c", line 775: Failed to find grammar help.gram
com.sample.vr.commands I/cmusphinx: INFO: jsgf.c(691): Defined rule: PUBLIC <initial_step.initial_grammar>
com.sample.vr.commands E/cmusphinx: ERROR: "jsgf.c", line 338: Undefined rule in RHS: <initial_step.digits>
Что как-то ожидается, так как нет базового файла для поиска относительно.
То, что я пробовал: 1) использовать полное имя пакета и 2) использовать полный путь (что я получаю из собственной утилиты синхронизации активов pocketsphinx).
Использование имен пакетов Если я изменю import
пути к
//...
+ "import <com.sample.vr.commands/files/sync/actions.r_actions>;\n"
+ "import <com.sample.vr.commands/files/sync/help.r_help>;\n"
//...
я получил
com.sample.vr.commands E/cmusphinx: ERROR: "jsgf.c", line 775: Failed to find grammar com/sample/vr/commands/files/sync/help.gram
com.sample.vr.commands E/cmusphinx: ERROR: "jsgf.c", line 775: Failed to find grammar com/sample/vr/commands/files/sync/actions.gram
с полными путями
#JSGF V1.0;
grammar initial_step;
import </storage/emulated/0/Android/data/com.sample.vr.commands/files/sync/actions.r_actions>;
import </storage/emulated/0/Android/data/com.sample.vr.commands/files/sync/help.r_help>;
public <initial_grammar>
= <r_actions>
| <r_help>
;
Я получаю следующую ошибку (обратите внимание, что часть пакета была преобразована в отдельные каталоги):
com.sample.vr.commands E/cmusphinx: ERROR: "jsgf.c", line 775: Failed to find grammar /storage/emulated/0/Android/data/com/sample/vr/commands/files/sync/help.gram
com.sample.vr.commands E/cmusphinx: ERROR: "jsgf.c", line 775: Failed to find grammar /storage/emulated/0/Android/data/com/sample/vr/commands/files/sync/actions.gram
com.sample.vr.commands I/cmusphinx: INFO: jsgf.c(691): Defined rule: PUBLIC <initial_step.initial_grammar>
в источнике pocketsphinx я вижу, что они заменяют точки на слешах:
/* Construct a filename. */
for (c = path; *c; ++c)
if (*c == '.')
*c = '/';
strcat(path, ".gram");
newpath = path_list_search(jsgf->searchpath, path);
if (newpath == NULL) {
E_ERROR("Failed to find grammar %s\n", path);
ckd_free(path);
return NULL;
}
Что я могу сделать, чтобы pocketsphinx-android знал, где найти файлы, которые я пытаюсь импортировать? Я не нашел функцию в SpeechRecognizer
ни в Decoder
, Я думаю, что, возможно, есть способ указать в конфигурации, где искать файлы грамматики, но я не могу найти его. Добавить некоторый параметр в SpeechRecognizerSetup
или же Config
? Или в pocketsphinx есть параметр командной строки, который я могу добавить в качестве строкового параметра в объект Config/Setup?
1 ответ
В синтаксисе JSGF имя пакета отображается на местоположение как закодированное, это означает, что если вы пишете
import com.package.name;
соответствующая грамматика должна быть в папке com/package
относительно основной папки грамматики. То же, что и пакеты java. Итак, макет должен быть:
main.jsgf
com
package
name.jsgf
В случае, если JSGF загружен из строки, текущий путь ищется для импорта. Путь поиска также настраивается переменной среды JSGF_PATH. Тем не менее, в Java не так просто установить текущую рабочую папку или переменные среды в Android. По этой причине лучше перекомпилировать pocketsphinx-android с необходимыми жестко запрограммированными изменениями или загрузить jsgf из файла вместо строки.