C# 我想用websocket按顺序发送语音数据并按顺序接收响应

C# 我想用websocket按顺序发送语音数据并按顺序接收响应,c#,websocket,C#,Websocket,我正在尝试使用C#中支持websocket的语音识别API进行语音识别。 根据该API,如果按顺序发送语音数据(二进制),将返回当时的识别结果。 我用下面的代码连续发送数据,但我无法得到初步的识别结果。 只得到最终的识别结果。 我认为发送语音数据的部分作为原因是不合适的,但我不明白它是怎么错的。 我对websokcet了解不多,我认为在发送部分有一个奇怪的部分。请告诉我正确的发送方式 这是我正在使用的API。 (旧) 静态异步任务发送(ClientWebSocket ws) { ArraySe

我正在尝试使用C#中支持websocket的语音识别API进行语音识别。 根据该API,如果按顺序发送语音数据(二进制),将返回当时的识别结果。 我用下面的代码连续发送数据,但我无法得到初步的识别结果。 只得到最终的识别结果。 我认为发送语音数据的部分作为原因是不合适的,但我不明白它是怎么错的。 我对websokcet了解不多,我认为在发送部分有一个奇怪的部分。请告诉我正确的发送方式

这是我正在使用的API。

(旧)

静态异步任务发送(ClientWebSocket ws)
{
ArraySegment closingMessage=新的ArraySegment(Encoding.UTF8.GetBytes(
“{\”命令\“:\”记录中断\“}”
));
使用(FileStream fs=File.OpenRead(“voice.raw”))
{
字节[]b=新字节[3200];
而(fs.Read(b,0,b.Length)>0)
{
等待ws.SendAsync(新的ArraySegment(b),WebSocketMessageType.Binary,true,CancellationToken.None);
}
等待ws.SendAsync(closingMessage、WebSocketMessageType.Text、true、CancellationToken.None);
}
}
(新)

静态异步任务SendAudio(ClientWebSocket ws) { ArraySegment closingMessage=新的ArraySegment(Encoding.UTF8.GetBytes( “{\”命令\“:\”记录中断\“}” )); 使用(FileStream fs=File.OpenRead(“audio.raw”)) { 字节[]b=新字节[3200]; 而(fs.Read(b,0,b.Length)>0) { 等待ws.SendAsync(新的ArraySegment(b,0,fs.Read(b,0,b.Length)),WebSocketMessageType.Binary,true,CancellationToken.None); } 等待ws.SendAsync(closingMessage、WebSocketMessageType.Text、true、CancellationToken.None); } } (新2)

专用异步任务SendAudio(ClientWebSocket ws)
{
ArraySegment closingMessage=新的ArraySegment(Encoding.UTF8.GetBytes(
“{\”命令\“:\”记录中断\“}”
));
使用(FileStream fs=File.OpenRead(“audio.raw”))
{
字节[]b=新字节[3200];
while(true)
{
int temp=fs.Read(b,0,b.Length);
如果(温度==0)
打破
等待ws.SendAsync(新的ArraySegment(b,0,temp),WebSocketMessageType.Binary,true,CancellationToken.None);
}
等待ws.SendAsync(closingMessage、WebSocketMessageType.Text、true、CancellationToken.None);
}
}

作为猜测,识别器会感到困惑,因为您发送的是整个3200字节的缓冲区,而不仅仅是读取的部分。谢谢您的评论。要仅发送读取的部分,我应该怎么做?捕获
fs.read
(读取的字节数)的结果,然后将其用作
ArraySegment
构造函数的参数-除了源缓冲区之外,还有一个重载需要start和length<代码>等待ws.SendAsync(新数组分段(b,0,fs.Read(b,0,b.Length)),WebSocketMessageType.Binary,true,CancellationToken.None)这是错误的吗?请用代码现在的方式更新问题(并保留旧版本)。作为猜测,识别器会混淆,因为您发送的是整个3200字节的缓冲区,而不仅仅是读取的部分。谢谢您的评论。要仅发送读取的部分,我应该怎么做?捕获
fs.read
(读取的字节数)的结果,然后将其用作
ArraySegment
构造函数的参数-除了源缓冲区之外,还有一个重载需要start和length<代码>等待ws.SendAsync(新数组分段(b,0,fs.Read(b,0,b.Length)),WebSocketMessageType.Binary,true,CancellationToken.None)这是错误的吗?请用代码现在的方式更新问题(并保留旧版本)。
private async Task SendAudio(ClientWebSocket ws)
        {
            ArraySegment<byte> closingMessage = new ArraySegment<byte>(Encoding.UTF8.GetBytes(
            "{\"command\": \"recog-break\"}"
            ));
            using (FileStream fs = File.OpenRead("audio.raw"))
            {
                byte[] b = new byte[3200];
                while (true)
                {
                    int temp = fs.Read(b, 0, b.Length);
                    if (temp == 0)
                        break;
                    await ws.SendAsync(new ArraySegment<byte>(b, 0, temp), WebSocketMessageType.Binary, true, CancellationToken.None);

                }
                await ws.SendAsync(closingMessage, WebSocketMessageType.Text, true, CancellationToken.None);
            }
        }