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
9df2ee2
master
1#include "stdafx.h" 2#include "../API/iMediaFoundation.cl.h" 3#include "mfStartup.h" 4#include "../ComLightLib/comLightServer.h" 5#include "loadAudioFile.h" 6#include <mfidl.h> 7#include <mfreadwrite.h> 8#include "mfUtils.h" 9#include "AudioCapture.h" 10#include <mfapi.h> 11 12namespace Whisper 13{ 14class AudioReader :public ComLight ::ObjectRoot < iAudioReader > 15 { 16CComPtr < IMFSourceReader > reader ; 17bool wantStereo ; 18CComPtr < iMediaFoundation > mediaFoundation ; 19mutable int64_t preciseSamplesCount = 0 ; 20 21HRESULT COMLIGHTCALL getReader (IMFSourceReader ** pp )const noexcept override final 22 { 23if (pp == nullptr ) 24return E_POINTER ; 25CComPtr < IMFSourceReader > res = reader ; 26* pp = res .Detach ();; 27return S_OK ; 28 } 29HRESULT COMLIGHTCALL requestedStereo ()const noexcept override final 30 { 31return wantStereo ?S_OK :S_FALSE ; 32 } 33HRESULT COMLIGHTCALL getDuration (int64_t & rdi )const noexcept override final 34 { 35if (reader ) 36 { 37if (0 == preciseSamplesCount ) 38return getStreamDuration (reader ,rdi ); 39else 40 {rdi = MFllMulDiv (preciseSamplesCount ,10'000'000 ,SAMPLE_RATE ,0 ); 41return S_OK ; 42 } 43 } 44return OLE_E_BLANK ; 45 } 46public : 47HRESULT open (iMediaFoundation * owner ,LPCTSTR path ,bool stereo ) 48 { 49HRESULT hr = MFCreateSourceReaderFromURL (path ,nullptr ,& reader ); 50if (FAILED (hr ) ) 51 { 52logErrorHr (hr ,u8"MFCreateSourceReaderFromURL failed" ); 53return hr ; 54 } 55wantStereo = stereo ; 56mediaFoundation = owner ; 57logDebug16 (L"Created source reader from the file \"%s\"" ,path ); 58return S_OK ; 59 } 60void setPreciseSamplesCount (int64_t count )const 61 { 62preciseSamplesCount = count ; 63 } 64 }; 65 66void setPreciseSamplesCount (const iAudioReader * ar ,int64_t count ) 67 { 68const AudioReader * r = static_cast < const AudioReader *> (ar ); 69r -> setPreciseSamplesCount (count ); 70 } 71 72class MediaFoundation :public ComLight ::ObjectRoot < iMediaFoundation > 73 { 74MfStartupRaii raii ; 75DWORD tid = ~(DWORD )0 ; 76 77virtual HRESULT COMLIGHTCALL loadAudioFile (LPCTSTR path ,bool stereo ,iAudioBuffer ** pp )const noexcept override final 78 { 79return Whisper ::loadAudioFile (path ,stereo ,pp ); 80 } 81virtual HRESULT COMLIGHTCALL openAudioFile (LPCTSTR path ,bool stereo ,iAudioReader ** pp )noexcept override final 82 { 83if (nullptr == path || nullptr == pp ) 84return E_POINTER ; 85 86ComLight ::CComPtr < ComLight ::Object < AudioReader >> res ; 87CHECK (ComLight ::Object < AudioReader > ::create (res ) ); 88CHECK (res -> open (this ,path ,stereo ) ); 89 90res .detach (pp ); 91return S_OK ; 92 } 93HRESULT COMLIGHTCALL listCaptureDevices (pfnFoundCaptureDevices pfn ,void * pv )noexcept override final 94 { 95return captureDeviceList (pfn ,pv ); 96 } 97HRESULT COMLIGHTCALL openCaptureDevice (LPCTSTR endpoint ,const sCaptureParams & captureParams ,iAudioCapture ** pp )noexcept override final 98 { 99return captureOpen (this ,endpoint ,captureParams ,pp ); 100 } 101protected : 102 103HRESULT FinalConstruct () 104 { 105CHECK (raii .startup () ); 106tid = GetCurrentThreadId (); 107return S_OK ; 108 } 109 110public : 111 112 ~MediaFoundation ()override 113 { 114assert (tid == GetCurrentThreadId () ); 115 } 116 }; 117} 118 119HRESULT COMLIGHTCALL Whisper ::initMediaFoundation (iMediaFoundation ** pp ) 120{ 121if (nullptr == pp ) 122return E_POINTER ; 123 124ComLight ::CComPtr < ComLight ::Object < MediaFoundation >> obj ; 125CHECK (ComLight ::Object < MediaFoundation > ::create (obj ) ); 126obj .detach (pp ); 127return S_OK ; 128}