О метке динамика, как я могу отображать метки динамика в Android - PullRequest
0 голосов
/ 03 марта 2019

Пожалуйста, помогите мне об этой проблеме. Я почти 1 неделю решаю эту проблему, но я не могу помочь мне, это мой журнал, результат такой же в демоверсии, это мой код в RecognizeOptions

 private RecognizeOptions getRecognizeOptions(InputStream captureStream) {
        return new RecognizeOptions.Builder()
                .timestamps(true)
                .contentType(HttpMediaType.AUDIO_MP3)
                .interimResults(true)
                .smartFormatting(true)
                .inactivityTimeout(2000)
                .speakerLabels(true)
                .audio(captureStream)
                .wordAlternativesThreshold((float) 0.01)
                .wordConfidence(true)
                .model("en-US_BroadbandModel")
                .build();
    }

этомой код отображает говорящего и слово

закрытый класс MicrophoneRecognizeDelegate расширяет BaseRecognizeCallback {

   @Override
     public void onTranscription(SpeechRecognitionResults speechResults) {
     System.out.println(speechResults);

     SpeakerLabelsDiarization.RecoTokens recoTokens = new SpeakerLabelsDiarization.RecoTokens();

      if(speechResults.getSpeakerLabels() !=null) {
        recoTokens.add(speechResults);
        String speaks = "Speaker " + speechResults.getSpeakerLabels().get(0).getSpeaker().toString();
        showMicText(speaks);
        System.out.println(speaks);
      }if(speechResults.getResults() != null &&  !speechResults.getResults().isEmpty()) {
             String text =  speechResults.getResults().get(0).getAlternatives().get(0).getTranscript();
             showMicText1(text);
      }

   }

О SpeakerLabelsDiarization.RecoTokens recoTokens = new SpeakerLabelsDiarization.RecoTokens ();это код, который я получаю этот код в примере WatBot в github

package com.example.ezminute.activities;

import com.ibm.watson.developer_cloud.speech_to_text.v1.model.RecognizeOptions;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeakerLabelsResult;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechRecognitionAlternative;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechRecognitionResult;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechRecognitionResults;
import com.ibm.watson.developer_cloud.speech_to_text.v1.model.SpeechTimestamp;
import com.ibm.watson.developer_cloud.speech_to_text.v1.websocket.BaseRecognizeCallback;
import com.ibm.watson.developer_cloud.util.GsonSingleton;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.CountDownLatch;

public class SpeakerLabelsDiarization {
    public static class RecoToken {
        private Double startTime;
        private Double endTime;
        private Long speaker;
        private String word;
        private Boolean spLabelIsFinal;


        /**
         * Instantiates a new reco token.
         *
         * @param speechTimestamp the speech timestamp
         */
        RecoToken(SpeechTimestamp speechTimestamp) {
            startTime = speechTimestamp.getStartTime();
            endTime = speechTimestamp.getEndTime();
            word = speechTimestamp.getWord();
        }

        /**
         * Instantiates a new reco token.
         *
         * @param speakerLabel the speaker label
         */
        RecoToken(SpeakerLabelsResult speakerLabel) {
            startTime = Double.valueOf(speakerLabel.getFrom());
            endTime = Double.valueOf(speakerLabel.getTo());
            speaker = speakerLabel.getSpeaker();
        }

        /**
         * Update from.
         *
         * @param speechTimestamp the speech timestamp
         */
        public void updateFrom(SpeechTimestamp speechTimestamp) {
            word = speechTimestamp.getWord();
        }

        /**
         * Update from.
         *
         * @param speakerLabel the speaker label
         */
        public void updateFrom(SpeakerLabelsResult speakerLabel) {
            speaker = speakerLabel.getSpeaker();
        }
    }

    /**
     * The Class Utterance.
     */
    public static class Utterance {
        private Integer speaker;
        private String transcript;

        /**
         * Instantiates a new utterance.
         *
         * @param speaker    the speaker
         * @param transcript the transcript
         */
        public Utterance(final Integer speaker, final String transcript) {
            this.speaker = speaker;
            this.transcript = transcript;
        }
    }

    /**
     * The Class RecoTokens.
     */
    public static class RecoTokens {

        private Map<Double, RecoToken> recoTokenMap;

        /**
         * Instantiates a new reco tokens.
         */
        public RecoTokens() {
            recoTokenMap = new LinkedHashMap<Double, RecoToken>();
        }

        /**
         * Adds the.
         *
         * @param speechResults the speech results
         */
        public void add(SpeechRecognitionResults speechResults) {
            if (speechResults.getResults() != null)
                for (int i = 0; i < speechResults.getResults().size(); i++) {
                    SpeechRecognitionResult transcript = speechResults.getResults().get(i);
                    if (transcript.isFinalResults()) {
                        SpeechRecognitionAlternative speechAlternative = transcript.getAlternatives().get(0);

                        for (int ts = 0; ts < speechAlternative.getTimestamps().size(); ts++) {
                            SpeechTimestamp speechTimestamp = speechAlternative.getTimestamps().get(ts);
                            add(speechTimestamp);
                        }
                    }
                }
            if (speechResults.getSpeakerLabels() != null)
            {
                for (int i = 0; i < speechResults.getSpeakerLabels().size(); i++) {
                    add(speechResults.getSpeakerLabels().get(i));
                }
            }

        }

        /**
         * Adds the.
         *
         * @param speechTimestamp the speech timestamp
         */
        public void add(SpeechTimestamp speechTimestamp) {
            RecoToken recoToken = recoTokenMap.get(speechTimestamp.getStartTime());
            if (recoToken == null) {
                recoToken = new RecoToken(speechTimestamp);
                recoTokenMap.put(speechTimestamp.getStartTime(), recoToken);
            } else {
                recoToken.updateFrom(speechTimestamp);
            }
        }

        /**
         * Adds the.
         *
         * @param speakerLabel the speaker label
         */
        public void add(SpeakerLabelsResult speakerLabel) {
            RecoToken recoToken = recoTokenMap.get(speakerLabel.getFrom());
            if (recoToken == null) {
                recoToken = new RecoToken(speakerLabel);
                recoTokenMap.put(Double.valueOf(speakerLabel.getFrom()), recoToken);
            } else {
                recoToken.updateFrom(speakerLabel);
            }

            if (speakerLabel.isFinalResults()) {
                markTokensBeforeAsFinal(speakerLabel.getFrom());
                report();
                cleanFinal();
            }
        }

        private void markTokensBeforeAsFinal(Float from) {
            Map<Double, RecoToken> recoTokenMap = new LinkedHashMap<>();

            for (RecoToken rt : recoTokenMap.values()) {
                if (rt.startTime <= from)
                {
                    rt.spLabelIsFinal = true;
                }
            }
        }

        /**
         * Report.
         */
        public void report() {
            List<Utterance> uttterances = new ArrayList<Utterance>();
            Utterance currentUtterance = new Utterance(0, "");

            for (RecoToken rt : recoTokenMap.values()) {
                if (currentUtterance.speaker != Math.toIntExact(rt.speaker)) {
                    uttterances.add(currentUtterance);
                    currentUtterance = new Utterance(Math.toIntExact(rt.speaker), "");
                }
                currentUtterance.transcript = String.format("%s%s ", currentUtterance.transcript, rt.word);
            }
            uttterances.add(currentUtterance);

            String result = GsonSingleton.getGson().toJson(uttterances);
            System.out.println(result);
        }

        private void cleanFinal() {
            Set<Map.Entry<Double, RecoToken>> set = recoTokenMap.entrySet();
            for (Map.Entry<Double, RecoToken> e : set) {
                if (e.getValue().spLabelIsFinal) {
                    recoTokenMap.remove(e.getKey());
                }
            }
        }

    }


    private static CountDownLatch lock = new CountDownLatch(1);
}

это мой результат

{
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:   "speaker_labels": [
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:     {
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:       "confidence": 0.605,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:       "final": false,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:       "from": 2.43,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:       "speaker": 0,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:       "to": 2.93
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:     },
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:     {
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:       "confidence": 0.667,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:       "final": false,
2019-03-03 23:21:58.335 27985-28793/com.example.ezminute I/System.out:       "from": 3.3,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:       "speaker": 1,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:       "to": 3.82
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:     },
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:     {
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:       "confidence": 0.579,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:       "final": false,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:       "from": 4.15,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:       "speaker": 0,
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:       "to": 4.69
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:     }
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out:   ]
2019-03-03 23:21:58.336 27985-28793/com.example.ezminute I/System.out: }
2019-03-03 23:21:58.340 4354-4354/? D/io_stats: !@ 179,0 r 137002 5177089 w 48914 1018780 d 7995 317604 f 12673 12674 iot 105310 98590 th 51200 0 0 pt 0 inp 0 0 3948.151
2019-03-03 23:21:58.345 27985-28793/com.example.ezminute I/System.out: {
2019-03-03 23:21:58.345 27985-28793/com.example.ezminute I/System.out:   "speaker_labels": [
2019-03-03 23:21:58.345 27985-28793/com.example.ezminute I/System.out:     {
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out:       "confidence": 0.579,
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out:       "final": true,
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out:       "from": 4.15,
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out:       "speaker": 0,
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out:       "to": 4.69
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out:     }
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out:   ]
2019-03-03 23:21:58.346 27985-28793/com.example.ezminute I/System.out: }

это результат в демо

{
 "speaker_labels": [
  {
   "from": 2.43,
   "to": 2.93,
   "speaker": 0,
   "confidence": 0.605,
   "final": false
  },
  {
   "from": 3.3,
   "to": 3.82,
   "speaker": 1,
   "confidence": 0.667,
   "final": false
  },
  {
   "from": 4.15,
   "to": 4.69,
   "speaker": 0,
   "confidence": 0.579,
   "final": false
  }
 ]
}
{
 "speaker_labels": [
  {
   "from": 4.15,
   "to": 4.69,
   "speaker": 0,
   "confidence": 0.579,
   "final": true
  }
 ]
}

это мой вывод

Speaker0: hello hi hello

это вывод в демке

Speaker 0:
    Hello. 
Speaker 1:
    Hi. 
Speaker 0:
    Hello. 

пожалуйста, помогите мне, пожалуйста, я прошу всех вас, пожалуйста, помогите мне, пожалуйста :( :(:(Я не знаю, что делать, пожалуйста, я делаю все возможное, но этого недостаточно, мне нужна вся помощь, пожалуйста, помогите мне :( :(: (

1 Ответ

0 голосов
/ 04 марта 2019

С такой маленькой звуковой дорожкой я предполагаю, что onTranscription вызывается только один раз.

Я думаю, что вы намерены использовать SpeakerLabelsDiarization.RecoTokens, чтобы определить, кто говорит, что и когда, но вы не используете его.Все, что вы делаете, это создаете экземпляр

SpeakerLabelsDiarization.RecoTokens recoTokens = new SpeakerLabelsDiarization.RecoTokens();

и добавляете в ответ STT

recoTokens.add(speechResults);

, но затем onTranscription заканчивается, а recoTokens выходит за пределы области действия и исчезает.Делать все упражнение бессмысленным.

Ваш вывод получен из

String speaks = "Speaker " + speechResults.getSpeakerLabels().get(0).getSpeaker().toString();

, который напрямую связан с ответом, полученным от службы STT.get(0) будет получать и позволять вам печатать 0-й (1-й) элемент в массиве.Поскольку у вас нет итерации, это все, что вы будете печатать.

Если вы хотите увидеть все метки динамиков, вам понадобится цикл for для прохождения всех меток динамиков в ответе.

Транскрипт, который вы выводите, является полным транскриптом, ине разбивается на ярлыки динамиков или время.

String text = speechResults.getResults().get(0).getAlternatives().get(0).getTranscript();

Я думаю, вы хотели бы использовать настроенную вами recoTokens, которая при кратком осмотре использовала бы

recoTokens.uttterances()
...