Для программы распознавания голосовой активности (которая использует VAD webRT C) я хочу записывать звук с микрофона. Для этого я использую openAL. Ниже приведена моя программа для записи звука:
const int SRATE = 16000;
const int SSIZE = 320;
ALbyte buffer[SSIZE];
ALint sample;
void OpenALPOC::recordAudio()
{
const ALCchar* s=NULL;
alGetError();
if (alcIsExtensionPresent(NULL, "ALC_enumeration_EXT") == AL_TRUE)
{
s = alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER);
}
ALCdevice* device = alcCaptureOpenDevice(s, SRATE, AL_FORMAT_MONO16, SSIZE);
if (alGetError() != AL_NO_ERROR) {
cout << "error" << endl;
}
alcCaptureStart(device);
if (true) {
alcGetIntegerv(device, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(buffer), &sample);
alcCaptureSamples(device, (ALCvoid*)buffer, sample);
//Below this webRTC's VAD detection on received buffer ll be performed
}
alcCaptureStop(device);
alcCaptureCloseDevice(device);
}
VAD webRT C требует аудиофрейма моно 16-битной PCM с частотой дискретизации 16 кГц и должна иметь длительность 10, 20 20 миллисекунд Предполагается, что аудиофрейм составляет 10 мс, то есть 320 байт звука при 16000 Гц.
1 sample = 2B = 16 bits
SampleRate = 16000 sample/sec = 16 samples/ms
For 10 ms, no of samples = 160 = 320 bytes
Так что в приведенной выше программе SSIZE
Я установил на 320, а buffer
того же размера , Но когда я проверяю значение sample
после вызова функции alcGetIntegerv
, это 1600, 800, 960, это случайное случайное значение при каждом запуске. Я полагаю, что если я указал размер буфера в функции alcCaptureOpenDevice()
и alcGetIntegerv()
, то после данных alcGetIntegerv()
.
в данные будет возвращен только тот размер байтов. Итак, как я могу попросить openAL записать аудио для фиксированного количества сэмплов или для длительности 10 миллисекунд?