3

Androidでポケットフィンクスを使用しています。.gramまた、あるファイルのルールを別のファイルにインポートすることも、.gramを指定してルールを使用することStringもできましたが、2 つを組み合わせることができないようです。つまり、文字列ベースの文法からファイル ベースの文法をインポートすることはできません。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)完全なパスを使用します(ポケットフィンクス独自のアセット同期ユーティリティから取得したもの)。

パッケージ名の使用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>

pocketphinx のソースでは、ドットをスラッシュに置き換えていることがわかります。

/* 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;
}

インポートしようとしているファイルの場所を pocketphinx-android に知らせるにはどうすればよいですか? 関数SpeechRecognizerもにもありませんDecoder。文法ファイルを探す場所を構成で指定する方法があるのではないかと考えていますが、それが見つからないようです。SpeechRecognizerSetupまたはConfig?にパラメータを追加します。または、Config/Setup オブジェクトに文字列パラメーターとして追加できる、ポケットスフィンクスのコマンド ライン パラメーターはありますか?

4

1 に答える 1

0

JSGF 構文では、パッケージ名はコード化された場所にマップされます。

 import com.package.name;

com/package対応する文法は、メインの文法フォルダーに関連するフォルダーにある必要があります。Java パッケージと同じです。したがって、レイアウトは次のようにする必要があります。

main.jsgf
com
  package
    name.jsgf

JSGF が文字列から読み込まれる場合、現在のパスでインポートが検索されます。検索パスも JSGF_PATH 環境変数によって設定されます。ただし、Java で Android の現在の作業フォルダーまたは環境変数を設定するのは簡単ではありません。そのため、必要なハードコードされた変更を加えて pocketphinx-android を再コンパイルするか、文字列ではなくファイルから jsgf をロードすることをお勧めします。

于 2016-01-26T10:25:05.443 に答える