来自websocket的Google Speech API流媒体音频

问题描述 投票:1回答:1

我试图从Fleck websocket音频流中获得最终的语音转录/识别结果。方法OnOpen在首次建立websocket连接时执行代码,并且OnBinary方法每当从客户端接收二进制数据时执行代码。我已经通过将语音回显到websocket并将相同的二进制数据以相同的速率写回websocket来测试websocket。此测试有效,因此我知道二进制数据正在正确发送(640字节消息,帧大小为20ms)。

因此,我的代码失败而不是服务。我的目标是做到以下几点:

  1. 创建websocket连接后,使用SingleUtterance == true将初始音频配置请求发送到API
  2. 运行后台任务,侦听等待isFinal == true的流式传输结果
  3. 将收到的每个二进制消息发送到API进行转录
  4. 当后台任务识别isFinal == true时,停止当前的流请求并创建新请求 - 重复步骤1到4

该项目的背景是在实时电话中抄录所有单个话语。

socket.OnOpen = () =>
            {
                firstMessage = true;
            };
socket.OnBinary = async binary =>
            {
                var speech = SpeechClient.Create();
                var streamingCall = speech.StreamingRecognize();
                if (firstMessage == true)
                {
                    await streamingCall.WriteAsync(
                    new StreamingRecognizeRequest()
                    {
                        StreamingConfig = new StreamingRecognitionConfig()
                        {
                            Config = new RecognitionConfig()
                            {
                                Encoding = RecognitionConfig.Types.AudioEncoding.Linear16,
                                SampleRateHertz = 16000,
                                LanguageCode = "en",
                            },
                            SingleUtterance = true,
                        }
                    });
                    Task getUtterance = Task.Run(async () =>
                    {
                        while (await streamingCall.ResponseStream.MoveNext(
                            default(CancellationToken)))
                        {
                            foreach (var result in streamingCall.ResponseStream.Current.Results)
                            {
                                if (result.IsFinal == true)
                                {
                                    Console.WriteLine("This test finally worked");
                                }
                            }
                        }
                    });
                    firstMessage = false;
                }
                else if (firstMessage == false)
                {
                    streamingCall.WriteAsync(new StreamingRecognizeRequest()
                    {
                        AudioContent = Google.Protobuf.ByteString.CopyFrom(binary, 0, 640)
                    }).Wait();
                }
            };
asynchronous asp.net-core websocket google-cloud-platform google-speech-api
1个回答
0
投票

.Wait()是在异步/等待中调用的阻塞调用。它们混合不好并且可能导致死锁。

只需将代码保持异步即可

//...omitted for brevity

else if (firstMessage == false) {
    await streamingCall.WriteAsync(new StreamingRecognizeRequest() {
        AudioContent = Google.Protobuf.ByteString.CopyFrom(binary, 0, 640)
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.