yum-archive/TaSTT-Whisper

High-performance GPGPU inference of OpenAI's Whisper automatic speech recognition (ASR) model

git clone https://git.yummers.dev/yum-archive/TaSTT-Whisper

KonstantinSource codes8c4603c

master
4.0 KiB143 linesraw
1#pragma once
2#include "AppState.h"
3#include "Utils/WTL/atlddx.h"
4#include "Utils/miscUtils.h"
5#include "Utils/LanguageDropdown.h"
6#include "Utils/TranslateCheckbox.h"
7#include "Utils/PendingState.h"
8#include "CircleIndicator.h"
9
10class CaptureDlg :
11	public CDialogImpl<CaptureDlg>,
12	public CWinDataExchange<CaptureDlg>,
13	public iThreadPoolCallback
14{
15	AppState& appState;
16
17public:
18	static constexpr UINT IDD = IDD_CAPTURE_DIALOG;
19	static constexpr UINT WM_CALLBACK_COMPLETION = WM_APP + 1;
20	static constexpr UINT WM_CALLBACK_STATUS = WM_APP + 2;
21
22	CaptureDlg( AppState& app ) : appState( app ) { }
23
24	HRESULT show();
25
26	BEGIN_MSG_MAP( CaptureDlg )
27		MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog )
28		ON_BUTTON_CLICK( IDC_CONSOLE, cbConsole.click )
29		ON_BUTTON_CLICK( IDC_DEV_REFRESH, onDeviceRefresh );
30		ON_BUTTON_CLICK( IDC_BROWSE_RESULT, onBrowseResult );
31		ON_BUTTON_CLICK( IDC_SAVE_TEXT, onSaveTextCheckbox );
32		ON_BUTTON_CLICK( IDC_RUN_CAPTURE, onRunCapture );
33
34		ON_BUTTON_CLICK( IDCANCEL, onClose )
35		ON_BUTTON_CLICK( IDC_BACK, onBack )
36		ON_BUTTON_CLICK( IDC_TRANSCRIBE, onTranscribe );
37
38		MESSAGE_HANDLER( WM_CALLBACK_COMPLETION, onThreadQuit );
39		MESSAGE_HANDLER( WM_CALLBACK_STATUS, onThreadStatus );
40	END_MSG_MAP()
41
42	BEGIN_DDX_MAP( CaptureDlg )
43		DDX_CONTROL_HANDLE( IDC_DEVICE, cbCaptureDevice )
44		DDX_CONTROL_HANDLE( IDC_RUN_CAPTURE, btnRunCapture );
45		DDX_CONTROL_HANDLE( IDC_TRANSCRIBE_PROGRESS, progressBar );
46		DDX_CONTROL_HANDLE( IDC_SAVE_TEXT, checkSave )
47		DDX_CONTROL_HANDLE( IDC_SAVE_APPEND, checkAppend )
48		DDX_CONTROL_HANDLE( IDC_SAVE_TIMESTAMPS, checkTimestamps )
49		DDX_CONTROL_HANDLE( IDC_PATH_RESULT, transcribeOutputPath )
50		DDX_CONTROL_HANDLE( IDC_BROWSE_RESULT, transcribeOutputBrowse );
51
52		DDX_CONTROL( IDC_VOICE_ACTIVITY, voiceActivity );
53		DDX_CONTROL( IDC_TRANS_STATUS, transcribeActivity );
54		DDX_CONTROL( IDC_STALL_STATUS, stalled );
55		
56	END_DDX_MAP()
57
58private:
59	PendingState pendingState;
60	void setPending( bool nowPending );
61
62	LRESULT OnInitDialog( UINT nMessage, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
63
64	void onClose()
65	{
66		ATLVERIFY( EndDialog( IDCANCEL ) );
67	}
68	void onBack()
69	{
70		ATLVERIFY( EndDialog( IDC_BACK ) );
71	}
72	void onTranscribe()
73	{
74		ATLVERIFY( EndDialog( IDC_TRANSCRIBE ) );
75	}
76
77	// List capture devices, and populate the combobox
78	bool listDevices();
79	void onDeviceRefresh();
80	bool selectDevice( LPCTSTR endpoint );
81
82	static HRESULT __stdcall listDevicesCallback( int len, const Whisper::sCaptureDevice* buffer, void* pv ) noexcept;
83	ConsoleCheckbox cbConsole;
84	LanguageDropdown languageSelector;
85	TranslateCheckbox cbTranslate;
86	CComboBox cbCaptureDevice;
87
88	void onBrowseResult();
89
90	enum struct eTextFlags : uint32_t;
91	CButton	checkSave, checkAppend, checkTimestamps;
92	CEdit transcribeOutputPath;
93	CButton transcribeOutputBrowse;
94	void onSaveTextCheckbox();
95	eTextFlags getOutputFlags();
96
97	CButton btnRunCapture;
98	CProgressBarCtrl progressBar;
99	ThreadPoolWork work;
100
101	struct sCaptureDevice
102	{
103		CString displayName;
104		CString endpoint;
105	};
106	std::vector<sCaptureDevice> devices;
107
108	void showError( LPCTSTR text, HRESULT hr );
109
110	CircleIndicator voiceActivity;
111	CircleIndicator transcribeActivity;
112	CircleIndicator stalled;
113
114	struct sThreadState
115	{
116		volatile bool stopRequested;
117		bool translate;
118		eTextFlags flags;
119		CAtlFile* file;
120		uint32_t language;
121		Whisper::sCaptureParams captureParams;
122		CString endpoint;
123		CString textOutputPath;
124		CString errorMessage;
125	};
126	sThreadState threadState;
127	bool captureRunning = false;
128
129	void getThreadError();
130	void onRunCapture();
131	HRESULT runCapture();
132	void __stdcall poolCallback() noexcept override final;
133
134	LRESULT onThreadQuit( UINT nMessage, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
135	LRESULT onThreadStatus( UINT nMessage, WPARAM wParam, LPARAM lParam, BOOL& bHandled );
136
137	static HRESULT __stdcall cbCancel( void* pv ) noexcept;
138	static HRESULT __stdcall cbStatus( void* pv, Whisper::eCaptureStatus status ) noexcept;
139
140	static HRESULT __cdecl newSegmentCallback( Whisper::iContext* ctx, uint32_t n_new, void* user_data ) noexcept;
141
142	HRESULT appendTextFile( Whisper::iTranscribeResult* results, uint32_t newSegments );
143};