1 pièce(s) jointe(s)
Probleme temps d'execution prg dans IDE Delphi11.2 et en ligne de commande d'une fonction de DLL
Bonjour,
dans un projet multiplateforme domotique(W11/Android12/Debian12), j'ai un probleme nouveau pour moi, lorsque j'execute ce programme sous Delphi11.2/FMX/Win64
qui appelle une fonction "vosk_model_new" d'une librairie "libvosk.dll"(librairie de reconnaissance vocale) :
Unit d'entete de la Dll "Vosk_api.pas":
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
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 = '';
{$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;
function vosk_model_new(const model_path: PAnsiChar): PVoskModel; cdecl;
external LIB_VOSK name _PU + 'vosk_model_new';
... |
Unit d'appel des fonctions de la dll:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| unit VoskModelNew;
interface
uses
SysUtils, Classes,
vosk_api;
type
TVoskModel = class(TComponent)
private
{ Private declarations }
FModel: PVoskModel;
FModelPath: String;
protected
{ Protected declarations }
public
{ Public declarations }
//constructor Create(AOwner: TComponent); overload; override;
constructor Create(AOwner: TComponent; AModelPath: String); reintroduce;
destructor Destroy; override;
function FindWord(AWord: String): Integer;
property Model: PVoskModel read FModel;
published
{ Published declarations }
property ModelPath: String read FModelPath;
end;
implementation
constructor TVoskModel.Create(AOwner: TComponent; AModelPath: String);
var pmodelpath:pAnsichar;
begin
inherited Create(AOwner);
FModelPath := AModelPath;
pmodelpath := AnsiStrAlloc(length(Amodelpath));
StrPLCopy(pmodelpath, Amodelpath, length(Amodelpath));
try
FModel := vosk_model_new(pmodelpath);//FModelPath));
finally
StrDispose(pmodelpath);
end;
end;
... |
1) Sous W11/Delphi11.2FMX/Win64:lorsque le prg est executé dans l'IDE mode debug ou release, le temps d'éxecution de la fonction est d'environ 2,5 minutes!!
2) Sous W11/Delphi11.2FMX/Win64:lorsque le prg est executé en ligne de commande dans une fenêtre windows, le temps d'execution de la fonction est OK(environ 1 à 2 secondes).
3) Sous Delphi11.2FMX/Android12, le temps d'execution hors IDE de la fonction est OK(environ 1 à 2 secondes). (impossible de tester dans EDI en mode DEBUG pour Android)
- sous RASPI/Debian12/Lazarus4.0, pas de problème non plus avec la libvosk.so equivalente.
C'est forcemment bien bloquant pour développer sous Delphi.
je joins les logevents de l'EDI, qui liste les multiples debut/Sortie de thread (>100) pendant l'éxecution de la fonction sous EDI.
Extrait LOGS:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| ....
Sortie de débogage: 13/06/2025 17:49:51:DEBUT voskmodel_create Processus ptestvosk1.exe (16656)
Début du Thread : ID du thread : 18932. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 12652. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 4672. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 10492. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 19368. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 18140. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 4368. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 9756. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 15528. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 8128. Processus ptestvosk1.exe (11040)
Début du Thread : ID du thread : 6320. Processus ptestvosk1.exe (11040)
Sortie du Thread : ID du thread : 18932. Processus ptestvosk1.exe (11040)
....
Sortie de débogage: 13/06/2025 17:51:50:FIN voskmodel_create Processus ptestvosk1.exe (16656) |
Après de nombreux tests:
-Appel fonction en Stdcall ou cdecl
-Avec lib en statique ou dynamique
-Options/projet/debogage distant décoché
le probleme est identique et je ne vois aucune solution.
Est-ce plutot côté de l'EDI qu'il faut chercher ou coté de la dll Vosk?
Quelqu'un aurait'il une piste, idealement une solution ?
Merci d'avance et bonne journée.