【问题标题】:How to stream speech to wit.ai speech end point如何将语音流式传输到 wit.ai 语音端点
【发布时间】:2018-01-19 18:28:19
【问题描述】:

我无法从 wit.ai 的语音端点获得良好的响应。响应总是 400。我似乎在关注 docs,但出了点问题。

任何帮助将不胜感激。

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;
            }
  }

【问题讨论】:

  • 您应该将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 属性设置块编码。我认为 SendChunked 属性是使用 HTTPRequest 类的方法。
  • 我尝试了你的建议。总是例外...@Jimi
  • 是的,你是对的,HttpWebRequest 想要用你已经拥有的request.SendChunked = true; 设置标题。您是否设置了 ContentType? 400 异常表示无效的 Body 或无效的 ContentType。因此,ContentType 与预期不符或不支持音频格式。您不能阅读响应文本并查看其中的内容吗?
  • 有趣的是,将音频保存到文件是可行的。老实说,我不知道有什么问题。

标签: c# httpwebrequest speech wit.ai


【解决方案1】:

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

  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;
            }
        }

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多