10

TCP ソケットから C# で「ストリーミング」音声認識を実行しようとしています。私が抱えている問題は、 SpeechRecognitionEngine.SetInputToAudioStream() がシークできる定義された長さのストリームを必要とするように見えることです。今のところ、これを機能させるために考えられる唯一の方法は、より多くの入力が入るたびに MemoryStream で認識エンジンを繰り返し実行することです。

説明するコードを次に示します。

            SpeechRecognitionEngine appRecognizer = new SpeechRecognitionEngine();

            System.Speech.AudioFormat.SpeechAudioFormatInfo formatInfo = new System.Speech.AudioFormat.SpeechAudioFormatInfo(8000, System.Speech.AudioFormat.AudioBitsPerSample.Sixteen, System.Speech.AudioFormat.AudioChannel.Mono);

            NetworkStream stream = new NetworkStream(socket,true);
            appRecognizer.SetInputToAudioStream(stream, formatInfo);
            // At the line above a "NotSupportedException" complaining that "This stream does not support seek operations."

これを回避する方法を知っている人はいますか?SetInputToDefaultAudioDevice() を使用してマイクで正常に動作するため、何らかのストリーミング入力をサポートする必要があります。

ありがとう、ショーン

4

5 に答える 5

16

ストリーム クラスをオーバーライドすることで、ライブ音声認識が機能するようになりました。

class SpeechStreamer : Stream
{
    private AutoResetEvent _writeEvent;
    private List<byte> _buffer;
    private int _buffersize;
    private int _readposition;
    private int _writeposition;
    private bool _reset;

    public SpeechStreamer(int bufferSize)
    {
        _writeEvent = new AutoResetEvent(false);
         _buffersize = bufferSize;
         _buffer = new List<byte>(_buffersize);
         for (int i = 0; i < _buffersize;i++ )
             _buffer.Add(new byte());
        _readposition = 0;
        _writeposition = 0;
    }

    public override bool CanRead
    {
        get { return true; }
    }

    public override bool CanSeek
    {
        get { return false; }
    }

    public override bool CanWrite
    {
        get { return true; }
    }

    public override long Length
    {
        get { return -1L; }
    }

    public override long Position
    {
        get { return 0L; }
        set {  }
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        return 0L;
    }

    public override void SetLength(long value)
    {

    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        int i = 0;
        while (i<count && _writeEvent!=null)
        {
            if (!_reset && _readposition >= _writeposition)
            {
                _writeEvent.WaitOne(100, true);
                continue;
            }
            buffer[i] = _buffer[_readposition+offset];
            _readposition++;
            if (_readposition == _buffersize)
            {
                _readposition = 0;
                _reset = false;
            }
            i++;
        }

        return count;
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        for (int i = offset; i < offset+count; i++)
        {
            _buffer[_writeposition] = buffer[i];
            _writeposition++;
            if (_writeposition == _buffersize)
            {
                _writeposition = 0;
                _reset = true;
            }
        }
        _writeEvent.Set();

    }

    public override void Close()
    {
        _writeEvent.Close();
        _writeEvent = null;
        base.Close();
    }

    public override void Flush()
    {

    }
}

...そしてそのインスタンスを SetInputToAudioStream メソッドへのストリーム入力として使用します。ストリームが長さを返すか、返されたカウントが要求された数より少なくなるとすぐに、認識エンジンは入力が終了したと判断します。これにより、終了しない循環バッファーが設定されます。

于 2012-08-05T01:29:14.680 に答える
2

System.IO.BufferedStream でネットワーク ストリームをラップしようとしましたか?

NetworkStream netStream = new NetworkStream(socket,true);
BufferedStream buffStream = new BufferedStream(netStream, 8000*16*1); // buffers 1 second worth of data
appRecognizer.SetInputToAudioStream(buffStream, formatInfo);
于 2009-11-05T19:24:42.647 に答える
2

どうやらそれはできません(「設計上」!)。http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/fcf62d6d-19df-4ca9-9f1f-17724441f84eを参照してください。

于 2010-11-20T05:49:54.540 に答える
1

入力をバッファリングしてから、音声認識エンジンに連続して大きなチャンクで送信することになりました。たとえば、最初に最初の 0.25 秒、次に最初の 0.5 秒、次に最初の 0.75 秒というように、結果が得られるまで送信します。これが最も効率的な方法かどうかはわかりませんが、満足のいく結果が得られます。

幸運を祈ります、ショーン

于 2010-01-09T13:17:43.243 に答える