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":
Unit d'appel des fonctions de la dll:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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'; ...
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!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; ...
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:
Après de nombreux tests:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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)
-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.
Partager