Субъекты-помощники и разные выступающие

Можно различать говорящих / пользователей с помощью Watson-Unity-SDK, поскольку он, кажется, может возвращать массив, который определяет, какие слова были произнесены какими говорящими в многопользовательском обмене, но я не могу понять, как это сделать. выполнить его, особенно в случае, когда я отправляю различные высказывания (произносимые разными людьми) в службу Ассистента, чтобы получить соответствующий ответ.

Фрагменты кода для синтаксического анализа выходных данных / ответов Assistant json, а также OnRecognize и OnRecognizeSpeaker, SpeechRecognitionResult и SpeakerLabelsResult есть, но как мне заставить Watson возвращать это с сервера, когда высказывание распознано и его намерение извлечено?

И OnRecognize, и OnRecognizeSpeaker используются только один раз в свойстве Active, поэтому они оба вызываются, но только OnRecognize выполняет преобразование речи в текст (транскрипция), а OnRecognizeSpeaker никогда не запускается ...

public bool Active
    {
        get
        {
            return _service.IsListening;
        }
        set
        {
            if (value && !_service.IsListening)
            {
                _service.RecognizeModel = (string.IsNullOrEmpty(_recognizeModel) ? "en-US_BroadbandModel" : _recognizeModel);
                _service.DetectSilence = true;
                _service.EnableWordConfidence = true;
                _service.EnableTimestamps = true;
                _service.SilenceThreshold = 0.01f;
                _service.MaxAlternatives = 0;
                _service.EnableInterimResults = true;
                _service.OnError = OnError;
                _service.InactivityTimeout = -1;
                _service.ProfanityFilter = false;
                _service.SmartFormatting = true;
                _service.SpeakerLabels = false;
                _service.WordAlternativesThreshold = null;
                _service.StartListening(OnRecognize, OnRecognizeSpeaker);
            }
            else if (!value && _service.IsListening)
            {
                _service.StopListening();
            }
        }
    }

Обычно вывод Assistant (т.е. его результат) выглядит примерно так:

Response: {"intents":[{"intent":"General_Greetings","confidence":0.9962662220001222}],"entities":[],"input":{"text":"hello eva"},"output":{"generic":[{"response_type":"text","text":"Hey!"}],"text":["Hey!"],"nodes_visited":["node_1_1545671354384"],"log_messages":[]},"context":{"conversation_id":"f922f2f0-0c71-4188-9331-09975f82255a","system":{"initialized":true,"dialog_stack":[{"dialog_node":"root"}],"dialog_turn_counter":1,"dialog_request_counter":1,"_node_output_map":{"node_1_1545671354384":{"0":[0,0,1]}},"branch_exited":true,"branch_exited_reason":"completed"}}}

Я настроил intents и entities, и этот список возвращается службой Assistant, но я не уверен, как заставить его также учитывать мои сущности или как заставить его соответствующим образом реагировать, когда STT распознает разных говорящих.

Я был бы признателен за некоторую помощь, особенно как это сделать с помощью скриптов Unity.


person Community    schedule 04.02.2019    source источник
comment
То, что вы спрашиваете, похоже, относится к речи в текст (STT), а не к Watson Assistant.   -  person data_henrik    schedule 04.02.2019
comment
@data_henrik На самом деле это в основном связано с Ассистентом, поскольку я настроил диалог с намерениями и объектами, и я пытаюсь понять, как я могу заставить службу Ассистента распознавать мои ответы как соответствующие определенной сущности и т. д. Другой вопрос докладчика - это STT, который встроен в мой основной вопрос, но, очевидно, Ассистент полагается на STT для отправки ему текста высказывания.   -  person    schedule 04.02.2019
comment
Итак, у вас есть текст от STT, который сопровождается информацией о докладчике. Затем вы отправляете текст в WA. Результат должен быть возвращен к входной информации (информации о выступающем). Это твой вопрос?   -  person data_henrik    schedule 04.02.2019


Ответы (2)


У меня был точно такой же вопрос о работе с сообщениями Ассистента, поэтому я посмотрел на метод Assistant.OnMessage(), который возвращает строку типа “Response: {0}”, customData[“json”].ToString() плюс результат JSON, который будет примерно таким:

[Assistant.OnMessage()][DEBUG] Response: {“intents”:[{“intent”:”General_Greetings”,”confidence”:1}],”entities”:[],”input”:{“text”:”hello”},”output”:{“text”:[“good evening”],”nodes_visited”: etc...}

Я лично разбираю JSON, чтобы извлечь содержимое из messageResponse.Entities. В приведенном выше примере вы можете видеть, что этот массив пуст, но если вы заполняете его, то именно здесь вам нужно извлечь значения, а затем в своем коде вы можете делать то, что хотите.

Что касается различного распознавания говорящего, то в свойстве Active, код которого вы включили, строка _service.StartListening(OnRecognize, OnRecognizeSpeaker) заботится об обоих, поэтому, возможно, поместите несколько операторов Debug.Log в их блоки кода, чтобы увидеть, вызываются они или нет.

person Community    schedule 04.02.2019
comment
Спасибо, но мой OnRecognizeSpeaker не выполняется, поэтому (я думаю) такая информация не отправляется в службу Ассистента. В идеале я хотел бы знать, как это сделать из Unity. Например, OnRecognize всегда обрабатывает распознавание речи; после чего я отправляю окончательные результаты своему Ассистенту, но как мне использовать OnRecognizeSpeaker? Кроме того, когда окончательные результаты отправляются помощнику, как я могу вызвать срабатывание сущностей и улучшить ответы? Например, когда ввод совпадает с намерением, служба автоматически отвечает. Как мне заставить сущности действовать? - person ; 04.02.2019

Установите SpeakerLabels на True

_service.SpeakerLabels = true;
person taj    schedule 06.02.2019