如果扬声器远离麦克风,Google Speech/NAudio 会有很大的延迟

Posted

技术标签:

【中文标题】如果扬声器远离麦克风,Google Speech/NAudio 会有很大的延迟【英文标题】:Google Speech/NAudio has a large delay if the speaker is far away from the microphone 【发布时间】:2019-04-03 16:49:18 【问题描述】:

我正在使用谷歌语音 api 和 NAudio(使用 NAudio WaveInEvent 类)对文本进行语音转换。像这样:https://cloud.google.com/speech-to-text/docs/streaming-recognize?hl=en(“在音频流上执行流式语音识别”的 C# 示例)

如果说话的人靠近麦克风,一切都会很好而且很快。但是如果说话的人离麦克风很远,他的前 3-5 个单词就无法识别。之后,其他单词被很好地识别。 (所以它不可能是距离的一般问题)更像是距离的适应问题,或者可能 NAudio 没有以 100% 的音量输入录制。

对这个问题有什么想法吗?

编辑:这是要求的代码:

static async Task<object> StreamingMicRecognizeAsync(int seconds)

    if (NAudio.Wave.WaveIn.DeviceCount < 1)
    
        Console.WriteLine("No microphone!");
        return -1;
    
    var speech = SpeechClient.Create();
    var streamingCall = speech.StreamingRecognize();
    // Write the initial request with the config.
    await streamingCall.WriteAsync(
        new StreamingRecognizeRequest()
        
            StreamingConfig = new StreamingRecognitionConfig()
            
                Config = new RecognitionConfig()
                
                    Encoding =
                    RecognitionConfig.Types.AudioEncoding.Linear16,
                    SampleRateHertz = 16000,
                    LanguageCode = "en",
                ,
                InterimResults = true,
            
        );
    // Print responses as they arrive.
    Task printResponses = Task.Run(async () =>
    
        while (await streamingCall.ResponseStream.MoveNext(
            default(CancellationToken)))
        
            foreach (var result in streamingCall.ResponseStream
                .Current.Results)
            
                foreach (var alternative in result.Alternatives)
                
                    Console.WriteLine(alternative.Transcript);
                
            
        
    );
    // Read from the microphone and stream to API.
    object writeLock = new object();
    bool writeMore = true;
    var waveIn = new NAudio.Wave.WaveInEvent();
    waveIn.DeviceNumber = 0;
    waveIn.WaveFormat = new NAudio.Wave.WaveFormat(16000, 1);
    waveIn.DataAvailable +=
        (object sender, NAudio.Wave.WaveInEventArgs args) =>
        
            lock (writeLock)
            
                if (!writeMore) return;
                streamingCall.WriteAsync(
                    new StreamingRecognizeRequest()
                    
                        AudioContent = Google.Protobuf.ByteString
                            .CopyFrom(args.Buffer, 0, args.BytesRecorded)
                    ).Wait();
            
        ;
    waveIn.StartRecording();
    Console.WriteLine("Speak now.");
    await Task.Delay(TimeSpan.FromSeconds(seconds));
    // Stop recording and shut down.
    waveIn.StopRecording();
    lock (writeLock) writeMore = false;
    await streamingCall.WriteCompleteAsync();
    await printResponses;
    return 0;

来源:https://cloud.google.com/speech-to-text/docs/streaming-recognize?hl=en

【问题讨论】:

【参考方案1】:

是的,事情就是这样运作的。引擎使用对声级的适应,如果水平太低,他们将简单地错过第一个单词,并且只有在适应后才会开始识别。准确率会低于预期。

要解决这个问题 - 使用更先进的麦克风阵列,它将跟踪像 Respeaker 或 Matrix 这样的音频源,并且可能使用更强大的自定义语音识别系统来快速改变音频电平。它也会比 Google API 便宜。

【讨论】:

【参考方案2】:

Cloud Speech API 有 best practices 使其能够以最佳方式工作,其中包括:

识别器旨在忽略背景声音和噪音,而无需额外的噪音消除。但是,为了获得最佳效果,请将麦克风放置在尽可能靠近用户的位置,尤其是在存在背景噪音的情况下。

【讨论】:

以上是关于如果扬声器远离麦克风,Google Speech/NAudio 会有很大的延迟的主要内容,如果未能解决你的问题,请参考以下文章

与 Google Speech API 的短语匹配

使用 Google Speech to Text API 从 Web 应用程序中的麦克风捕获实时音频 [关闭]

Google语音转文字Speech to Text 超级好用的语音转文本API

如何在 HTML 中制作 Animated Web Speech API UI

Microsoft Cognitive Speech-to-Text Service --- 选择麦克风

如何检查麦克风和扬声器是不是来自同一声卡?