Runnable.Run / StartCoroutine вызывает сервисы Watson от Unity - PullRequest
0 голосов
/ 14 февраля 2019

В моем сценарии 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;
}

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Вам не нужно совершать какие-либо сервисные вызовы из сопрограммы.Только аутентификация с использованием 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);
}

. Примеры предназначены только для того, чтобы показать, как вызвать сервисный вызов.Единственная причина, по которой код вызывается из сопрограммы, заключается в том, что мы можем дождаться ответа одного вызова службы, прежде чем запускать другой вызов службы (т. Е. Поэтому мы не пытаемся обновить или удалить рабочее пространство до его создания).

0 голосов
/ 14 февраля 2019

Это не проблема.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

И сопрограмму можно вызывать из любого игрового объекта, если он активен.

...