Jump to content

lucarnet

Members
  • Content Count

    1
  • Joined

  • Last visited

Community Reputation

0 Neutral
  1. Hello, I'm trying to integrate VOSK speech recognition into a Delphi 11.2/Fmx Windows and Android home automation application. Execution of the library functions "libvosk.dll" is fine except for the execution time (for example, the "vosk_model_new" function). In DEBUG mode, the time is 2 minutes and 30 seconds. In RUN mode, the time is 1 to 2 seconds (execution tests in Python or C also take about 2 seconds). Do you have any idea what I'm doing wrong (on the Delphi or Vosk library side)? PS: Calling the library in cdecl or stdcall mode gives the same problem. Thanks. Platform:Windows64b Log Mode RUN: Log mode NON DEBUG: Main Unit : unit umainvosk; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.IOUtils {$IFDEF MSWINDOWS},Winapi.Windows{$ENDIF} //loadlibrary ,FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Memo.Types, FMX.Edit, FMX.ScrollBox, FMX.Memo, {$IFDEF ANDROID} Androidapi.Helpers, FMX.Helpers.Android, // SharedActivityContext //Pour Lire Version Application Androidapi.JNI.JavaTypes, //FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText, {$ENDIF ANDROID} vosk_api, voskmodelnew //voskrecognizernew ; type PVoskModel = Pointer; PPVoskModel = ^PVoskModel; const NomLib_vosk_model_new : string = 'vosk_model_new'; NomLib_vosk_model_free : string = 'vosk_model_free'; var ProcLib_vosk_model_new : function(const model_path: PAnsiChar): PVoskModel; cdecl; ProcLib_vosk_model_free : procedure(model: PVoskModel); cdecl; type TForm1 = class(TForm) btn_savetofile: TButton; Memo1: TMemo; btn_loadfromfile: TButton; btn_listefileassetsinternal: TButton; btn_listelibrary: TButton; btn_voskmodelcreate: TButton; ed_pathmodel: TEdit; btn_loadlibrary: TButton; procedure FormCreate(Sender: TObject); procedure btn_savetofileClick(Sender: TObject); procedure btn_loadfromfileClick(Sender: TObject); procedure btn_listefileassetsinternalClick(Sender: TObject); procedure btn_listelibraryClick(Sender: TObject); procedure btn_voskmodelcreateClick(Sender: TObject); procedure btn_loadlibraryClick(Sender: TObject); private { Déclarations privées } FHandle: HMODULE; FModelTest: PVoskModel; procedure for_messagedate(vmes:string); procedure for_message(vmes:string); function Librairie_charger(vnom:string;var vmes:string):boolean; public { Déclarations publiques } FTVoskModel:TVoskModel; //FPVoskModel:PVoskModel; end; {$IFDEF ANDROID} {$ENDIF} var Form1: TForm1; implementation {$R *.fmx} ... procedure TForm1.for_messagedate(vmes:string); begin memo1.lines.add(datetimetostr(now)+':'+vmes); end; procedure TForm1.for_message(vmes:string); begin if vmes<>'' then Memo1.Lines.add(vmes); end; procedure TForm1.btn_voskmodelcreateClick(Sender: TObject); var dirmodelpath, dirmodel, dirmodellong:ansistring;//important ansichar var bytes:tbytes; begin {$IFDEF ANDROID} dirmodelpath:=TPath.GetPublicPath; for_message('dirmodelpath ":'+dirpublicpath+'"'); {$ENDIF} {$IFDEF MSWINDOWS} dirmodelpath:=TPath.GetLibraryPath; for_message('GetPublicPath ":'+dirmodelpath+'"'); {$ENDIF} dirmodel:=ed_pathmodel.text; dirmodellong:=TPath.Combine(dirmodelpath,dirmodel); if not DirectoryExists(dirmodellong) then for_message('Pathmodel ":'+dirmodellong+'":INTROUVABLE') else begin for_message('Pathmodel ":'+dirmodellong+'":OK'); //Appel direct apres loadlibrary if not assigned(ProcLib_vosk_model_new) then showmessage('ProcLib_vosk_model_new non assigne') else begin bytes:=string_converttbytesc(dirmodellong); for_messagedate('Exec vosk_model_new BEGIN'); FModelTest:=ProcLib_vosk_model_new(PAnsiChar(bytes)); //<=======Exec Function for_messagedate('Exec vosk_model_new END "'); if FModelTest=nil then for_message('FModelTest.mode=nil') else begin for_message('FModelTest.model:OK') end; end; end; end; //Charger une librairie nomcourt function TForm1.Librairie_charger(vnom:string;var vmes:string):boolean; var DocDir:string; Libficlong:string; begin result:=false; DocDir := TPath.GetLibraryPath;//GetDocumentsPath; Libficlong:=TPath.Combine(TPath.GetLibraryPath,vnom);//'libvosk.so');// library if not FileExists(Libficlong) then vmes:=('Libficlong Introuvable') else begin //===================================================================== //Chargement ProcLib_vosk_model_new:=nil; ProcLib_vosk_model_free:=nil; FHandle := LoadLibrary(PCHAR(Libficlong)); if FHandle=0 then vmes:='Erreur LoadLibrary' else begin result:=true; @ProcLib_vosk_model_new :=GetProcAddress(FHandle, PWideChar(NomLib_vosk_model_new)); // using Posix function: dlsym(....), dladdr(...)... @ProcLib_vosk_model_free:=GetProcAddress(FHandle, PWideChar(NomLib_vosk_model_free)); end; end; end; ... unit exec library lib_vosk.dll: unit vosk_api; { This unit is automatically generated by Chet: https://github.com/neslib/Chet } {$MINENUMSIZE 4} interface const {$IF Defined(WIN32)} LIB_VOSK = 'libvosk.dll'; _PU = ''; {$ELSEIF Defined(WIN64)} LIB_VOSK = 'libvosk.dll'; _PU = ''; {$ELSEIF Defined(ANDROID)} LIB_VOSK = 'libvosk.so'; _PU = ''; {$ELSE} // {$MESSAGE Error 'Unsupported platform'} {$IFEND} type PVoskModel = Pointer; PPVoskModel = ^PVoskModel; PVoskSpkModel = Pointer; PPVoskSpkModel = ^PVoskSpkModel; PVoskRecognizer = Pointer; PPVoskRecognizer = ^PVoskRecognizer; PVoskBatchModel = Pointer; PPVoskBatchModel = ^PVoskBatchModel; PVoskBatchRecognizer = Pointer; PPVoskBatchRecognizer = ^PVoskBatchRecognizer; {$IFDEF ANDROID} //function vosk_model_new(const model_path: PAnsiChar): PVoskModel; stdcall external LIB_VOSK;//'libvosk.so'; function vosk_model_new(const model_path: PAnsiChar): PVoskModel; cdecl;external LIB_VOSK;//'libvosk.so'; //procedure vosk_model_free(model: PVoskModel); stdcall external LIB_VOSK;//'libvosk.so'; procedure vosk_model_free(model: PVoskModel); cdecl;external LIB_VOSK;//'libvosk.so'; //function vosk_model_find_word(model: PVoskModel; const word_: PAnsiChar): Integer; stdcall external LIB_VOSK;//'libvosk.so'; function vosk_model_find_word(model: PVoskModel; const word_: PAnsiChar): Integer; cdecl;external LIB_VOSK;//'libvosk.so'; {$ELSE} (** Loads model data from the file and returns the model object * * @param model_path: the path of the model on the filesystem * @returns model object or NULL if problem occured *) function vosk_model_new(const model_path: PAnsiChar): PVoskModel; cdecl; external LIB_VOSK name _PU + 'vosk_model_new'; (** Releases the model memory * * The model object is reference-counted so if some recognizer * depends on this model, model might still stay alive. When * last recognizer is released, model will be released too. *) procedure vosk_model_free(model: PVoskModel); cdecl; external LIB_VOSK name _PU + 'vosk_model_free'; ... joigned File:Log execution logevent_execmainvosk.txt
×