Я решил разобратся как работают файлы wav, с нуля.
Впринципи почти все понятно.
WAV очень короткий звуковой фрагмент подгружается в буфер
массив байтов
Код:
buffer1: array [0..44099] of byte;
ну и после этот короткий отрезок из буфера можно воспроизести через
WaveOutWrite
Код:
procedure TForm1.PlayBuffer(soundBuffer: array of byte);
var
i, err: integer;
begin
with header do begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1;
nSamplesPerSec := 44100;
wBitsPerSample := 8;
nBlockAlign := nChannels * (wBitsPerSample div 8);
nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;
cbSize := 0;
end;
if Opened = false then begin
err:=WaveOutOpen(addr(waveOut), 0, @header, Handle, 0, CALLBACK_WINDOW);
if Err <> 0 then Exit;
for i:=0 to 1 do begin
pBuf[i] := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, length(soundBuffer));
pBuffer[i]:=GlobalLock(pBuf[i]);
with outHdr[i] do begin
lpData := pbuffer[i];
dwBufferLength := length(soundBuffer);
dwUser := 0;
dwFlags := 0;
dwLoops := 0;
end;
err:=WaveOutPrepareHeader(waveOut, @outHdr[i], sizeof(outHdr));
if Err <> 0 then Exit;
copyMemory(pBuffer[i], @soundBuffer, length(soundBuffer));
err:=WaveOutWrite(waveOut, @outHdr[i], sizeof(outHdr));
if Err <> 0 then Exit;
end;
end else begin
for i:=0 to 1do
copyMemory(pBuffer[i], @soundBuffer, length(soundBuffer));
end;
end;
И так далее wav файл постепенно подгружается в буфер и выводится на звуковую карту
Теперь вопрос.
Мне нужно как то получить с микрофона звуковой фрагмент в buffer1.
Но как это сделать ума нехватает, прошу помоч советом.
Мне это нужно что бы потом графически отобразить, шум в микрофоне, и при определенном уровне шума выполнить действие.
Разбирался недавно как работает гугловская программа для перевода речи в текст, на удивление русская речь переводится на 90% успешно.
Вот и хотел сделать програмку что бы по двойному хлопку в ладоши программа включала переводчик речи в текст и делала запрос в ютубе.
Что бы не вставая с дивана просматривать ютуб)