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