C# 如何将语音流传输到wit.ai语音端点
我很难从wit得到好的回应。ai的演讲结束点。响应总是400。我似乎是在遵循规则,但有点不对劲 任何帮助都将不胜感激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);
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;
}
}