pinvoke を使用して C# で pocketphinxチュートリアルを実行しようとしていますが、ps_decode_raw() を使用してデコードしようとすると AccessViolationException が発生します。
IntPtr ps = PocketSphinx.ps_init(config);
IntPtr fh = Win32Util.fopen(@"goforward.raw", "rb");
int rv = PocketSphinx.ps_decode_raw(ps, fh, "goforward", -1);
関数は次のようにラップされます
//ps_decoder_t* ps_init(cmd_ln_t* config)
[DllImport("pocketsphinx.dll",
SetLastError = true,
CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr ps_init(
IntPtr config);
//int ps_decode_raw(ps_decoder_t *ps, FILE *rawfh, char const *uttid, long maxsamps);
[DllImport("pocketsphinx.dll",
SetLastError = true,
CallingConvention = CallingConvention.Cdecl)]
public extern static int ps_decode_raw(
IntPtr ps,
IntPtr rawfh,
[MarshalAs(UnmanagedType.LPStr)] string uttid,
int maxsamps);
[DllImport("msvcrt.dll",
SetLastError = true,
CallingConvention = CallingConvention.Cdecl)]
public extern static IntPtr fopen(
[MarshalAs(UnmanagedType.LPStr)] string _Filename,
[MarshalAs(UnmanagedType.LPStr)] string _Mode);
C の fopen もラップしました。これがチュートリアルを実装する最も簡単な方法だったからです。
ps で cmd_ln_retain を呼び出して、ps が問題の原因ではないことを確認してみました。(そうではありませんでした)。上記のデバッグコードも削除しました。
fopen に何か問題があることは確かですが、何が原因かはわかりません。
誰かがポケットフィンクスのログを要求しました. https://justpaste.it/h52t