OpenScores.java

package com.shengzhiai.yugu.model;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;

import java.util.Collections;
import java.util.List;

/**
 * Scores of open questions ({@code coreType=open}): content, language use and delivery, with the
 * transcript, feedback and the task audit.
 */
@JsonIgnoreProperties(ignoreUnknown = true)
public class OpenScores {
    @JsonProperty("overall")
    private Double overall;
    @JsonProperty("taskType")
    private String taskType;
    @JsonProperty("language")
    private String language;
    @JsonProperty("duration_s")
    private Double durationSeconds;
    @JsonProperty("transcript")
    private String transcript;
    @JsonProperty("hasSpeech")
    private Boolean hasSpeech;
    @JsonProperty("content")
    private Content content;
    @JsonProperty("languageUse")
    private LanguageUse languageUse;
    @JsonProperty("delivery")
    private Delivery delivery;
    @JsonProperty("feedback")
    private Feedback feedback;
    @JsonProperty("openTaskAudit")
    private TaskAudit openTaskAudit;
    @JsonProperty("audioQuality")
    private AudioQuality audioQuality;
    @JsonProperty("aggregation")
    private JsonNode aggregation;
    @JsonProperty("rubricVersion")
    private String rubricVersion;
    @JsonProperty("scoringSource")
    private String scoringSource;

    /** @return overall score */
    public Double getOverall() {
        return overall;
    }

    /** @return picture, situational or free */
    public String getTaskType() {
        return taskType;
    }

    /** @return language of the answer */
    public String getLanguage() {
        return language;
    }

    /** @return duration in seconds */
    public Double getDurationSeconds() {
        return durationSeconds;
    }

    /** @return recognised answer */
    public String getTranscript() {
        return transcript;
    }

    /** @return whether speech was detected */
    public Boolean getHasSpeech() {
        return hasSpeech;
    }

    /** @return content scores, may be null */
    public Content getContent() {
        return content;
    }

    /** @return language use scores, may be null */
    public LanguageUse getLanguageUse() {
        return languageUse;
    }

    /** @return delivery scores, may be null */
    public Delivery getDelivery() {
        return delivery;
    }

    /** @return feedback, may be null */
    public Feedback getFeedback() {
        return feedback;
    }

    /** @return prompt echo, low content and off topic audit; caps apply when flagged, may be null */
    public TaskAudit getOpenTaskAudit() {
        return openTaskAudit;
    }

    /** @return audio quality estimate, may be null */
    public AudioQuality getAudioQuality() {
        return audioQuality;
    }

    /** @return how the overall score was aggregated and capped, may be null */
    public JsonNode getAggregation() {
        return aggregation;
    }

    /** @return rubric version */
    public String getRubricVersion() {
        return rubricVersion;
    }

    /** @return scoring components used */
    public String getScoringSource() {
        return scoringSource;
    }

    /** Content dimension. */
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Content {
        @JsonProperty("overall")
        private Double overall;
        @JsonProperty("relevance")
        private Double relevance;
        @JsonProperty("coherence")
        private Double coherence;
        @JsonProperty("task_achievement")
        private Double taskAchievement;

        /** @return content score */
        public Double getOverall() {
            return overall;
        }

        /** @return relevance to the prompt */
        public Double getRelevance() {
            return relevance;
        }

        /** @return coherence */
        public Double getCoherence() {
            return coherence;
        }

        /** @return task achievement */
        public Double getTaskAchievement() {
            return taskAchievement;
        }
    }

    /** Language use dimension. */
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class LanguageUse {
        @JsonProperty("overall")
        private Double overall;
        @JsonProperty("grammar")
        private Double grammar;
        @JsonProperty("vocabulary")
        private Double vocabulary;

        /** @return language use score */
        public Double getOverall() {
            return overall;
        }

        /** @return grammar */
        public Double getGrammar() {
            return grammar;
        }

        /** @return vocabulary */
        public Double getVocabulary() {
            return vocabulary;
        }
    }

    /** Delivery dimension. */
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Delivery {
        @JsonProperty("overall")
        private Double overall;
        @JsonProperty("fluency")
        private Double fluency;
        @JsonProperty("pronunciation")
        private Double pronunciation;
        @JsonProperty("speech_rate")
        private Double speechRate;
        @JsonProperty("speech_rate_label")
        private String speechRateLabel;
        @JsonProperty("n_pauses")
        private Integer pauseCount;
        @JsonProperty("longest_pause_s")
        private Double longestPauseSeconds;
        @JsonProperty("voiced_s")
        private Double voicedSeconds;

        /** @return delivery score */
        public Double getOverall() {
            return overall;
        }

        /** @return fluency */
        public Double getFluency() {
            return fluency;
        }

        /** @return pronunciation */
        public Double getPronunciation() {
            return pronunciation;
        }

        /** @return speech rate in units per second */
        public Double getSpeechRate() {
            return speechRate;
        }

        /** @return speech rate for display, for example {@code 233.8 字/分} */
        public String getSpeechRateLabel() {
            return speechRateLabel;
        }

        /** @return number of long pauses */
        public Integer getPauseCount() {
            return pauseCount;
        }

        /** @return longest pause in seconds */
        public Double getLongestPauseSeconds() {
            return longestPauseSeconds;
        }

        /** @return voiced time in seconds */
        public Double getVoicedSeconds() {
            return voicedSeconds;
        }
    }

    /** Textual feedback. */
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class Feedback {
        @JsonProperty("strengths")
        private String strengths;
        @JsonProperty("weaknesses")
        private String weaknesses;
        @JsonProperty("suggestions")
        private List<String> suggestions;

        /** @return strengths */
        public String getStrengths() {
            return strengths;
        }

        /** @return weaknesses */
        public String getWeaknesses() {
            return weaknesses;
        }

        /** @return suggestions, never null */
        public List<String> getSuggestions() {
            return suggestions == null ? Collections.emptyList() : suggestions;
        }
    }

    /** Task audit of open questions. */
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class TaskAudit {
        @JsonProperty("promptEcho")
        private Boolean promptEcho;
        @JsonProperty("lowContent")
        private Boolean lowContent;
        @JsonProperty("offTopic")
        private Boolean offTopic;
        @JsonProperty("lowYield")
        private Boolean lowYield;
        @JsonProperty("capApplied")
        private Boolean capApplied;
        @JsonProperty("answerUnits")
        private Integer answerUnits;

        /** @return the answer repeated the prompt; overall capped at 60 */
        public Boolean getPromptEcho() {
            return promptEcho;
        }

        /** @return the answer had little content; overall capped at 70 */
        public Boolean getLowContent() {
            return lowContent;
        }

        /** @return the answer was off topic */
        public Boolean getOffTopic() {
            return offTopic;
        }

        /** @return the answer was too short */
        public Boolean getLowYield() {
            return lowYield;
        }

        /** @return whether a cap was applied to the overall score */
        public Boolean getCapApplied() {
            return capApplied;
        }

        /** @return counted answer units */
        public Integer getAnswerUnits() {
            return answerUnits;
        }
    }

    /** Audio quality estimate. */
    @JsonIgnoreProperties(ignoreUnknown = true)
    public static class AudioQuality {
        @JsonProperty("mos")
        private Double mos;
        @JsonProperty("quality")
        private Double quality;

        /** @return mean opinion score estimate, 1 to 5 */
        public Double getMos() {
            return mos;
        }

        /** @return quality score */
        public Double getQuality() {
            return quality;
        }
    }
}