所以我使用Google Speech API在程序中出错。错误是“并非所有路径都返回值”,如标题所示。 这是代码(2个peices)(相同的错误)
public static SpeechInputResult ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.google.com/speech-api/v1/recognize?xjerr=1" + "&client=" + client + "&lang=" + language + "&maxresults=" + maxresults + "&pfilter=0");
FileStream fStream = new FileStream(FlacFileName, FileMode.Open, FileAccess.Read);
request.Proxy = null;
request.Timeout = 60000;
request.KeepAlive = true;
request.Method = "POST";
request.ContentType = "audio/x-flac; rate=8000";
//bitrate must = .flac file
request.UserAgent = client;
FileInfo fInfo = new FileInfo(FlacFileName);
long numbytes = fInfo.Length;
byte[] data = null;
using (FileStream fstream = new FileStream(FlacFileName, FileMode.Open, FileAccess.Read))
data = new byte[fstream.Length];
fStream.Read(data, 0, Convert.ToInt32(fStream.Length));
fStream.Close();
using (Stream wrStream = request.GetRequestStream())
{
wrStream.Write(data, 0, data.Length);
}
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
dynamic resp = response.GetResponseStream();
if (resp != null)
{
StreamReader sr = new StreamReader(resp);
MessageBox.Show(sr.ReadToEnd());
resp.Close();
resp.Dispose();
}
}
catch (System.Exception ee)
{
MessageBox.Show(ee.Message);
}
}
}
}
和第二篇:
public class Hypothesis
{
public string utterance;
public double confidence = -1.0d;//-1 = No Value
public override string ToString()
{
return "'" +utterance + "'" + ((confidence == -1) ? "" : "@" + confidence);
}
public List<Hypothesis> hypotheses = new List<Hypothesis>();
public Hypothesis getBestHypothesis()
{
if (hypotheses.Count() <=0)
return null;
Hypothesis H = hypotheses[0];
foreach (Hypothesis h in hypotheses)
{
if (h.confidence>=H.confidence)
{
H = h;
}
return H;
}
}
两个代码都有相同的错误,只有当某个变量名与另一个变量同名时才会出现(确切地说是FlacFileName)。如果你们能告诉我为什么会这样,那将是非常棒的谢谢!
答案 0 :(得分:2)
您的方法签名
public static SpeechInputResult ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1)
声明您将返回SpeechInputResult
,但您没有return
声明。
您应该将签名更改为void
或实际返回值。
在第二个实例中,在for循环之后需要一个return语句。
答案 1 :(得分:2)
与所有提到的人一样,在第一个方法的末尾添加一个return
语句。只需return null;
或适合您的情况。实际上,在该方法中根本没有其他return
语句,因此它不是“并非所有路径返回值”的情况,例如第二个......您可能只想更改{{1}中的签名} SpeechInputResult
。
在第二种方法中,似乎就像你已经覆盖了你的基础,因为:
void
为空且null
hypotheses
不是空的话,你将返回hypotheses
最大的“信心”但是编译器不够聪明才能看到它。尝试将return null;
移至最后。如果列表中没有元素并且foreach
循环没有运行,那么唯一可以实现它的方法就是。
public Hypothesis getBestHypothesis()
{
if (hypotheses.Any())
{
Hypothesis H = hypotheses[0];
foreach (Hypothesis h in hypotheses)
{
if (h.confidence >= H.confidence)
{
H = h;
}
return H;
}
}
return null;
}
此外,整个第二种方法可以减少(在LINQ的帮助下):
return hypotheses.OrderByDescending(x => x.confidence).FirstOrDefault();
答案 2 :(得分:2)
我发现在你的代码中你必须返回SpeechInputResult
,但是你没有使用return语句。
您最好在代码中使用return SpeechInputResult
如果您不愿意向其返回任何内容,则另外明智地将您的功能设置如下。
public static void ProcessFlacFile(string FlacFileName, int BIT_RATE = DEFAULT_BIT_RATE, string language = DEFAULT_LANGUAGE, uint maxresults = 1)
如果您希望在没有错误的情况下使用void,则可以使用void而不是类SpeechInputResult
。
在第二段代码中,您只实例化了代码。即声明并直接使用它 您必须为您创建的对象分配一些内容,以便您可以在foreach中执行操作。
在这种情况下hypotheses
里面没有任何东西。
你也在foreach循环中编写了return语句,因为焦点永远不会进入foreach循环。
首先,您为hypotheses
分配一些内容,使其具有值,然后执行操作。
答案 3 :(得分:1)
第一个代码块没有任何return语句。在第二个代码块中,在for循环之外放置一个伪返回语句。
答案 4 :(得分:1)
在你的第一个方法中,你在签名中声明,它将返回类型SpeechInputResult
的实例,而你不是从正文中返回它。
而且,在第二种方法中,你是从foreach
循环内部返回的,但是如果你的hypotheses
列表没有任何元素呢?您还应该从foreach
循环之外返回默认值,否则如果不是您预期的行为,则应该抛出异常。
答案 5 :(得分:1)
ProcessFlacFile
方法应该在所有情况下返回类型SpeechInputResult
对象。
你可以在try和catch后返回对象
try
{
}
catch
{
}
return SpeechInputResultObj
或
在SpeechInputResult
和try
语句
catch
个对象
try
{
....
return SpeechInputResultObj;
}
catch
{
....
return SpeechInputResultObj;
}