所以我得到了下一个单位代码来捕捉麦克风音频。
我喜欢用捕捉到的音频发送到谷歌语音识别api。
googlespeechapi只接受一些编码格式。
我需要的音频在线性16未压缩16位有符号小尾数样本。
Sample of use:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SNDProcWaveIn(ind);
end;
unit WaveSound;
interface
uses
SysUtils, MMSystem;
const
NUMSAMPLES = 1024;
type
TIndata = array[0 .. NUMSAMPLES - 1] of Integer;
PIndata = ^TIndata;
TFrec= record
Fx, dx :Integer;
end;
function SNDInitWaveIn: Cardinal;
procedure SNDProcWaveIn(var Indata : TIndata);
procedure SNDStopWave;
implementation
var
DevHandle : Integer;
WAVEFORMAT1 : TWAVEFORMATEX;
Wave : WAVEHDR;
function SNDInitWaveIn: Cardinal;
begin
with WAVEFORMAT1 do begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := 1;
nSamplesPerSec := 44100;
wBitsPerSample := 16;
nBlockAlign := (nChannels * wBitsPerSample) div 8;
nAvgBytesPerSec := nBlockAlign * nSamplesPerSec;
cbSize := 0;
end;
Result:= waveInOpen(@DevHandle, cardinal(-1),@WAVEFORMAT1, cardinal(0), cardinal(0), cardinal(0));
If not(DevHandle = 0) Then waveInStart(DevHandle);
end;
procedure SNDProcWaveIn(var Indata : TIndata);
begin
Wave.lpData := @Indata;
Wave.dwBufferLength := NUMSAMPLES;
Wave.dwFlags := 0;
waveInPrepareHeader(DevHandle, @Wave, sizeof(Wave));
waveInAddBuffer(DevHandle, @Wave, sizeof(Wave));
Sleep(10);
repeat
until (((Wave.dwFlags and WHDR_DONE)= WHDR_DONE) or (DevHandle = 0));
If (DevHandle = 0) Then Exit;
waveInUnprepareHeader(DevHandle, @Wave, sizeof(Wave));
end;
procedure SNDStopWave;
begin
waveInReset(DevHandle);
waveInClose(DevHandle);
DevHandle := 0;
end;
end.