Android语音识别和Unity:跳过帧

时间:2016-06-21 10:09:55

标签: android unity3d speech-recognition

我构建了一个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这是不可能的,我找不到常见的问题。

感谢大家

0 个答案:

没有答案