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
8c4603c
master
1#include "stdafx.h" 2#include "mfUtils.h" 3#include <mfapi.h> 4 5HRESULT Whisper ::createMediaType (bool stereo ,IMFMediaType ** pp ) 6{ 7if (nullptr == pp ) 8return E_POINTER ; 9 10CComPtr < IMFMediaType > mt ; 11CHECK (MFCreateMediaType (& mt ) ); 12CHECK (mt -> SetGUID (MF_MT_MAJOR_TYPE ,MFMediaType_Audio ) ); 13CHECK (mt -> SetGUID (MF_MT_SUBTYPE ,MFAudioFormat_Float ) ); 14CHECK (mt -> SetUINT32 (MF_MT_AUDIO_SAMPLES_PER_SECOND ,SAMPLE_RATE ) ); 15 16const uint32_t channels = stereo ?2 :1 ; 17CHECK (mt -> SetUINT32 (MF_MT_AUDIO_NUM_CHANNELS ,channels ) ); 18CHECK (mt -> SetUINT32 (MF_MT_AUDIO_BLOCK_ALIGNMENT ,channels * 4 ) ); 19CHECK (mt -> SetUINT32 (MF_MT_AUDIO_AVG_BYTES_PER_SECOND ,channels * 4 * SAMPLE_RATE ) ); 20CHECK (mt -> SetUINT32 (MF_MT_AUDIO_BITS_PER_SAMPLE ,32 ) ); 21CHECK (mt -> SetUINT32 (MF_MT_ALL_SAMPLES_INDEPENDENT , TRUE ) ); 22 23* pp = mt .Detach (); 24 25return S_OK ; 26} 27 28HRESULT Whisper ::getStreamDuration (IMFSourceReader * reader ,int64_t & duration ) 29{ 30PROPVARIANT var ; 31PropVariantInit (& var ); 32CHECK (reader -> GetPresentationAttribute (MF_SOURCE_READER_MEDIASOURCE ,MF_PD_DURATION ,& var ) ); 33 34if (var .vt == VT_UI8 ) 35 { 36// The documentation says the type of that attribute is UINT64 37// https://learn.microsoft.com/en-us/windows/win32/medfound/mf-pd-duration-attribute 38duration = var .uhVal .QuadPart ; 39return S_OK ; 40 } 41logError (u8"Unexpected type of MF_PD_DURATION attribute" ); 42return E_INVALIDARG ; 43} 44 45HRESULT Whisper ::validateCurrentMediaType (IMFSourceReader * reader ,uint32_t expectedChannels ) 46{ 47CComPtr < IMFMediaType > mt ; 48CHECK (reader -> GetCurrentMediaType (MF_SOURCE_READER_FIRST_AUDIO_STREAM ,& mt ) ); 49 50GUID guid ; 51CHECK (mt -> GetGUID (MF_MT_MAJOR_TYPE ,& guid ) ); 52if (guid != MFMediaType_Audio ) 53return E_FAIL ; 54 55CHECK (mt -> GetGUID (MF_MT_SUBTYPE ,& guid ) ); 56if (guid != MFAudioFormat_Float ) 57return E_FAIL ; 58 59UINT32 u32 ; 60CHECK (mt -> GetUINT32 (MF_MT_AUDIO_SAMPLES_PER_SECOND ,& u32 ) ); 61if (u32 != SAMPLE_RATE ) 62return E_FAIL ; 63 64CHECK (mt -> GetUINT32 (MF_MT_AUDIO_NUM_CHANNELS ,& u32 ) ); 65if (u32 != expectedChannels ) 66return E_FAIL ; 67 68return S_OK ; 69}