Помощники и разные докладчики - PullRequest
0 голосов
/ 04 февраля 2019

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

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

И 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, и этот список возвращается службой помощника, но я не уверен, как заставить его также учитывать мои сущности или как заставить его реагировать соответственно, когда STT распознает разных говорящих.

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

Ответы [ 2 ]

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

Пожалуйста, установите SpeakerLabels на True

_service.SpeakerLabels = true;
0 голосов
/ 04 февраля 2019

У меня был точно такой же вопрос о работе с сообщениями Ассистента, поэтому я посмотрел на метод 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 в свои блоки кода, чтобы увидеть, вызываются они или нет.

...