Arkadaşlar bu Eric Niebler'ın aralıklarını bir açık kodlu projemde deneme fırsatım oldu
Proje şu : https://github.com/kerdemdemir/OpenCVSpeakerFinder
Rangleri en çok kullandığım dosyada şu olacak https://github.com/kerdemdemir/OpenCVSpeakerFinder/blob/master/featureExtractor/featurelist.h .
Bir kısım kodu aşağıyada kopyalıyorum.
Diyeceğim şuki D'nin dilin içine inşa edilmiş aralıkları ile baş etmesi bana çok mümkün gelmedi.
struct Reader
{
static constexpr size_t MAX_FILE_SIZE = 20000000;
using ReaderIter = std::vector< double >::iterator;
using ReaderView = ranges::counted_view< ReaderIter, int >;
std::vector<double> rawData;
std::array<size_t, NUMBER_OF_PEOPLE> trainSizes;
size_t trainUpLimit;
size_t fileSize;
Reader () : trainSizes{0}
{
trainUpLimit = 20000000;
rawData.resize(MAX_FILE_SIZE);
}
ReaderView getView()
{
return ranges::counted_view< ReaderIter, int >( rawData.begin(), fileSize);
}
ReaderView
openWavFile(std::string fileName)
{
SF_INFO soundFileInfo;
SNDFILE* soundFile ;
int state = fileName2State(fileName);
if ( trainSizes[state] > trainUpLimit )
{
fileSize = 0;
std::cout << "Up Limit for speaker " << state << std::endl;
return getView();
}
soundFileInfo.format = 0;
soundFile = sf_open(fileName.c_str(), SFM_READ , &soundFileInfo);
if ( sf_error (soundFile) != 0)
{
std::cout << "Problem with input wav file" << std::endl;
fileSize = 0;
}
fileSize = sf_read_double(soundFile, rawData.data(), MAX_FILE_SIZE);
//for ( size_t i = 0; i < fileSize; i++)
// rawData[i] *= 3.3;
if (fileSize <= 0)
{
std::cout << "Problem while reading the file" << std::endl;
fileSize = 0;
}
trainSizes[state] += fileSize / (sampleRate / 1000) ;
return getView();
}
};
class FeatureList
{
public:
FeatureList()
{
inputSimple = new_fvec(hopSize);
phaseVocedor = new_aubio_pvoc( win_s, hopSize);
inputComplex = new_cvec(win_s);
}
~FeatureList()
{
del_cvec (inputComplex);
del_fvec(inputSimple);
del_aubio_pvoc(phaseVocedor);
}
int start ( const std::string& input )
{
auto readView = reader.openWavFile(input);
if ( readView.empty())
return -1;
auto readerChunks = readView | ranges::view::chunk(hopSize);
for ( auto extractor : extractors )
extractor->getFeatures().resize( readerChunks.size() );
RANGES_FOR( auto chunk, readerChunks )
{
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]