Ok so I figure out a working solution:
1) Build a WaveIn
waveIn = new WaveInEvent();
waveIn.DeviceNumber = 0;
waveIn.WaveFormat = new WaveFormat(16000, 2);
waveIn.DataAvailable += waveIn_DataAvailable;
2) Build a PipeStream
buffer = new PipeStream();
engine.SetInputToAudioStream(buffer, waveIn.WaveFormat);
3) Copy WaveIn to Buffer
void waveIn_DataAvailable(object sender, WaveInEventArgs e) {
buffer.Write(e.Buffer, 0, e.BytesRecorded);
}
It works fine and there is no need to worry about. Buffer size already handle by PipeStream.