Импорт правил грамматики из грамматики на основе строк

Я использую 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 из файла вместо строки.

Другие вопросы по тегам