我构建了一个Android .aar文件来处理语音识别工作流程,以便在Unity的应用程序中使用。
Android的
问题是:SpeechRecognition的方法想要在UI Thread中调用。但是这样做,我收到消息“在UI线程中工作太多:跳过60帧”。我不能在另一个线程中调用SpeechRecognition,因为我会收到消息“SpeechRecognition应该在UI线程中运行”。
这是典型的工作流程,与互联网相同:
CreateSpeechListener()
SpeechRecognizer rec = SpeechRecognizer.CreateSpeechRecognizer();
rec.CreateIntent, rec.AssignSpeechListener, rec.StartListening
//
OnResult():
GetWords
ProcessWords
rec.CreateIntent, rec.StartListening
//
OnError()
if(!NETWORK_ERRROR)
print(error), rec.CreateIntent, rec.StartListening
//
StopRecognizer()
rec.StopListening.Cancel.Destroy
我用“伪代码”写道,因为我说的是可以找到的那个,但如果有必要,我会把整个代码。
从Android到Unity
仍然,在Unity的Android应用程序中,我曾经收到消息“SpeechRecognition应该在UI线程中运行”;所以,我必须创建2个Runnables,StartRec和StopRec,然后在Unity的应用程序Activity runInUiThread()
中运行它们。没有这样做,Unity就抱怨了。
public class StartRecognition implements Runnable {
// Class which implmentes the workflow written above
private RecognizerFactory r;
public StartRecognition(RecognizerFactory rec){
this.r = rec;
}
public void run(){
r.createRecognizer();
r.listen();
return;
}
}
public class StopRecognition implements Runnable {
private RecognizerFactory r;
public StopRecognition(RecognizerFactory rec){
this.r = rec;
}
public void run(){
r.stopRecognizer();
return;
}
}
Unity的
在Unity中,我创建 Recognizerfactory rec和2 Runnables,start_rec和stop_rec,将rec传递给两者。最后我调用RunInUiThread():
if(*some input*)
UnityActivity.Call("runInUiThread", start_rec);
if(*other input*)
UnityActivity.Call("runInUiThread", stop_rec);
问题
我希望我很清楚!问题是:这是一个正确的工作流程吗?这是常见问题吗? 因为对于跳过的帧,一个明显的解决方案是使用其他线程但使用Speechrecognition这是不可能的,我找不到常见的问题。
感谢大家