Finished preceding buffer implementation

This commit is contained in:
Sviatoslav Tsariov Yurievich 2024-05-17 18:44:27 +03:00
parent 6cc1cb34f1
commit 05af001d8c
5 changed files with 36 additions and 29 deletions

View File

@ -15,6 +15,7 @@ Recorder::~Recorder() {
} }
void Recorder::recordAudio() { void Recorder::recordAudio() {
_recordingAudio = true;
_ready(); _ready();
if (_http->connect(RAT_IP, RAT_PORT)) { if (_http->connect(RAT_IP, RAT_PORT)) {
@ -28,6 +29,7 @@ void Recorder::recordAudio() {
} else { } else {
Serial.println("| Connection failed"); Serial.println("| Connection failed");
} }
_recordingAudio = false;
} }
void Recorder::_ready() { void Recorder::_ready() {
@ -79,7 +81,11 @@ String Recorder::_formPayloadEnd() {
} }
void Recorder::writeToPrecedingBuffer() { void Recorder::writeToPrecedingBuffer() {
if (!_isWritingToPrecedingBuffer && !_recordingAudio) {
_isWritingToPrecedingBuffer = true;
_audio->writeToPrecedingBuffer(); _audio->writeToPrecedingBuffer();
_isWritingToPrecedingBuffer = false;
}
} }
bool Recorder::isNoiseDetected() { bool Recorder::isNoiseDetected() {

View File

@ -8,6 +8,9 @@ private:
Audio* _audio; Audio* _audio;
Http* _http; Http* _http;
bool _isWritingToPrecedingBuffer = false;
bool _recordingAudio = false;
void _ready(); void _ready();
void _transcribe(); void _transcribe();
void _printContent(String payloadStart, String payloadEnd, Stream* stream); void _printContent(String payloadStart, String payloadEnd, Stream* stream);

View File

@ -10,7 +10,7 @@ Audio::Audio(MicType micType) {
for (int i = 0; i < _wavDataSize/_dividedWavDataSize; ++i) for (int i = 0; i < _wavDataSize/_dividedWavDataSize; ++i)
_wavData[i] = new char[_dividedWavDataSize]; _wavData[i] = new char[_dividedWavDataSize];
_precedingWavBuffer = new CircularBuffer<char*>(PRECEDING_BUFFER_SIZE); // _precedingWavDataSize/_dividedWavDataSize _precedingWavBuffer = new CircularBuffer<char*>(_precedingWavPartsAmount);
i2s = new I2S(micType); i2s = new I2S(micType);
} }
@ -77,9 +77,8 @@ char** Audio::record() {
_createWavHeader(_paddedHeader, _wavDataSize); _createWavHeader(_paddedHeader, _wavDataSize);
_startMicros = micros(); _startMicros = micros();
//_readFromPrecedingBuffer(_wavData, _precedingWavDataSize); _readFromPrecedingBuffer(_wavData);
//_recordToBuffer(_wavData + _precedingWavDataSize, _wavDataSize - _precedingWavDataSize); _recordToBuffer(_wavData + _precedingWavPartsAmount, _wavDataSize - _precedingWavDataSize);
_recordToBuffer(_wavData, _wavDataSize);
return _wavData; return _wavData;
} }
@ -104,6 +103,19 @@ void Audio::_recordToBuffer(char** wavBuffer, int waveDataSize) {
} }
} }
void Audio::_readFromPrecedingBuffer(char** wavBuffer) {
for (int i = 0; i < _precedingWavPartsAmount; i++) {
if (!_precedingWavBuffer->isEmpty()) {
char* tmp;
_precedingWavBuffer->popFront(tmp);
delete wavBuffer[i];
wavBuffer[i] = tmp;
}
}
emptyPrecedingBuffer();
}
void Audio::emptyPrecedingBuffer() { void Audio::emptyPrecedingBuffer() {
while (!_precedingWavBuffer->isEmpty()) { while (!_precedingWavBuffer->isEmpty()) {
char* tmp; char* tmp;
@ -122,23 +134,12 @@ void Audio::writeToPrecedingBuffer() {
i2s->Read(_i2sBuffer, _i2sBufferSize/2); i2s->Read(_i2sBuffer, _i2sBufferSize/2);
_noiseDetectedInPrecedingBuffer = _isNoiseDetectedInPrecedingBuffer(); _noiseDetectedInPrecedingBuffer = _isNoiseDetectedInPrecedingBuffer();
char* _partialWavBuffer = new char[_precedingWavDataSize]; char* _partialWavBuffer = new char[_dividedWavDataSize];
_convertBufferToWav(_partialWavBuffer); _convertBufferToWav(_partialWavBuffer);
CircularBufferErrorCode err = _precedingWavBuffer->pushBack(_partialWavBuffer); CircularBufferErrorCode err = _precedingWavBuffer->pushBack(_partialWavBuffer);
} }
void Audio::_readFromPrecedingBuffer(char** wavBuffer, int waveDataSize) {
char* tmp;
for (int i = 0; i < PRECEDING_BUFFER_SIZE; i++) {
_precedingWavBuffer->popFront(tmp);
wavBuffer[i] = tmp;
}
emptyPrecedingBuffer();
}
void Audio::_convertBufferToWav(char* partialWavBuffer) { void Audio::_convertBufferToWav(char* partialWavBuffer) {
for (int i = 0; i < _i2sBufferSize/8; ++i) { for (int i = 0; i < _i2sBufferSize/8; ++i) {
partialWavBuffer[2*i] = _i2sBuffer[4*i + 2]; partialWavBuffer[2*i] = _i2sBuffer[4*i + 2];

View File

@ -11,7 +11,7 @@ class Audio {
private: private:
I2S* i2s; I2S* i2s;
static const int _headerSize = 44; static const int _headerSize = 44;
static const int _i2sBufferSize = 6000; // 22500 static const int _i2sBufferSize = 6000;
char _i2sBuffer[_i2sBufferSize]; char _i2sBuffer[_i2sBufferSize];
char _i2sBuffer2[_i2sBufferSize]; char _i2sBuffer2[_i2sBufferSize];
@ -19,7 +19,8 @@ private:
static const int _dividedWavDataSize = _i2sBufferSize/4; static const int _dividedWavDataSize = _i2sBufferSize/4;
char** _wavData; // It's divided. Because large continuous memory area can't be allocated in esp32. char** _wavData; // It's divided. Because large continuous memory area can't be allocated in esp32.
static const int _precedingWavDataSize = _wavDataSize/4; static const int _precedingWavPartsAmount = 12;
static const int _precedingWavDataSize = _precedingWavPartsAmount*_dividedWavDataSize;
char** _precedingWavData; char** _precedingWavData;
CircularBuffer<char*>* _precedingWavBuffer; CircularBuffer<char*>* _precedingWavBuffer;
bool _precedingBufferFull = false; bool _precedingBufferFull = false;
@ -30,8 +31,8 @@ private:
unsigned long _startMicros = 0; unsigned long _startMicros = 0;
void _recordToBuffer(char** wavBuffer, int waveDataSize); void _recordToBuffer(char** wavBuffer, int waveDataSize);
void _readFromPrecedingBuffer(char** wavBuffer);
void _convertBufferToWav(char* partialWavBuffer); void _convertBufferToWav(char* partialWavBuffer);
void _readFromPrecedingBuffer(char** wavBuffer, int waveDataSize);
void _createWavHeader(byte* header, int waveDataSize); void _createWavHeader(byte* header, int waveDataSize);
bool _isNoiseDetectedInPrecedingBuffer(); bool _isNoiseDetectedInPrecedingBuffer();

View File

@ -68,7 +68,7 @@ void setup() {
setInitialTime(); setInitialTime();
recorder = new Recorder(ADMP441, &http); recorder = new Recorder(ADMP441, &http);
createWriteToPrecedingBufferTask(); //createWriteToPrecedingBufferTask();
beginMicros = micros(); beginMicros = micros();
} }
@ -76,13 +76,9 @@ void setup() {
void loop() { void loop() {
eth.readAndPrintData(true); // set to false for better speed measurement eth.readAndPrintData(true); // set to false for better speed measurement
/*if (loudnessFlag) { recorder->writeToPrecedingBuffer();
loudnessFlag = false;
if (recorder->isNoiseDetected()) {
recorder->recordAudio(); recorder->recordAudio();
}*/ }
//recorder->recordAudio();
//delay(15000);
//eth.handleDisconnect(beginMicros, micros());
} }