C# 如何将语音流传输到wit.ai语音端点

C# 如何将语音流传输到wit.ai语音端点,c#,httpwebrequest,speech,wit.ai,C#,Httpwebrequest,Speech,Wit.ai,我很难从wit得到好的回应。ai的演讲结束点。响应总是400。我似乎是在遵循规则,但有点不对劲 任何帮助都将不胜感激 private string ProcessSpeechStream(Stream stream) { BinaryReader filereader = new BinaryReader(stream); byte[] arr = filereader.ReadBytes((Int32)stream.Length);

我很难从wit得到好的回应。ai的演讲结束点。响应总是400。我似乎是在遵循规则,但有点不对劲

任何帮助都将不胜感激

private string ProcessSpeechStream(Stream stream)
  {
            BinaryReader filereader = new BinaryReader(stream);
            byte[] arr = filereader.ReadBytes((Int32)stream.Length);
            filereader.Close();


            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.wit.ai/speech");
            request.SendChunked = true;
            request.Method = "POST";
            request.Headers["Authorization"] = "Bearer " + APIToken;
            request.ContentType  = "chunked"; 
            request.ContentLength = arr.Length;          
            var st = request.GetRequestStream();
            st.Write(arr, 0, arr.Length);
            st.Close();
            // Process the wit.ai response
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    StreamReader response_stream = new StreamReader(response.GetResponseStream());
                    return response_stream.ReadToEnd();
                }
                else
                {
                    Logger.AILogger.Log("Error: " + response.StatusCode.ToString());
                    return string.Empty;

                }
            }
            catch (Exception ex)
            {
                Logger.AILogger.Log("Error: " + ex.Message, ex);
                return string.Empty;
            }
  }

此代码示例使用正确的编码。如果您正在使用Naudio,请确保波形格式与编码类似(另外必须是单声道):


您应该将
Transfer-encoding
标题设置为
request.Transfer-encoding=“chunked”
ContentType
标题,以显示波流的格式和参数(例如
request.ContentType=“audio/mpeg3”
)。对于
audio/wav
,参数是必需的(例如
request.ContentType=“audio/wav;encoding=ms-adpcm;bits=32;rate=16k;endian=little”
)。。此外,它接受单声道而不是立体声。@Jimi感谢您的评论!设置传输编码似乎会扰乱运行时。它抛出一个异常消息:必须通过SendChunked属性设置Chunked编码。我认为SendChunked属性是使用HTTPRequest类实现它的一种方法。我尝试了您的建议。总是一个例外@JimiYes,你说得对,HttpWebRequest希望标题设置为
request.SendChunked=true你已经有了。你把ContentType设置好了吗?400异常表示无效的正文或无效的ContentType。因此,ContentType不符合预期,或者音频格式不受支持。难道你不能读一下回复文本,看看里面有什么吗?有趣的是,把音频保存到一个文件中是有效的。我真的不知道有什么问题。
  private string ProcessSpeechStream(Stream stream)
        {

            var ms = new MemoryStream();
            stream.CopyTo(ms);
            var arr = ms.ToArray();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.wit.ai/speech");
            request.SendChunked = true;
            request.Method = "POST";
            request.Headers["Authorization"] = "Bearer " + APIToken;
            request.ContentType = "audio/raw;encoding=signed-integer;bits=16;rate=44100;endian=little";
            request.ContentLength = arr.Length;
            var st = request.GetRequestStream();
            st.Write(arr, 0, arr.Length);
            st.Close();
            // Process the wit.ai response
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode == HttpStatusCode.OK)
                {
                    StreamReader response_stream = new StreamReader(response.GetResponseStream());
                    return response_stream.ReadToEnd();
                }

            }
            catch (Exception ex)
            {
                // use your own exception handling class
                // Logger.AILogger.Log("Error: " + ex.Message, ex);
                return string.Empty;
            }
        }