Jump to content
Sign in to follow this  
lucarnet

Problem time execution Mode DEBUG or RUN Library Vosk

Recommended Posts

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:

Quote

Loadlibrary "libvosk.dll" OK
GetPublicPath ":D:\dev\dom\test11_androidacceslib\Win64\Debug\"
Pathmodel ":D:\dev\dom\test11_androidacceslib\Win64\Debug\vosk-model-small-fr-0.22":OK
04/04/2025 18:29:13:Exec vosk_model_new BEGIN
04/04/2025 18:31:40:Exec vosk_model_new END

FModelTest.model:OK

Log mode NON DEBUG:

Quote

Loadlibrary "libvosk.dll" OK
GetPublicPath ":D:\dev\dom\test11_androidacceslib\Win64\Debug\"
Pathmodel ":D:\dev\dom\test11_androidacceslib\Win64\Debug\vosk-model-small-fr-0.22":OK
04/04/2025 18:35:40:Exec vosk_model_new BEGIN
04/04/2025 18:35:41:Exec vosk_model_new END

FModelTest.model:OK

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

 

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×