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
5929750
master
1#pragma once 2#include <algorithm> 3#include <fstream> 4#include <vector> 5 6namespace Whisper 7{ 8struct AudioBuffer 9 { 10std ::vector < float > mono ; 11std ::vector < float > stereo ; 12 13void appendMono (const float * rsi ,size_t countFloats ); 14void appendDownmixedStereo (const float * rsi ,size_t countFloats ); 15void appendStereo (const float * rsi ,size_t countFloats ); 16 17using pfnAppendSamples = void (AudioBuffer ::* )(const float * rsi ,size_t countFloats ); 18 19inline static pfnAppendSamples appendSamplesFunc (bool sourceMono ,bool wantStereo ) 20 { 21if (sourceMono ) 22return & AudioBuffer ::appendMono ; 23else if ( !wantStereo ) 24return & AudioBuffer ::appendDownmixedStereo ; 25else 26return & AudioBuffer ::appendStereo ; 27 } 28 29void clear () 30 { 31mono .clear (); 32stereo .clear (); 33 } 34 35void swap (AudioBuffer & that ) 36 { 37mono .swap (that .mono ); 38stereo .swap (that .stereo ); 39 } 40 41void resize (size_t len ) 42 { 43assert (len <=mono .size () ); 44mono .resize (len ); 45if ( !stereo .empty () ) 46stereo .resize (len * 2 ); 47 } 48 49void dropFirst (size_t len ) 50 { 51if (len >=mono .size ()) { 52mono .clear (); 53return ; 54 } 55size_t remainder = mono .size ()- len ; 56 autotmp = std ::vector < float > (remainder ); 57memcpy (tmp .data (),mono .data ()+ len ,remainder ); 58mono = std ::move (tmp ); 59 } 60 61void retainLast (size_t len ) 62 { 63if (len >=mono .size ()) { 64return ; 65 } 66size_t prefix_len = mono .size ()- len ; 67 autotmp = std ::vector < float > (len ); 68memcpy (tmp .data (),mono .data ()+ prefix_len ,len ); 69mono = std ::move (tmp ); 70 } 71 72void normalize () 73 { 74const auto& min = * std ::min_element (mono .begin (),mono .end ()); 75const auto& max = * std ::max_element (mono .begin (),mono .end ()); 76 77for (auto& elm :mono ) { 78elm -= min ; 79elm /= (max - min )+ 1 ; 80 } 81 } 82 83void save (const char * path ,const int sample_rate ) { 84const int n_samples = mono .size (); 85const int bits_per_sample = sizeof (mono [0 ])* 8 ; 86const int n_channels = 1 ; 87const int byte_rate = sample_rate * n_channels * bits_per_sample /8 ; 88const int block_align = n_channels * bits_per_sample /8 ; 89const int data_chunk_size = n_samples * n_channels * bits_per_sample /8 ; 90const int file_size = 36 + data_chunk_size ; 91 92std ::ofstream ofs (path ,std ::ios ::out |std ::ios ::binary ); 93ofs .write ("RIFF" ,4 ); 94ofs .write ((char * )& file_size ,4 ); 95ofs .write ("WAVE" ,4 ); 96 97ofs .write ("fmt " ,4 ); 98const int fmt_chunk_size = 16 ; 99ofs .write ((char * )& fmt_chunk_size ,4 ); 100const short audio_format = 1 ;// PCM 101ofs .write ((char * )& audio_format ,2 ); 102ofs .write ((char * )& n_channels ,2 ); 103ofs .write ((char * )& sample_rate ,4 ); 104ofs .write ((char * )& byte_rate ,4 ); 105ofs .write ((char * )& block_align ,2 ); 106ofs .write ((char * )& bits_per_sample ,2 ); 107 108ofs .write ("data" ,4 ); 109ofs .write ((char * )& data_chunk_size ,4 ); 110for (int i = 0 ;i < n_samples ;i ++ ) { 111short sample = (short )(mono [i ]* 32767.0f ); 112ofs .write ((char * )& sample ,2 ); 113 } 114 }; 115 }; 116}