На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD, nsh
  
> Подключение PocketSphinx к C#
    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

    ExpandedWrap disabled
          
      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 Кбайт, скачиваний: 874)
    Сообщение отредактировано: paulboxer -
      Я понял что к References dll подключать не надо.
      Теперь застрял на том как передать в библиотеку структуру arg_t которая описывается в той же длл... :wall:

      ExpandedWrap disabled
        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);
                }
            }
        }


      описание структуры на "Си"...
      ExpandedWrap disabled
        /**
         * @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
        };
      Сообщение отредактировано: paulboxer -
        Задавать дополнительные параметры конфигурации в 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
          nshспасибо за ответ буду разбираться...
            Цитата paulboxer @
            nshспасибо за ответ буду разбираться...

            Здравствуйте.
            Удалось ли вам найти решение?
            Ищу решение такой же задачи. Возможно, кто-нибудь может помочь?
            Заранее благодарен.
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0246 ]   [ 16 queries used ]   [ Generated: 23.04.24, 07:19 GMT ]