From 23c26277086c78704a17f0dae86da947816320c0 Mon Sep 17 00:00:00 2001 From: George Gekov Date: Mon, 16 Aug 2021 11:32:10 +0100 Subject: MLECO-2079 Adding the C++ KWS example Signed-off-by: Eanna O Cathain Change-Id: I81899bbfaada32f478c2e2fc6441eabb94d8d0fc --- samples/common/src/Audio/AudioCapture.cpp | 96 +++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 samples/common/src/Audio/AudioCapture.cpp (limited to 'samples/common/src/Audio/AudioCapture.cpp') diff --git a/samples/common/src/Audio/AudioCapture.cpp b/samples/common/src/Audio/AudioCapture.cpp new file mode 100644 index 0000000000..920d7a5233 --- /dev/null +++ b/samples/common/src/Audio/AudioCapture.cpp @@ -0,0 +1,96 @@ +// +// Copyright © 2021 Arm Ltd and Contributors. All rights reserved. +// SPDX-License-Identifier: MIT +// + +#include "AudioCapture.hpp" +#include +#include +#include + +namespace audio +{ + std::vector AudioCapture::LoadAudioFile(std::string filePath) + { + SF_INFO inputSoundFileInfo; + SNDFILE* infile = nullptr; + infile = sf_open(filePath.c_str(), SFM_READ, &inputSoundFileInfo); + + float audioIn[inputSoundFileInfo.channels * inputSoundFileInfo.frames]; + sf_read_float(infile, audioIn, inputSoundFileInfo.channels * inputSoundFileInfo.frames); + + float sampleRate = 16000.0f; + float srcRatio = sampleRate / (float)inputSoundFileInfo.samplerate; + int outputFrames = ceilf(inputSoundFileInfo.frames * srcRatio); + + // Convert to mono + std::vector monoData(inputSoundFileInfo.frames); + for(int i = 0; i < inputSoundFileInfo.frames; i++) + { + for(int j = 0; j < inputSoundFileInfo.channels; j++) + monoData[i] += audioIn[i * inputSoundFileInfo.channels + j]; + monoData[i] /= inputSoundFileInfo.channels; + } + + // Resample + SRC_DATA srcData; + srcData.data_in = monoData.data(); + srcData.input_frames = inputSoundFileInfo.frames; + + std::vector dataOut(outputFrames); + srcData.data_out = dataOut.data(); + + srcData.output_frames = outputFrames; + srcData.src_ratio = srcRatio; + + src_simple(&srcData, SRC_SINC_BEST_QUALITY, 1); + + sf_close(infile); + + return dataOut; + } + + void AudioCapture::InitSlidingWindow(float* data, size_t dataSize, int minSamples, size_t stride) + { + this->m_window = SlidingWindow(data, dataSize, minSamples, stride); + } + + bool AudioCapture::HasNext() + { + return m_window.HasNext(); + } + + std::vector AudioCapture::Next() + { + if (this->m_window.HasNext()) + { + int remainingData = this->m_window.RemainingData(); + const float* windowData = this->m_window.Next(); + + size_t windowSize = this->m_window.GetWindowSize(); + + if(remainingData < windowSize) + { + std::vector audioData(windowSize, 0.0f); + for(int i = 0; i < remainingData; ++i) + { + audioData[i] = *windowData; + if(i < remainingData - 1) + { + ++windowData; + } + } + return audioData; + } + else + { + std::vector audioData(windowData, windowData + windowSize); + return audioData; + } + } + else + { + throw std::out_of_range("Error, end of audio data reached."); + } + } +} //namespace asr \ No newline at end of file -- cgit v1.2.1