0

我正在尝试编写一个应用程序来收听我的计算机音频并使用 Google 语音识别对其进行转录。

我已经能够使用录制系统声音WasapiLoopbackCapture并且我已经能够使用带有测试文件的谷歌流识别api,但我无法将两者合并在一起。

当我将音频从WasapiLoopbackCapturegoogle 流式传输时,它不会返回任何结果。

我的代码基于谷歌代码示例: https ://github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/9588cee6d96bfe484c8e189e9ac2f6eaa3c3b002/speech/api/Recognize/InfiniteStreaming.cs#L225

private WaveInEvent StartListening()
    {
        var waveIn = new WaveInEvent
        {
            DeviceNumber = 0,
            WaveFormat = new WaveFormat(SampleRate, ChannelCount)
        };
        waveIn.DataAvailable += (sender, args) =>
        _microphoneBuffer.Add(ByteString.CopyFrom(args.Buffer, 0, args.BytesRecorded));
        waveIn.StartRecording();
        return waveIn;
    }

并调整它以使用 WasapiLoopbackCapture:

        private IDisposable StartListening()
    {

        var waveIn = new WasapiLoopbackCapture();
        //var waveIn = new WaveInEvent
        //{
            
        //    DeviceNumber = 0,
        //    WaveFormat = new WaveFormat(SampleRate, ChannelCount)
        //};

        SampleRate = waveIn.WaveFormat.SampleRate;
        ChannelCount = waveIn.WaveFormat.Channels;
        BytesPerSecond = SampleRate * ChannelCount * BytesPerSample;

        Console.WriteLine(SampleRate);
        Console.WriteLine(BytesPerSecond);
        waveIn.DataAvailable += (sender, args) =>
        _microphoneBuffer.Add(ByteString.CopyFrom(args.Buffer, 0, args.BytesRecorded));
        waveIn.StartRecording();
        return waveIn;
    }

但它不会返回任何转录文本。

我已将输入流保存到文件中,并且播放正常 - 所以声音到了,我猜是从 WasapiLoopback 接收到的 waveFormat 与谷歌喜欢的不兼容 - 我尝试了一些转换并且不能让它工作。

我已经查看了有关堆栈溢出的以下主题,但仍然无法使其正常工作: 重新采样 WasapiLoopbackCapture Naudio - Convert 32 bit wav to 16 bit wav

并尝试将它们结合起来:

private IDisposable StartListening()
    {
        
        var waveIn = new WasapiLoopbackCapture();
        //var waveIn = new WaveInEvent
        //{
        //DeviceNumber = 0,
        //WaveFormat = new WaveFormat(SampleRate, ChannelCount)
        //};


        //  SampleRate = waveIn.WaveFormat.SampleRate;
        //   ChannelCount = waveIn.WaveFormat.Channels;
        //  BytesPerSecond = waveIn.WaveFormat.AverageBytesPerSecond;// SampleRate * ChannelCount * BytesPerSample;

        var target = new WaveFormat(SampleRate, 16, 1);
        var writer = new WaveFileWriter(@"c:\temp\xx.wav", waveIn.WaveFormat);

        Console.WriteLine(SampleRate);
        Console.WriteLine(BytesPerSecond);
        var stop = false;
        waveIn.DataAvailable += (sender, args) =>
        {
            var a = args;
            byte[] newArray16Bit = new byte[args.BytesRecorded / 2];
            short two;
            float value;
            for (int i = 0, j = 0; i < args.BytesRecorded; i += 4, j += 2)
            {
                value = (BitConverter.ToSingle(args.Buffer, i));
                two = (short)(value * short.MaxValue);

                newArray16Bit[j] = (byte)(two & 0xFF);
                newArray16Bit[j + 1] = (byte)((two >> 8) & 0xFF);
            }
            var resampleStream = new NAudio.Wave.Compression.AcmStream(new WaveFormat(waveIn.WaveFormat.SampleRate
                ,16,waveIn.WaveFormat.Channels), target);
            Buffer.BlockCopy(newArray16Bit, 0, resampleStream.SourceBuffer, 0, a.BytesRecorded/2);
            int sourceBytesConverted = 0;
            var bytes = resampleStream.Convert(a.BytesRecorded/2, out sourceBytesConverted);
            var converted = new byte[bytes];
            Buffer.BlockCopy(resampleStream.DestBuffer, 9, converted,0, bytes);
            a = new WaveInEventArgs(converted,bytes);



            _microphoneBuffer.Add(ByteString.CopyFrom(a.Buffer, 0, a.BytesRecorded));
            if (writer != null)
            {
                writer.Write(a.Buffer, 0, a.BytesRecorded);
                if (writer.Position > waveIn.WaveFormat.AverageBytesPerSecond * 5)
                {
                    stop = true;
                    writer.Dispose();
                    writer = null;
                    Console.WriteLine("Saved file");
                }
            }
        };
        waveIn.StartRecording();
        return waveIn;
    }

但它不起作用。

我不确定这是否是正确的道路。

一个修复的代码示例将不胜感激

我尝试转换比特率等。但无法让它工作。

4

0 回答 0