【问题标题】:Runnable.Run / StartCoroutine calles to Watson services from UnityRunnable.Run / StartCoroutine 从 Unity 调用 Watson 服务
【发布时间】:2019-07-08 05:00:39
【问题描述】:

在我的ExampleStreaming.cs 脚本中,一旦用户话语被识别为final,我将它发送到Watson Assistant 服务和Tone Analyzer。因为我将每个服务的脚本按原样分开,所以我必须在每个脚本中进行调用才能访问其他服务。您可以在下面看到我对Tone Analyzer 的调用(.SendToneAnalysis 方法):

private void OnRecognize(SpeechRecognitionEvent result, Dictionary<string, object> customData)
{
    blah blah blah . . .

    /// Only send the recognized speech utterance to the
    /// Assistant once we know the user has stopped talking.
    if (res.final)
    {
        string _conversationString = alt.transcript;
        Runnable.Run( StopRecording(1f) ); // Stop the microphone from listening.

    /// Message.
    Dictionary<string, object> input = new Dictionary<string, object>
    {
        ["text"] = _conversationString
    };
    MessageRequest messageRequest = new MessageRequest()
    {
        Input = input,
        Context = _Context
    };

    _exampleAssistantV1_script.SendMessageAssistant(messageRequest);
    _exampleToneAnalyzer.SendToneAnalysis(_conversationString);

    . . .

在我的ExampleToneAnalyzer.cs 脚本中,我对事件处理方法进行了简单调用,这些方法旨在联系服务并处理成功和失败:

public void SendToneAnalysis(string conversationString)
{
    _service.GetToneAnalyze(OnGetToneAnalyze, OnFail, conversationString);
}

这些调用通常使用 StartCoroutines 进行,特别是在 Watson Unity SDK 中,有一个专门的 Runnable.Run,它本质上是一个帮助程序类,用于运行协同例程,而不必从 MonoBehavior 继承。

我的问题是我对服务的简单方法调用在某些情况下是否会出现问题,或者可能只是错误或糟糕的编程,或者使用该方法而不是类似以下的方法是否完全可以:

public void SendToneAnalysis(string conversationString)
{
    Runnable.Run( SendAssistantToneAnalysis(conversationString) );
}

private IEnumerator SendAssistantToneAnalysis(string conversationString)
{
    if ( !_service.GetToneAnalyze(OnGetToneAnalyze, OnFail, conversationString) )
    {
        Log.Debug("ExampleToneAnalyzer.SendAssistantToneAnalysis()", "Failed to analyze!");
    }

    while (!_UserUtteranceToneTested)
        yield return null;
}

【问题讨论】:

    标签: unity3d ibm-watson coroutine


    【解决方案1】:

    没问题。 Runnable.Run() 最终调用 StartCoroutine() 如下。

        public Routine(IEnumerator a_enumerator)
        {
            _enumerator = a_enumerator;
            Runnable.Instance.StartCoroutine(this);
            Stop = false;
            ID = Runnable.Instance._nextRoutineId++;
    
            Runnable.Instance._routines[ID] = this;
        #if ENABLE_RUNNABLE_DEBUGGING
            Log.Debug("Runnable.Routine()", "Coroutine {0} started.", ID ); 
        #endif
        }
    

    请参考https://github.com/watson-developer-cloud/unity-sdk/blob/master/Scripts/Utilities/Runnable.cs

    并且可以从任何游戏对象调用协程,如果它处于活动状态。

    【讨论】:

    • 谢谢 :) 如果我使用一个内部只有_service.GetToneAnalyze(OnGetToneAnalyze, OnFail, conversationString) 的简单方法调用,你的意思是“没问题”吗?那么,我不需要使用Runnable 这样做吗?还是您的意思是我必须使用Runnable 进行此类呼叫?
    • 如果你需要等待类似“_UserUtteranceToneTested”的东西,你需要使用Runnable,但如果不是,你不需要使用它。
    • 另外,如果你说的_service.GetToneAnalyze(OnGetToneAnalyze, OnFail, conversationString)是这个意思(watson-developer-cloud.github.io/unity-sdk/docs/v2.0.0/html/…),你不需要使用Runnable或协程。
    【解决方案2】:

    您不需要在协程中进行任何服务调用。只有使用iamApikey 的身份验证应该使用协程来完成

    IEnumerator TokenExample()
    {
        //  Create IAM token options and supply the apikey. IamUrl is the URL used to get the 
        //  authorization token using the IamApiKey. It defaults to https://iam.bluemix.net/identity/token
        TokenOptions iamTokenOptions = new TokenOptions()
        {
            IamApiKey = "<iam-api-key>",
            IamUrl = "<iam-url>"
        };
    
        //  Create credentials using the IAM token options
        _credentials = new Credentials(iamTokenOptions, "<service-url>");
        while (!_credentials.HasIamTokenData())
            yield return null;
    
        _assistant = new Assistant(_credentials);
        _assistant.VersionDate = "2018-02-16";
        _assistant.ListWorkspaces(OnListWorkspaces, OnFail);
    }
    

    这些示例仅用于展示如何调用服务调用。从协程调用代码的唯一原因是我们可以在运行另一个服务调用之前等待一个服务调用的响应(即,在创建工作空间之前我们不会尝试更新或删除工作空间)。

    【讨论】:

      猜你喜欢
      • 2018-06-20
      • 2017-08-23
      • 2016-08-19
      • 1970-01-01
      • 2017-05-14
      • 2020-06-20
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多