Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.205.56.209] |
|
Сообщ.
#1
,
|
|
|
PocketSphinx - открытое ПО для распознания речи, http://cmusphinx.sourceforge.net/wiki/download - исходники. Есть две библиотеки pocketsphinx.dll и sphinxbase.dll, которые я хочу вызвать из C#.
Нашел пример подобного использования http://stackoverflow.com/questions/2590092...lationexception но он обрезанный, нужны еще строки подключения библиотеки например: using pocketsphinx. Но как их подключить к проекту? Я пытался подключить через References и получил сообщение что сборка недопустима. вот описание API: http://cmusphinx.sourceforge.net/doc/pocketsphinx/index.html http://cmusphinx.sourceforge.net/doc/sphinxbase/index.html using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace callsphinx { class Program { //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); static void Main(string[] args) { IntPtr ps = PocketSphinx.ps_init(config);//PocketSphinx - не существует в текущем контексте, как его подключить? IntPtr fh = Win32Util.fopen(@"goforward.raw", "rb"); int rv = PocketSphinx.ps_decode_raw(ps, fh, "goforward", -1); } } } Прикреплённый файл___________________________________.png (63,01 Кбайт, скачиваний: 884) |
Сообщ.
#2
,
|
|
|
Я понял что к References dll подключать не надо.
Теперь застрял на том как передать в библиотеку структуру arg_t которая описывается в той же длл... using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; namespace callsphinx { class Program { //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); //SPHINXBASE_EXPORT cmd_ln_t* cmd_ln_parse_r ( cmd_ln_t * inout_cmdln, // arg_t const * defn, - как эту структуру описать? // int32 argc, // char * argv[], // int32 strict // ) [DllImport("sphinxbase.dll", SetLastError = true, CallingConvention = CallingConvention.Cdecl)] public extern static IntPtr cmd_ln_parse_r(/*Надо придумать как сдесь 5 параметров описать...*/); static void Main(int argc, string[] args) { //char *argv[]; - код из "Си" IntPtr config = cmd_ln_parse_r(null, cont_args_def, argc, argv, true); IntPtr ps = ps_init(config); IntPtr fh = fopen(@"goforward.raw", "rb"); int rv = ps_decode_raw(ps, fh, "goforward", -1); } } } описание структуры на "Си"... /** * @struct arg_t * Argument definition structure. */ typedef struct arg_s { char const *name; /**< Name of the command line switch */ int type; /**< Type of the argument in question */ char const *deflt; /**< Default value (as a character string), or NULL if none */ char const *doc; /**< Documentation/description string */ } arg_t; static const arg_t cont_args_def[] = { POCKETSPHINX_OPTIONS, /* Argument file. */ {"-argfile", ARG_STRING, NULL, "Argument file giving extra arguments."}, {"-adcdev", ARG_STRING, NULL, "Name of audio device to use for input."}, {"-infile", ARG_STRING, NULL, "Audio file to transcribe."}, {"-inmic", ARG_BOOLEAN, "no", "Transcribe audio from microphone."}, {"-time", ARG_BOOLEAN, "no", "Print word times in file transcription."}, CMDLN_EMPTY_OPTION }; |
Сообщ.
#3
,
|
|
|
Задавать дополнительные параметры конфигурации в C# не нужно, вместо cont_args_def можно просто использовать стандартные параметры, получаемые по выводу ps_args.
ps_decode_raw больше нет в последних версиях pocketsphinx, потому что получить в C# и других языках правильный указатель на файл невозможно. Лучше читать данные из файла в C# буффер за буффером и передавать их в ps_process_raw. Этот метод отражён в последнем руководстве по pocketsphinx: http://cmusphinx.sourceforge.net/wiki/tutorialpocketsphinx Часто не очень удобно оборачивать сложные функции pocketsphinx в вызовы C#. Чтобы упростить работу можно сделать функцию в C с простыми аргументами и вызывать её из C#. Например, как тут: https://sourceforge.net/p/cmusphinx/discuss...hread/a11f4e27/ https://sourceforge.net/p/cmusphinx/discuss...ment/mymodule.h https://sourceforge.net/p/cmusphinx/discuss...ment/mymodule.c https://sourceforge.net/p/cmusphinx/discuss...t/cs_and_so.zip |
Сообщ.
#4
,
|
|
|
nshспасибо за ответ буду разбираться...
|
Сообщ.
#5
,
|
|
|
Цитата paulboxer @ nshспасибо за ответ буду разбираться... Здравствуйте. Удалось ли вам найти решение? Ищу решение такой же задачи. Возможно, кто-нибудь может помочь? Заранее благодарен. |